性能测试分析与调优
Linux服务器性能查看分析调优 - 知乎 (zhihu.com)
步骤:
- 确定问题。根据性能测试的结果来分析确定bug —— 测试⼈员职责
- 分析原因。分析问题产⽣的原因 —— 开发⼈员职责
- 给出解决⽅案。可以是修改软件配置、增加硬件资源配置、修改代码等 —— 开发⼈员职责验证解决⽅案。—— 测试⼈员回归测试
- 分析验证结果 —— 既要保证有问题的指标得到解决,⼜要保证其他指标没有出现新问题
性能测试监控关键指标
性能问题可能产生的原因
- 服务器的资源 —— 影响应⽤服务器和数据库服务器处理的速率 和 ⽹络传输速率
- JVM瓶颈分析 —— JAVA程序运⾏的环境
- 数据库瓶颈分析 —— 数据库程序运⾏环境分析
- 程序内部实现机制 —— 开发⼈员编写的代码分析
- 压测机 —— 影响性能结果
常见性能瓶颈分析
1. 服务器资源分析
- CPU瓶颈分析
- CPU已压满(接近100%),需要再看其他指标的拐点出现的时刻是否与CPU压满的时刻基本一致
- 内存瓶颈分析
- 内存不足时,操作系统会使用虚拟内存,从虚拟内存读取数据,影响处理速度
- 磁盘I/O瓶颈分析
- 磁盘I/O成为瓶颈时,会出现磁盘I/O繁忙,导致交易执行时在I/O处等待
- 网络带宽
- 如果接口传递的数据包过大,超过了带宽的传输能力,就会造成网络资源竞争,导致TPS上不去
2. JVM瓶颈分析
- 分析JVM的内存
3. 数据库瓶颈分析
- 慢查询
- 数据库的连接池设置太小,导致数据库连接出现排队
- 数据库出现死锁
4. 程序内部实现机制
5. 压测机
- JMeter单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会导致TPS压不上去
服务器资源分析
服务器的硬件
CPU、内存、磁盘、外设(键盘、⿏标、显示器、散热器、机箱)
运行速度从快到慢:CPU >> 内存 >> 磁盘
存储空间从大到小:磁盘 >> 内存 >> CPU
- vmstat、sar、iostat 检测是否是CPU瓶颈
- free、vmstat 检测是否是内存瓶颈
- iostat 检测是否是磁盘I/O瓶颈
- netstat 检测是否是网络带宽瓶颈
1. CPU
CPU:单位HZ,将CPU划分为若干个时间⽚,为每个程序分配对应的时间片,保证所有的程序占⽤时间片来串行执行。
CPU使⽤率 = 已使⽤的时间⽚ / 总时间⽚ * 100%
- 已使⽤的时间⽚ = ⽤户CPU + 系统CPU
- 总时间⽚ = ⽤户CPU + 系统CPU + 空闲CPU
- ⽤户CPU:所有应⽤程序运⾏时消耗的CPU
- 系统CPU:操作系统运⾏消耗的CPU
CPU监控命令:top # CPU时间 = us + sy + id
测试的关注点:
- CPU⾼时,需要确认是⽤户CPU⾼还是系统CPU⾼
- 如果是⽤户CPU⾼,需要进⼀步分析对应的应⽤程序的执⾏效率是否有问题
- 如果是系统CPU⾼,需要进⼀步观察其他的资源(内存、磁盘、⽹络等)是否存在问题
2. 内存和虚拟内存
命令:
- 查看总量:top
- 查看虚拟内存的使⽤量:vmstat # Virtual Meomory Statistics,虚拟内存统计
swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM
swap out:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK
测试关注点:
- 实际内存:查看内存使⽤百分⽐,检查是否超过80%
- 虚拟内存:查看swap的si和so是否为0,如果不为0,说明内存可能不足
3. 磁盘IO
测试关注点:
- %util⾼,说明磁盘⻓时间占⽤CPU在发送数据,说明磁盘传输速度不足,存在瓶颈
- %iowait⾼,说明磁盘IO传输数据的任务很多,在等待,说明磁盘传输速度不足,存在瓶颈
4. 网络
关注是网络传输数据的速度。
命令:sar -n DEV 1 2 # -n DEV 查看当天从零点到当前时间的网卡流量信息。每秒一次,共2次
rxKB/s:每秒接收的数据量(千字节数)。txKB/s:每秒发送的数据量(千字节数)
测试关注点:
- 实际统计的发送速率和接收速率,与⽹络的总带宽进⾏对⽐,查看使⽤的百分⽐(如果⽆限接近100%,说明存在⽹络性能瓶颈)
补充介绍
-
宽带:⽤户(业务)维度来描述⽹络速率的⽅式。例如:20M宽带、100M宽带、1000M宽带
-
-
速率单位:b(bit)/s
带宽:数据在网络中传输的速率,在技术中都是通过带宽来描述速率。
-
-
速率单位:B(Byte)/s1B = 8bit
-
实际情况:1000M宽带 —— 对应着的带宽速率为 1000Mb/s / 8bit = 125MB/s
JVM瓶颈分析
Java应用瓶颈分析 —— JVM内存分析
JVM内存:Java 虚拟机在执行 Java 程序的过程中所管理的不同的内存数据区域。可简单分为:堆内存和非堆内存
- 堆内存:主要存放用new关键字创建的对象,所有对象实例以及数组都在堆上分配。 —— 给开发人员使用的(关注)
- 非堆内存:保存虚拟机自己的静态数据,存放加载的Class类级别静态对象如类、方法等。 —— 给JVM自己使用的
Java内存瓶颈分析 —— jvm内存监控
工具位置:JDK的bin目录下的 jvisualvm.exe,双击启动。
具体使用请看:Java自带的jvisualVM简单介绍 - Taider_Yang - 博客园 (cnblogs.com)
数据库瓶颈分析
数据库瓶颈分析 —— 慢查询
- slow_query_log:慢查询日志开启状态
- slow_query_log_file:慢查询日志存放位置
- long_query_time: 慢查询时间阈值(超过该时长才会被记录,单位:秒)
知道了慢查询日志存放位置,就可以用cd命令进入该目录,然后用 tail -f xxx.log 命令实时查看sql日志了,再去操作数据库增删改查,产生日志(超过慢查询时间阈值)。
设置慢查询的相关参数:set global 参数名 = 值;
数据库瓶颈分析 —— 数据库连接池
数据库连接池定义:数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
作用:可以提高对数据库操作的性能。
测试关注点:
- 利用率 = 当前使用的连接数/最大连接数,建议:85%左右。
- 如果利用率超过85%,需要增加最大连接数设置,否则会造成连接失败
- 如果利用率小于10%,那显然设置的过大,会造成系统资源的浪费,可能影响其它性能指标。
show variables like '%max_connections%'; # 最大连接数
show status like 'Threads_connected'; # 已使用连接数
数据库瓶颈分析 —— 数据库死锁
MySQL主要有两种锁:表级、行级。
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度最大,并发度最低。
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,并发度也最高。
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。
- 若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁。
- 表级锁不会产生死锁。
测试关注点(初步确定死锁):
- show open tables where in_use>=1; # 查询当前是否锁表
- 如果表锁了,这个sql可以查询出来。但是这个sql查出来的表,不一定是被锁住的。因为用查询,如果耗费时间很长,也会查询出来。
- show processlist; # 查看执行时间最长的线程,找到对应sql,找到表。
- kill process_id; # 如果需要先紧急解决问题,可以先手动杀死死锁的连接。
压测及瓶颈分析
压测机影响性能测试结果的原因主要是:
- JMeter单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会导致TPS压不上去。
压测机资源的监控方法:
- Windows测试机:自带“任务管理器”
- Linux测试机:PerfMon组件
解决方案:
- 采用分布式执行的方法来提高负载量,达到系统性能测试要求的TPS。