性能测试主要看哪几方面?
1. 响应时间 : 完成一个业务所需要的时间
2. 吞吐量: 单位时间处理的业务数量
3. 资源利用率 : 完成业务需要的开销 ( CPU, 内存,IO)
性能的难点
用户总希望发最小的代价取得最大的收益,实际上一旦确定了架构,性能也就确定了
- 如果遵守规范体系能够达到默认架构的性能
- 大多数的开发会违背架构,拖后腿
性能测试模型
1. 做单用户的业务串行测试 : 评估单独业务的相应时间
2. 多用户的并发测试:了解相应时间的转折点:
- 队列
- 资源不足
- 处理能力的峰值
模型结论:(所有系统都遵守)
1. 响应时间随着负载的上升先稳定后上升,并且越来越快
A点:响应时间开始变长的点
为什么响应时间开始变长? 当到达A点说明负载导致了队列的产生
B点: TPS开始下降
B点处理能力已经不能完全占用资源,开始下降了
C点: 响应时间超过用户接受范围
C点响应时间超时
系统在A点,说明负载小
系统在B点,说明达到系统最佳在线用户
系统在C点,说明系统不能用
正常系统应该一直在A->B之间,最好不超过B
性能瓶颈:99%都是数据库
调优:ABC三点右移,说明调优成功
系统如果慢了,应该怎么处理?
有监控系统就看监控系统,没有监控系统就用命令,查看CPU, 内存,IO,network的信息
命令: top
1. 查看cpu的使用情况
查看cpu详细情况,比如有几核
cat /proc/cpuinfo
top命令下按一下1,cpu有几核等信息也会出来
那么看到了cpu占用率比较高的进程,应该怎么定位代码呢?
在top下用shift+h,把进程的线程信息显示出来, jstack 线程PID > info.txt,把线程pid转换为16进制,搜索info.txt,就可以看到信息了
jstack命令:每个线程的信息都会显示出来
2. 内存
vmstat 或top
vmstat
vmstat 1 : 1秒中显示一次
free -g : 单位是G
free -m: 单位是m
buffer: 写优化
cache: 读优化
用top命令看,如果mem占比高的话,就要考虑是不是JVM的问题了
3. IO : 磁盘读写
iostat
%util : 查看IO占cpu时间比,可能超过5%就有问题了
怎么定位到IO问题? 只能看业务逻辑了
4. Network
nicstat
用jmeter压测某个url,就可以看到网络的使用情况
监控系统:
1. 硬件的监控
2. 服务的监控