性能测试分析与调优

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的siso是否为0,如果不为0,说明内存可能不足

3. 磁盘IO

关注是磁盘读入和写出的速度,不是磁盘大小。
命令:iostat -x 1 2  # 输入/输出统计,查看硬盘的I/O性能(每秒显示一次,显示2次)。-x:磁盘利用率。-c:CPU利用率。
%idle:空闲CPU的时间百分比。如idle小于70%,I/O的压力就比较大了,说明读取进程中有较多的wait。
await:平均每次设备I/O操作等待时间(毫秒)。svctm:平均每次设备I/O操作的服务时间(毫秒)
svctm ≈ await,表示几乎没有I/O等待,磁盘性能很好;await >> svctm,则表示I/O队列等待太长,系统上运行的应用程序将变慢, 此时可以通过更换更快的硬盘来解决问题。
%util:一秒中有百分之几的时间用于I/O操作。衡量磁盘I/O重要指标,如%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷工作,该磁盘可能存在瓶颈。

测试关注点:

  • %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: 慢查询时间阈值(超过该时长才会被记录,单位:秒)
查询慢查询的相关参数:show variables like "";

知道了慢查询日志存放位置,就可以用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。

 

posted @ 2023-10-10 00:26  鹿先森JIAN  阅读(160)  评论(0编辑  收藏  举报