Technology Stack On Testing


Performance Metric

业务指标

  • Response Time:业务响应时间,一般情况下,不同系统的业务响应时间期望值是不同的,1秒以内最佳;

    • 平均响应时间:一段时间内响应时间的平均值。无法体现响应时间的波动情况。

    • 中间响应时间:一段时间内响应时间的中间值,50%响应时间,有一半的服务器响应时间低于该值而另一半高于该值。

    • 90%响应时间:一段时间内90%的事务响应时间比此数值要小。反应总体响应速度,和高于该值的10%超时率。是用来评估系统容量的重要指标之一。

    • 最小响应时间:响应时间的最小值。反映服务最快处理能力。

    • 最大响应时间:响应时间的最大值。反映服务器最慢处理能力。

  • Transaction Per Second(吞吐量):业务处理能力,这个指标是衡量系统的处理能力的一个非常重要的指标,TPS可以参照同行业系统和结合具体业务,中小企业TPS值为50~1000笔/秒,银行TPS值为1000~50000笔/秒,淘宝TPS值为30000~300000笔/秒。

    • 平均吞吐量:一段时间内吞吐量的平均值。无法体现吞吐量的瞬间变化。

    • 峰值吞吐量:一段时间内吞吐量的最大值。是用来评估系统容量的重要指标之一。

    • 最低吞吐量:一段时间内吞吐量的最小值。如果最小值接近0,说明系统有“卡”的现象。

    • 70%的吞吐量集中区间:通过统计15%和85%的吞吐量边界值,计算出70%的吞吐量集中区间。区间越集中,吞吐量越稳定。

  • 成功率:这个指标是衡量系统处于压力下,业务的成功率,一般业界成功率要大于99.6%。

  • Top Percentile(TP):例如,TP90 = The tp90 is a minimum time under which 90% of requests have been served。

    TP50:指在一个时间段内(如5分钟),统计该方法每次调用所消耗的时间,并将这些时间按从小到大的顺序进行排序,取第50%的那个值作为TP50值;配置此监控指标对应的报警阀值后,需要保证在这个时间段内该方法所有调用的消耗时间至少有50%的值要小于此阀值,否则系统将会报警。
    TP90,TP99,TP999与TP50值计算方式一致,它们分别代表着对方法的不同性能要求,TP50相对较低,TP90则比较高,TP99,TP999则对方法性能要求很高。
    举例,假设现在有4次请求耗时分别为
    10s,1000s,100s,2s
    计算TP百分线的方法就是:

    1. 先按升序排列 [2s, 10s, 100s, 1000s]
    2. 找到你需要用做统计的最后一个条目(向高取整)对应的数值,比如:TP50就是第 ceil(40.5)=2 个,即 10s ;TP90就是第 ceil(40.9)=4 个,即1000s。

CPU

  • Running:正在运行的进程。
  • Waiting:已准备就绪,等待运行的进程。
  • Blocked:因为等待某些事件完成而阻塞的进程,通常是在等待I/O,如Disk I/O,Network I/O等。

这里的Running和Waiting共同构成Linux进程状态中的可运行状态(task_running),而Blocked状态可以对应Linux进程状态中的不可中断睡眠状态(task_uninterruptible)。

Linux命令vmstat 1(1秒采集1次)可以读取相关状态数据,例如

1
2
3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 142064 374032 1951676 0 0 0 0 351 670 0 0 100 0 0
  • us:用户占用CPU的百分比
  • sy:系统(内核和中断)占用CPU的百分比
  • id:CPU空闲的百分比
  • r:表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了。
  • in:每秒CPU的中断次数,包括时间中断。
  • cs:秒上下文切换次数。
  • b:表示阻塞的进程。
  • si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
  • so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
  • bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte。
  • bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。
  • wt:等待IO

性能测试指标中,CPU使用率通常用us + sy来计算,其可接受上限通常在70%~80%。另外需要注意的是,在测试过程中,如果sy的值长期大于25%,应该关注in(系统中断)和cs(上下文切换)的数值,并根据被测应用的实现逻辑来分析是否合理。


  • CPU Utilization Percentages(CPU使用率):有进程处于Running状态的时间/总时间。

    在vmstat主要通过us、sys和id三列数据来体现。

  • Processes on run queue(运行队列进程数):Running状态 + Waiting状态的进程数,展示了正在运行和等待CPU资源的任务数,可以看作CPU的工作清单,是判断CPU资源是否成为瓶颈的重要依据。vmstat通过r的值来体现。

    如果r的值等于系统CPU总核数,则说明CPU已经满负荷。在负载测试中,其可接受上限通常不超过CPU核数的2倍。

  • Context Switches(上下文切换):简单来说,context指CPU寄存器和程序计数器在某时间点的内容,(进程)上下文切换即kernel挂起一个进程并将该进程此时的状态存储到内存,然后从内存中恢复下一个要执行的进程原来的状态到寄存器,从其上次暂停的执行代码开始继续执行至频繁的上下文切换将导致sy值增长。vmstat通过cs的值来体现

  • Load Average(平均负载):在UNIX系统中,Load是对系统工作量的度量。Load取值有两种情况,多数UNIX系统取运行队列的值(vmstat输出的r),而Linux系统取运行队列的值 + 处于task_uninterruptible状态的进程数(vmstat输出的b),所以会出现CPU使用率不高但Load值很高的情况。

    Load Average就是在一段时间内的平均负载,系统工具top、uptime等提供1分钟、5分钟和15分钟的平均负载值。
    top - 13:38:38 up 42 days, 3:25, 1 user, load average: 0.80, 0.60, 0.53
    当需要了解当前系统负载情况时,可以先查看Load average的值,如果系统持续处于高负载(如15分钟平均负载大于CPU总核数的两倍),则查看vmstat的r值和b值来确认是CPU负荷重还是等待I/O的进程太多。

sirq 占用比较高是什么原因?


Memory

Memory资源也有三方面需要重点关注:Free Memory、Swap和Paging

物理内存和硬盘上的一块空间(SWAP)组合起来作为虚拟内存(Virtual Memory)为进程的运行提供一个连续的内存空间,这样的好处是进程可用的内存变大了,但需要注意的是,SWAP的读写速度远低于物理内存,并且物理内存和swap之间的数据交换会增加系统负担。

虚拟内存被分成页(x86系统默认页大小为4k),内核读写虚拟内存以页为单位,当物理内存空间不足时,内存调度会将物理内存上不常使用的内存页数据存储到磁盘的SWAP空间,物理内存与swap空间之间的数据交换过程称为页面交换(Paging)。

  • Free Memory(可用内存):内存占用的直观数据,vmstat输出free的值,可用内存过小将影响整个系统的运行效率,对于稳定运行的系统,free可接受的范围通常应该大于物理内存的20%,即内存占用应该小于物理内存的80%。在压力测试时,系统内存资源的情况应该用可用内存结合页面交换情况来判断,如果可以内存很少,但页面交换也很少,此时可以认为内存资源还对系统性能构成严重影响。

  • Paging(页面交换):页面交换包括从SWAP交换到内存和从内存交换到SWAP,如果系统出现频繁的页面交换,需要引起注意。可以从vmstat的si和so获取。

    si:每秒从SWAP读取到内存的数据大小;so:每秒从内存写入到SWAP的数据大小。

  • Swap:可以从vmstat的swpd来获取当前SWAP空间的使用情况,应该和页面交换结合来分析,比如当swpd不为0,但si,so持续保持为0时,内存资源并没有成为系统的瓶颈。


Disk

磁盘IO分为随机IO和顺序IO两种类型,在性能测试中应该先了解被测系统是偏向哪种类型。

  • 随机IO:随机读写数据,读写请求多,每次读写的数据量较小,其IO速度更依赖于磁盘每秒能IO次数(IOPS)。
  • 顺序IO:顺序请求大量数据,读写请求个数相对较少,每次读写的数据量较大,顺序IO更重视每次IO的数据吞吐量。

对于磁盘,首要关注使用率,IOPS和数据吞吐量,在Linux服务区,可以使用iostat来获取这些数据。

1
2
3
4
5
6
iostat -dxk 1
# -d 显示设备(磁盘)使用状态
# -k 某些使用block为单位的列强制使用Kilobytes为单位
# 1 表示刷新间隔为1秒

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# simple top-like I/O monitor
# apt install iotop
iotop
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND

# --version #显示版本号
# -h, --help #显示帮助信息
# -o, --only #显示进程或者线程实际上正在做的I/O,而不是全部的,可以随时切换按o
# -b, --batch #运行在非交互式的模式
# -n NUM, --iter=NUM #在非交互式模式下,设置显示的次数,
# -d SEC, --delay=SEC #设置显示的间隔秒数,支持非整数值
# -p PID, --pid=PID #只显示指定PID的信息
# -u USER, --user=USER #显示指定的用户的进程的信息
# -P, --processes #只显示进程,一般为显示所有的线程
# -a, --accumulated #显示从iotop启动后每个线程完成了的IO总数
# -k, --kilobytes #以千字节显示
# -t, --time #在每一行前添加一个当前的时间
# -q, --quiet #suppress some lines of header (implies --batch). This option can be specified up to three times to remove header lines.
# -q column names are only printed on the first iteration,
# -qq column names are never printed,
# -qqq the I/O summary is never printed.
# https://www.cnblogs.com/legendbaby/p/5056967.html

重点性能指标

  • %util:在统计时间内,所有处理IO时间除以总共统计时间。

    例如如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。
    一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

  • await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。

    这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。

  • svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。

  • kB_read/s:每秒从设备读取的数据量;
  • kB_wrtn/s:每秒向设备写入的数据量;
  • kB_read:读取的总数据量;
  • kB_wrtn:写入的总数量数据量;
    -rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
  • rsec/s:每秒读取的扇区数;
  • wsec/:每秒写入的扇区数。
  • rKB/s:The number of read requests that were issued to the device per second;
  • wKB/s:The number of write requests that were issued to the device per second;
  • avgrq-sz:平均请求扇区的大小
  • avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好。

  • IOPS:每秒处理读/写请求的数量,即iostat输出中的r/s和w/s,个人PC的机械硬盘IOPS一般在100左右,而各种公有云/私有云的普通服务器,也只在百这个数量级。

    预先获取到所用服务区的IOPS能力,然后在性能测试中监控试试的IOPS数据,来衡量当前的磁盘是否能满足系统的IO需求。

  • 数据吞吐量:每秒读/写的数据大小,即iostat输出中的rkB/s和wkB/s,通常磁盘的数据吞吐量与IO类型有直接关系,顺序IO的吞吐能力明显优与随机读写,可以预先测得磁盘在随机IO和顺序IO下的吞吐量,以便于测试时监控到的数据进行比较衡量。


Network

网络本身是系统中一个非常复杂的部分,但常规的服务端性能测试通常放在一个局域网进行,因为我们首先关注被测系统自身的性能表现,并且需要保证能在较少的成本下发起足够大的压力。

因此对于多数系统的性能测试,我们主要关注网络吞吐量即可,对于稳定运行的系统,需要为被测场景外的业务流出足够的带宽;在压力测试过程中,需要注意瓶颈可能来自于带宽。

1
iptraf -d eth0

Performance Tools

  • wrk
  • ab
  • locust
  • Jmeter

Reference

https://testerhome.com/topics/17068
https://zhuanlan.zhihu.com/p/22070862
http://www.aloo.me/2016/08/01/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E4%B8%AD%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%B3%E9%94%AE%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87%E6%B5%85%E6%9E%90/