昨天聊了性能测试指标和性能测试排除过程,主要是理论,今后几天主要讲案例。
延迟高有很多叫法,比如响应时间长、服务器反应慢、业务超时等,最根本的表现就是客户端发送请求到服务端后,服务器很长时间才给应答或者根本就没给应答。
造成延迟高(响应时间长)的原因有很多,比如:
服务端应用压力太大,确实处理不过来了
使用了不恰当的同步锁(代码级别或者其他资源锁)
第三方资源的不给力
线程池配置的不合理,线程数配置的太少导致的请求积压
网络原因,丢包、带宽限制、重传等
sleep
调用端代码有问题导致服务器应答到达客户端后,客户端处理不及时,可能也会误认为响应时间长
分析方法
用到的工具
jvisualvm
用于实时的监控每个方法的执行时间,统计比较精但不适合线上长时间使用。
jstack
抓取应用当前的线程堆栈信息,分析每个线程正在执行的操作。
通过jvisualvm分析
通过jvisualvm分析能够更直观的看到每个方法的执行时间,在测试环境或者开发阶段调优非常有帮助。
首先,打开jvisualvm,jvisualvm位于jdk的bin目录下,一般配置了jdk的环境变量可以直接通过命令行输入jvisualvm打开。另外也可以通过https://visualvm.github.io/去下载直接使用。
打开后界面如下:
jvisualvm主界面
如果是本地应用,可以直接点击需要监控的进程,直接挂载上去。
如果是远程应用,需要在远程应用启动的时候,添加允许远程调试的参数。
-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=远