Java服务程序突然变慢,如何定位?

  1. 检查网络是否存在问题

最先排查的原因就应该是网络问题,即外部因素。常见的着手方法是测试网速,这里推荐工具speedtest,当然类似的有很多:

1)安装:

$ wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py

$ chmod a+rx speedtest.py

mv speedtest.py /usr/local/bin/speedtest

chown root:root /usr/local/bin/speedtest

2)调用命令测试

$ speedtest

转自:https://blog.csdn.net/Beyond_F4/article/details/80497118

更深层次的网络问题排查可以参见:http://www.cnblogs.com/Security-Darren/p/4700387.html

     2. 检查日志

首先检查程序日志,看有哪些异常被抛出,有没有类似内部错误的不正常的异常被抛出;

如果使用tomcat部署,还需检查tomcat的日志。

     3. 测试响应时间

如果以上的都没有问题,可以再次测试程序响应时间,注意:主要是为了测试服务响应时间,即服务处理请求构造数据消耗的时间。

通过curl得到http各阶段的响应时间,这可以参考:https://blog.csdn.net/hqzxsc2006/article/details/50547684

#curl -o /dev/null -s -w %{http_code}:%{http_connect}:%{content_type}:%{time_namelookup}:%{time_redirect}:%{time_pretransfer}:%{time_connect}:%{time_starttransfer}:%{time_total}:%{speed_download} www.baidu.com

     4. 定位线程

查看内存使用:top、free、ps、cat /proc/meminfo

查看磁盘使用:df -h ,例如日志写完等等

尝试查看定位到具体的线程查看原因:

1) ps -ef | grep java 找出最耗CPU的JAVA进程(一般就是服务进程引起)

2) top -Hp "进程ID" 找出最耗时间的JAVA线程

3) jstack "进程ID" | grep "线程ID"

你可能感兴趣的:(Java服务程序突然变慢,如何定位?)