概述
性能测试 是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。
外部指标
从外部看,主要关注三个指标
- 吞吐量:每秒钟系统能够处理的请求数、任务数。
- 响应时间:服务处理一个请求或一个任务的耗时。
- 错误率:某批次请求中失败或发生错误的请求比例。
互相影响关系如下:
响应时间的指标取决于具体的服务返回的数据有效周期,实时性。对于响应时间的统计,应从均值、.90、.99、分布等多个角度统计,而不仅仅是给出均值。
吞吐量的指标受到响应时间、服务器软硬件配置、网络状态等多方面因素影响。
吞吐量越大,响应时间越长。
服务器硬件配置越高,吞吐量越大。
网络越差,吞吐量越小。
在低吞吐量下的响应时间的均值、分布比较稳定,不会产生太大的波动。
在高吞吐量下,响应时间会随着吞吐量的增长而增长,增长的趋势可能是线性的,也可能接近指数的。当吞吐量接近系统的峰值时,响应时间会出现激增。
错误率和服务的具体实现有关。通常情况下,由于网络超时等外部原因造成的错误比例不应超过5%%,由于服务本身导致的错误率不应超过1% 。
内部指标
从系统的角度看,性能测试主要关注CPU、内存、负载、网络、磁盘IO等
CPU
后台服务的所有指令和数据处理都是由CPU负责,主要有如下几个维度的统计指标:
- us:用户态使用的cpu时间百分比
- sy:系统态使用的cpu时间百分比
- ni:用做nice加权的进程分配的用户态cpu时间百分比
- id:空闲的cpu时间百分比
- wa:cpu等待IO完成时间百分比
- hi:硬中断消耗时间百分比
- si:软中断消耗时间百分比
- us & sy:大部分后台服务使用的CPU时间片中us和sy的占用比例是最高的。
同时这两个指标又是互相影响的,us的比例高了,sy的比例就低,反之亦然。
在使用多核CPU的服务器上,CPU 0负责CPU各核间的调度,CPU 0上的使用率过高会导致其他CPU核心之间的调度效率变低。因此测试过程中CPU 0需要重点关注。
-
ni:每个Linux进程都有个优先级,优先级高的进程有优先执行的权利,这个叫做pri。进程除了优先级外,还有个优先级的修正值。这个修正值就叫做进程的nice值。一般来说,被测服务和服务器整体的ni值不会很高。如果测试过程中ni的值比较高,需要从服务器Linux系统配置、被测服务运行参数查找原因。
-
id:线上服务运行过程中,需要保留一定的id冗余来应对突发的流量激增。在性能测试过程中,如果id一直很低,吞吐量上不去,需要检查被测服务线程/进程配置、服务器系统配置等。
-
wa:磁盘、网络等IO操作会导致CPU的wa指标提高。通常情况下,网络IO占用的wa资源不会很高,而频繁的磁盘读写会导致wa激增。如果被测服务不是IO密集型的服务,那需要检查被测服务的日志量、数据载入频率等。
-
hi & si:硬中断是外设对CPU的中断,即外围硬件发给CPU或者内存的异步信号就是硬中断信号;软中断由软件本身发给操作系统内核的中断信号。通常是由硬中断处理程序或进程调度程序对操作系统内核的中断,也就是系统调用(System Call)。在性能测试过程中,hi会有一定的CPU占用率,但不会太高。对于IO密集型的服务,si的CPU占用率会高一些。
在异步框架中,CPU本身是不会被IO阻塞的,主要关注点:
- 数据处理:
字符串操作(尝试流)
内存操作(内存池)
数据结构设计(红黑树换HASHMAP)
- 并发的处理:
锁的临界区减少(仅在必要时加小粒度锁)
队列化(无锁)
- 计算、存储、网络三者要做到平衡:
合理的将网络、计算的开销减小,增大存储的开销(缓存),大部分计算、网络的瓶颈都可以用增大存储来解决,但要有度。
更合理的调度(docker、云化)
内存
对内存监控的主要目的是检查被测服务所占用内存的波动情况。top命令内存相关参数解析如下:
- VIRT:进程所使用的虚拟