linux java 线上问题排查
转自:
http://www.myexception.cn/operating-system/415201.html
线上故障问题排查技能记载一
1. pgrep 查询进程的工具
pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了
用法: pgrep 参数选项 程序名
eg: pgrep java #查询出JAVA进程的进程号
常用参数:
-l 列出程序名和进程ID
-o 进程起始的ID
-n 进程终止的ID
2. 汇总某个进程下所有的线程数
方法一 :ls /proc/20967/task/|wc -l : 20967是进程号
方法二 : ps -eLf | grep 20967 |wc -l
ps:该方法对于排查JAVA各种容器(eg:tomcat)由于创建过多线程,导致cpu耗费大量的资源进行上线文切换非常有帮助。
我们可以写一个脚本,当线程数>阀值,则进行jstack dunp
3. TOP命令看线程资源使用情况
第一步:输入TOP命令
第二步: 输入 shift+h ,打开线程模式,查看目前最耗系统资源的线程是哪些
可以再按 1用CPU模式看各个CPU资源的使用情况 按O查看帮助
4 top+jstack
使用top命令看线程资源使用情况后,可以得到这些线程的pid,然后把这些线程号转换成16进制,
jstack -l pid(java进程号) :把java线程快照给dump下来.可以用来排查死锁,以及耗费系统资源线程当前的运行情况
eg: jstack -l pid >jstack_dump.log #将当前JVM线程快照dump到jstack_dump.log文件中
grep jstack_dump.log 16进制号 #这样可以看看当前这些耗费资源的线程的内存情况
5. jstack 打印当前线程堆栈情况
命令格式: jstack [-option] jvm_pid
参数: -l 打印关于锁的堆栈信息(long listing. Prints additional information about locks)
-m 混合打印模式,可打印C++和JAVA的堆栈信息
-h 打印帮助信息
6.查看运行时gc情况命令:
$JAVA_HOME/bin/jstat -gcutil `pgrep java` 1000 10 (后三个参数是PID,扫描间隔时间单位毫秒,扫描次数)
$JAVA_HOME/bin/jstat -gc `pgrep java` 1000 10
7.对于网络问题的定位 :
可以通过netstat命令来查看某个时间段的网络重传率。
通过netstat -l enX -sp tcp
收集发送的TCP包数和retransmit的包数,间隔一定时间过后
再次收集这两个数值,分别相减后相除,可得出在此采样时间内的TCP重传率