背景:上一篇写了一个如何开展测试,这篇就补充下如何定位性能问题,权当是一种思路;
思路如下:(从前到后,从表象到内部)
- 首先排除压力机自身的问题,如CPU、内存、网络、脚本、应用环境等问题;
- 监控中间件的访问日志,观察响应时间,大体确定耗时处于哪一个阶段(把范围缩小);
- 排查网络问题,监控压力机到后端服务的网络,以及各服务间的网络,是否达到网络上线(网络问题一般不会出现,但是容易被忽略,条件允许的话,性能测试的网路独立);
- 监控服务端所有机器的操作系统负载,如CPU,内存,磁盘,网络是否达到瓶颈(这块主要监控应用服务器和数据库服务器操作系统级别的);
- 监控应用服务的日志,查看是否有ERROR,或者timeout级别的报错(主要打开部署应用,动态监控);
- 监控中间件的连接数,如Nginx、tomcat、MySQL 是否达到上限(目前项目中我就是查看了MySQL的连接数:show variables like '%connections%'和show status like '%thread%')
- 监控应用程序线程状态,使用jstack和jvisualvm查看是否有死锁、阻塞情况;(监控的方法关注后面的blog);
- 监控应用程序的jvm,使用jstat和jmap查看GC情况,是否有内存泄漏情况;
- 使用jprofiler监控应用程序,可以查看耗时时间比较长的代码(这个工具需要破解,在公司慎重使用,万一被安排上了,哈哈)
- 监控数据库,是否有慢查询,一般数据库cpu过高的原因都是慢查询(这个一般阿里云会提供这种服务,可以随时监控);
- 监控数据库执行计划,是否有全表扫描,以及索引不生效的情况;
- 检查系统是否有外部依赖情况,如果外部依赖性能很差,也会造成性能低下(这此压测主要的问题,就是因为外部依赖性能差的原因);
- 对于不好定位的问题,可以采用模块隔离的方法来确定问题
- ps :以上的思路都是理论,如何实践,还需要做项目时,亲自体会