线上排查OOM

根据进程名称获取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