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重传率

相关推荐