根据进程名称获取pid:ps -ef | grep “name” | grep -v grep | awk ‘{print $2}’
OOM 排查
最常见的原因:
- 有可能是内存分配确实过小,而正常业务使用了大量内存
- 某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽
- 某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接
一、确认是不是内存本身就分配过小
1 | jmap -heap PID |
二、找到最耗内存的对象
1 | jmap -histo PID | head -10 |
三、确认是否是资源耗尽
查看进程创建的线程数,以及网络连接数,如果资源耗尽,也可能出现OOM。
- /proc/${PID}/fd | wc -l
- /proc/${PID}/task | wc -l (效果等同pstree -p | wc -l)
查看进程打开的句柄数和线程数。
线上服务CPU100%问题快速定位
一、找到最耗CPU的进程
- 执行top -c ,显示进程运行信息列表
- 键入P (大写p),进程按照CPU使用率排序
二、找到最耗CPU的线程
- top -Hp PID ,显示一个进程的线程运行信息列表
- 键入P (大写p),线程按照CPU使用率排序
三、将线程PID转化为16进制
- printf “%x\n” TID
四、查看堆栈,找到线程在干嘛
jstack PID | grep ‘0xXXX’ -C5 –color