cpu-idle过低问题

8次阅读

共计 654 个字符,预计需要花费 2 分钟才能阅读完成。

工作中,如果机器 cpu idle 过低,会收到告警

P2
主机名: set-xr-xxxx 监控项:
all(#5) cpu.idle < 30 当前值: 0

排查的步骤如下,

  1. 使用 top + 大写 P,查看 cpu 占用过高的进程
    这里往往就是后台 java 服务,然后要通过进程来排查具体的线程,这时有两种方法

    方法一:

  2. top -H -p [pid] , 这时可以看到该进程下的所有线程,同样与大写 P 结合可以查看 cpu 占用过高的线程
    方法二:
  3. ps -mp [pid] -o THREAD,tid,time,此时也可以看到该进程下的所有线程,其中 m 代表列出该进程下的所有线程,p 代表列出线程占用 cpu 的时间,o 代表格式化输出
    通过以上两种方法可以获取到线程 id,以下称为 tid
  4. 将 tid 转为 16 进制,可以使用以下命令 printf “%xn” [tid],得到的 16 进制线程 id,我们同样称为 tid
  5. jstack [pid] | grep tid(16 进制) -A 60,从输出中排查公司相关的代码内容,找到问题代码的行数,进行排查

如果是 fullgc 导致的,可以进一步 dump jvm 内存信息进行排查

  1. jmap -dump:format=b,file=dump-all.hprof [pid] #dump 全量内存数据,[pid]替换为上一步查找的进程 id
  2. jmap -dump:live,format=b,file=dump.hprof [pid] #再次 dump 存活对象内存数据,注意 live 参数会触发 fullgc,所以本次 dump 一定要在上一步全量 dump 之后执行。
  3. 使用 eclipse 的工具 mat 打开,进行排查
正文完
 0