1. 查找进程
top
2. 查找线程
top -H -p <pid>
3. 查找java的堆栈信息
# 将线程id转换成十六进制
printf "%x\n" <tid>
# 使用jstack查询线程的堆栈信息
jstack <pid> | grep -a 线程id(十六进制)
4. 其他
strace -p 24167(tid)
流程执行命令:
1.top 查到pid 28555
2.ps aux|grep 28555 确定到是tomcat的进程
3.显示线程列表 ps -mp 28555 -o THREAD,tid,time 查到tid 28802
4. printf "%x\n" 28802 将线程id,tid进行16进制转换
5.jstack pid |grep tid -A 30 显示堆栈信息 jstack 28555 |grep 28802 -A 30
详细解释看下文:
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。
以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。
根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。
通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。但是,怎么定位到具体线程或者代码呢?
首先显示线程列表:
ps -mp pid -o THREAD,tid,time
找到了耗时最高的线程28802,占用CPU时间快两个小时了!
其次将需要的线程ID转换为16进制格式:
printf "%x\n" tid
最后打印线程的堆栈信息:
jstack pid |grep tid -A 30
找到出现问题的代码了!
最后,总结下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、ps命令: Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack: Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
先进服务器,用top -c 命令找出当前进程的运行列表(cpu占用率从大到小)
显示Java进程 PID 为 2609 的java进程消耗最高
然后我们需要根据PID 查出CPU里面消耗最高的进程使用命令 top -Hp 2609 找出这个进程下面的线程,继续按P排序
1. 查找进程
top
2. 查找线程
top -H -p <pid>
3. 查找java的堆栈信息
# 将线程id转换成十六进制 printf "%x\n" <tid> # 使用jstack查询线程的堆栈信息 jstack <pid> | grep -a 线程id(十六进制)
4. 其他
strace -p 24167(tid)
转载于:https://my.oschina.net/ironwill/blog/1557076
linux下有时候需要查看系统内存占用的情况,两个方法。
一个是用top
输入大写的M
可以查看到占用内存的进程PID,以及占用的百分比
PID是第一列,内存占用百分比是%MEM这一列另外也可以通过下面的方法查内存占用:
ps -aux | sort -nk4
这个命令其实就相当于
ps -aux|sort -n -k 4
-k指定列数,-k 4意思就是指定第4列,就是内存那一列
如果是cpu,就可以用-k 3
-n 依照数值大小来排序我们可以取使用内存最多的前10个进程
加了一个-r ,-r 是逆向排序:ps -aux | sort -nrk4 | head -n 10