测试,是一个挺专业的事情。
1. 系统性能定义
性能测试指标
- Throughput:吞吐量,系统每秒钟可以处理的请求数,任务数。
- Latency:系统延迟,系统在处理一个请求或一个任务时的延迟。
- TPS:每秒响应的任务数量。
考察系统性能时需要同时考虑上面的性能指标。比如最多允许 2 秒以内的延迟时,系统最多可以承受多大并发。在描述系统性能时,响应时间参数必须和吞吐量挂钩,单纯的响应时间意义不大。
这两个性能指标之间互相有影响:
- Throughput 增大会导致 Latency 增大,请求越多系统负载越高,延迟越大。
- Latency 越小则系统的 Throughput 就越高,Latency 小则说明处理请求的速度快,可以处理更多的请求。
某些测试可能还会有平均值和成功率这两个性能指标。
性能测试方法
- 负载测试
- 压力测试
- 配置测试
- 并发测试
- 可靠性测试
2. 系统性能测试
测试之前必须首先要明确需求。对于不同系统,要求的 Throughput 和 Latency 会有所不同。完整的测试流程如下:
- 明确 Latency:不同业务可以有不同的响应时间,例如可以设定为 2 秒。
- 制定测试方法:选择一个向系统施加指定的 Throughput 的压力测试工具(参考下面),选择一个测量 Latency 的工具(例如 Fiddler、Wireshark)。
- 开始性能测试并汇总数据:不断提升 Throughput,看看系统负载情况,判断系统是否正常。如果系统在指定 Throughput 下未宕机,则记录 Latency。Throughput 增大到一定大小后,Latency 会开始抖动,通常会把 95% 的请求在指定的 Latency 内得到响应时对应的 Throughput 作为一个重要阈值。
- 分析结果:将结果汇总成图标。
常用的压力测试工具有:
- JMeter(Java 桌面应用,开源稳定且生态完善,并发差)
- wrk(简单的 http 性能测试工具)
- Loadrunner(收费,目前属于 microfocus)
- webbench(只支持 Linux,最多可以模拟3万个并发连接)
- http_load(程序小巧,资源占用少)
- ab(Apache 集成,简单功能少)
- tcpcopy(开源,生态活跃)
- 压测大师(将测试打包成服务,在云端直接使用)。
性能测试时,每个 Throughput 的压力需要持续一段时间,尤其是在阈值附件的 Throughput,可能需要几个小时甚至几天的压测。
3. 查找系统瓶颈
3.1 查看操作系统负载
看操作系统负载,就是看操作系统的 CPU 利用率、内存使用率、磁盘 IO、网络 IO。Linux 下常用的命令和工具有:SystemTap(查看内核信息,参考 这里),iostat, top, tcpdump 等。
关于 CPU,多核 CPU 中的 CPU0 在执行普通任务的同时还负责核间调度,因此要确保其负责不能过高。
关于 IO,IO 使用率高时 CPU 使用率一般就比较低,程序一般会交替占用 CPU 或 IO。
3.2 使用 Profiler 测试
系统中 80% 的运行时间花在了 10% 的代码上,找出那些频繁调用的代码并优化可以事半功倍。
测试时,可以在代码中使用计时器和函数调用计算器做统计并定时写入日志,也可以分块注释进行测试以查找问题代码段。
Profiler 测试工具:
- Perf:Linux kernel 自带的系统性能优化工具,与 Linux Kernel 紧密结合。可以按进程、CPU 或 counter group 等不同类别来查看信息,对代码优化到 CPU 的微指令级别。
- xhprof:PHP 语言的轻量级分层性能测量分析器,轻量,可在生产环境部署。参考 这里。
4. 性能调优
参考 性能调优攻略。