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百分线的方法就是:- 先按升序排列 [2s, 10s, 100s, 1000s]
- 找到你需要用做统计的最后一个条目(向高取整)对应的数值,比如: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 | procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- |
- 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 | iostat -dxk 1 |
1 | # simple top-like I/O monitor |
重点性能指标
%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/