线上问题排查

  • 首先需要理解服务器各项指标含义和边界值

服务器指标(待整理)

  • 查看服务CPU和内存固定大小 cat /proc/cpuinfo cat /proc/meminfo

  • 系统负载 通过uptime命令查看 ,它表示1分钟内: 总任务数/CPU能执行的任务数

~$ uptime
 20:57:07 up 1093 days, 20:39,  1 user,  load average: 14.87, 15.34, 13.86

正常值应该在 (CPU核数*0.7)左右

  • CPU利用率 90%
  • 内存占用 80%
  • TCP连接数
  • 磁盘使用率

定位耗用资源严重的代码

  1. 确定容器内存大小 CPU核数,JVM参数

  2. top命令查看所有进程情况可以直接取出PID,或者可以通过 ps -aux 查看快照 获取到 PID 和进程所在的文件路径

  3. top -Hp 1451 -d888 查看 PID1451下的所有线程,获取到资源占用最多的PID(线程id) -d888 代表快照888秒刷新一次 可键盘按大写 P 按照CPU使用排序, 大写 M 按照内存使用排序 获取到线程ID1452

  4. 1452转换成十六进制 5ac

  5. jstack 1451 | grep 5ac -A 30 其中1451为进程ID,1452为线程ID grep 5ac -A 30 代表从匹配5ac位置开始打印往后的30行 -B代表往前,-C代表前后各n行 正常服务器可能没有执行该命令权限,可通过下载jstack文件,在文件中搜索关键词5ac

  6. 最后得到的结果:

"main" #1 prio=5 os_prio=0 tid=0x00007ff1e0008800 nid=0x5ac waiting on condition [0x00007ff1e6697000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at com.github.me.Main.main(Main.java:7)

确定是 com.github.me.Main.main(Main.java:7)这里以后,可通过阅读代码找到问题。