如何排查系统的性能瓶颈点?

2024-09-02 09:08
文章标签 系统 性能 排查 瓶颈

本文主要是介绍如何排查系统的性能瓶颈点?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“朱小厮的博客”,选择“设为星标”

后台回复"书",获取

后台回复“k8s”,可领取k8s资料

梳理系统的性能瓶颈点这件事应该不是一件简单的事情,需要针对不同设计的系统来进行单独分析。

首先一套完整可用的系统应该是有ui界面的(这里强调的是一套完整的,可用的系统,而并不是指单独的一个中台系统),系统分为了前端模块和后端模块。

这里由于我个人的擅长领域更多是处于后端模块,所以对于系统的瓶颈点梳理我会从后端进行分析。

这里我结合常用的nginx+tomcat+redis+mysql这类常见架构进行分析:

请求入口 所有的请求打入到后台的服务当中,首先需要考虑的一个点就是:

带宽因素:

假设有200m的流量同时请求进入服务器,但是带宽只有1m,这么来算光是接收这批数据量信息也要消耗大约200s的时间。带宽可以理解为在指定时间内从一端请求到另一端的流量总量。而且局域网和广域网的带宽计算其实也是不一样的,

服务器的ulimit

通常我们使用的线上服务器都是centos系列,这里我列举centos7相关的系统配置:ulimit配置 查看服务器允许的最大打开文件数目(linux系统中设计概念为一切皆文件) 通常如果我们的java程序需要增大一些socket的链接数目,可以通过调整ulimit 里面的open参数进行配置。

 [root@izwz9ic9ggky8kub9x1ptuz ~]# ulimit -a | grep open
open files                      (-n) 1000

查看用户的最大进程数目

[root@izwz9ic9ggky8kub9x1ptuz ~]# ulimit -a | grep user
max user processes              (-u) 7284

相关的配置存放在了/etc/security/limits.conf文件中。

系统的一些内核参数配置

如果是在一些压力测试场景中,我们通常会预见到这种报错:

apr_socket_recv: Connection reset by peer (54)

通常这种情况是因为系统内部的一些防范参数设置导致的,需要调整/etc/sysctl.conf 文件中的相关参数:

net.ipv4.tcp_syncookies = 0
#当并发请求数目超过了1000之后,服务器自身可能会认为是收到了syn泛洪攻击,但对于高并发系统,要禁用此设置net.ipv4.tcp_max_syn_backlog
#参数决定了SYN_RECV状态队列的数量,一般默认值为512或者1024,即超过这个数量,系统将不再接受新的TCP连接请求,一定程度上可以防止系统资源耗尽。可根据情况增加该值以接受更多的连接请求。net.ipv4.tcp_tw_recycle
#参数决定是否加速TIME_WAIT的sockets的回收,默认为0。net.ipv4.tcp_tw_reuse
#参数决定是否可将TIME_WAIT状态的sockets用于新的TCP连接,默认为0。net.ipv4.tcp_max_tw_buckets
#参数决定TIME_WAIT状态的sockets总数量,可根据连接数和系统资源需要进行设置。

对于防范参数还可以如下修改查看:

cd /proc/sys/net/ipv4
echo "0" > tcp_syncookie

通常企业中使用的都是nginx进行接收请求,然后进行负载均衡转发。在nginx层里面会有几个核心参数配置:最大连接数,最大并发访问数

#指定同一个ip的每次请求数量都限制为10次
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 10

Tomcat部分分析

Tomcat支持三种接收请求的处理方式:BIO、NIO、APR 。

1、Bio方式,阻塞式I/O操作即使用的是传统Java I/O操作,Tomcat7以下版本默认情况下是以bio模式运行的,由于每个请求都要创建一个线程来处理,线程开销较大,不能处理高并发的场景,在三种模式中性能也最低

2、Nio方式,是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包),是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,它拥有比传统I/O操作(bio)更好的并发运行性能。tomcat 8版本及以上默认nio模式

3、apr模式,简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能, 也是Tomcat运行高并发应用的首选模式。启用这种模式稍微麻烦一些,需要安装一些依赖库, 而apr的本质就是使用jni技术调用操作系统底层的IO接口,所以需要提前安装所需要的依赖,首先是需要安装openssl和apr

tomcat连接参数调整

在tomcat中有这么一段经典的配置参数:

<Connector port="80" maxHttpHeaderSize="8192"maxThreads="4000" minSpareThreads="1000" maxSpareThreads="2000"enableLookups="false" redirectPort="8443" acceptCount="2000"connectionTimeout="20000" disableUploadTimeout="true" /

maxThreads表示tomcat最多可以创建多少个线程来处理请求。

minSpareThread表示tomcat一开始启动的时候会创建多少个线程,即使是闲着也会创建。

maxSpareThread表示tomcat创建的最大闲置线程数目。一旦tomcat创建的线程数目达到这个瓶颈,那么就需要进行线程的回收了。

connectionTimeout表示连接的超时时长。

假设我们同时有1000个请求并发访问,但是一台tomcat的maxThreads只设置为了500,那么此时就会出现请求拥塞的情况,也就是瓶颈点之一。

Redis部分性能瓶颈分析

一些大key的查询,导致网络出现拥塞情况

例如说往一个list集合中存储了50m的数据,一旦发生list全量查询,同时又有其他指令在进行访问的时候,就容易会导致网络堵塞。因为redis的设计为单线程处理请求,所以其他指令发送到redis服务端的时候,都需要等待redis将之前的任务处理完毕之后才能继续执行。

线上环境出现了一些”违规操作“

比较常见的违规操作:批量执行keys指令

在redis处于高qps的状态下,随意一个keys指令都可能是致命的。keys指令的时间复杂度是O(n)级别,容易导致一时间系统的卡顿。

内存空间不足

当redis处于内存空间不足的时候,基本就是整个系统处于瘫痪作用。因此我们在对每个存储在redis中的数值都需要设置一个合理的过期时间,以及需要思考存储数据的体积大小。

MySQL部分性能瓶颈分析

通常我们在分析sql查询方面都容易出现一个误区,就是上来直接进行explian分析,但是却忽略了系统的运作上下文环境。

假设有一张t_user表,已经存储了几千万的数据,并且也对用户的id进行了索引建立,但是sql执行速度依旧是超过1s时长,这个时候就需要换一种思路进行分析了。

例如从表的拆分方面进行思考,是否该对表进行横向拆分,拆解为t_user_01,t_user_02......

以下是我总结的一些对于数据库层面可能出现性能瓶颈的几点总结:

1.锁

排查是否会存在锁表的情况导致数据库响应缓慢。

2.sql查询还有优化空间,有待完善

通常我们对于sql的执行分析都会使用explain命令进行查看:

这里我贴出了一张关于explain的常用参数含义表供大家参考:


3.查询出的数据量过大

例如说一条sql直接查询了全表的数据信息量,直接占满了网络带宽,因此访问时候出现了网络拥塞。

4.硬件设备不足

例如在面对一些高qps的查询时候,数据库本身的机器硬件配置较低,自然处理速度会比较慢。

5.自适应hash出现锁冲突

AHI是innodb存储引擎特有的属性,innodb存储引擎会针对索引数据的查询结果做自适应的优化,当某些特定的索引查询频率特别高的时候会自动为其建立hash索引,从而提升查询的效率。相比于B+Tree索引来说,hash索引能够大大减少对于io的访问次数,“一击命中” 查询数据,具备更加高效的性能,而且hash索引是由mysql内部自动适配的,无需dba在外部做过多的干预。

早期版本的hash索引是采用了单锁模式来防范并发访问问题,这对于程序自身的一个运作高效性有一定的”折扣“,后期通过对hash索引进行了分区,不同页的数据用不同的hashtable,每个分区有对应的锁来做并发访问的预防。

如果某天你发现了有很多线程都被堵塞在了RW-latches的时候,有可能就是因为hash索引的并发访问负载过高导致的堵塞,这个时候可以通过增大hash索引的分区参数,或者关闭自适应hash索引特性来进行处理。

想知道更多?描下面的二维码关注我

后台回复"技术",加入技术群

后台回复“k8s”,可领取k8s资料

【精彩推荐】

  • 原创|OpenAPI标准规范

  • 中台不是万能药,关于中台的思考和尝试

  • ClickHouse到底是什么?为什么如此牛逼!

  • 原来ElasticSearch还可以这么理解

  • 面试官:InnoDB中一棵B+树可以存放多少行数据?

  • 微服务下如何解耦?对于已经紧耦合下如何重构?

  • 如何构建一套高性能、高可用、低成本的视频处理系统?

  • 架构之道:分离业务逻辑和技术细节

  • 星巴克不使用两阶段提交

点个赞+在看,少个 bug ????

这篇关于如何排查系统的性能瓶颈点?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129559

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、