概述
查看节点负载情况的命令参考这里,如何判断当前load较高呢,一般如果 load 小于 CPU 数量,属于低负载,如果大于 CPU 数量 2~3 倍,就比较高了,当然也看业务敏感程度,不太敏感的大于 4 倍算高负载。
排查方法
1.先看监控
看prometheus的node-exporter监控,如果不是因为内核导致的,一般可以看出是什么应用导致的。
2.登录机器查看进程
查看R和D状态的进程,再数一下进程数量,看看是 D 住还是 R。
R 代表需要 cpu,是 cpu 负载。 D 通常代表需要 IO,是 IO 负载。
ps -eL -o lwp,pid,ppid,state,comm | grep -E " R | D "
# 线程id,进程id,父进程id,状态,命令
-
如果是D住了,查看D在哪里
cat /proc/<PID>/stack
-
如果是大量进程/线程在 R 状态,那就是同时需要 CPU 的进程/线程数过多,CPU 忙不过来了,可以利用 perf 分析程序在忙什么:
perf top -p <PID>
3.线程数过多
如果 load 高但 CPU 利用率不高,就是上面说的线程数过多。
-
查看系统允许创建的进程数:
cat /proc/sys/kernel/pid_max
-
修改方式:
sysctl -w kernel.pid_max=65535
-
统计当前 PID 数量:
ps -eLf | wc -l
-
命令统计线程数排名:
printf "NUM\tPID\tCOMMAND\n" && ps -eLf | awk '{$1=null;$3=null;$4=null;$5=null;$6=null;$7=null;$8=null;$9=null;print}' | sort |uniq -c |sort -rn | head -10
找出线程数量较多的进程,可能就是某个容器的线程泄漏,导致 PID 耗尽,触发PIDPressure。
可以通过nsenter进入进程的网络命名空间,查看ip,再确认是哪个pod导致的。
nsenter -t 3562 -n ip a
k get po -o wide -A | grep 10.100.219.106
4.陷入内核态过久即sys占用过高
有些时候某些 CPU 可能会执行耗时较长的内核态任务,比如大量创建/销毁进程,回收内存,必须要执行完才能切回用户态。如果这种任务较多,整体的 CPU system 占用就会较高,影响到用户态进程任务的执行,对于业务来说,就是 CPU 不够用,处理就变慢,发生超时。
5.IOWAIT 较高
IO 设备的速度跟不上 CPU 的处理速度,CPU 需要在那里干等,这里的等待实际也占用了 CPU 时间,导致系统负载升高。
top 中 wa 通常是 0%,如果经常在 1% 之上,说明存储设备的速度已经太慢,无法跟上 cpu 的处理速度。
- 检查设备是否 hang 住
看是否有设备的 %util 为90-100%,如果有那基本 hang 住了iostat -xhd 2
- 观察高 IO 的磁盘读写情况
捕获 %util 超过 90 时 vdb 盘的读写指标,每秒检查一次while true; do iostat -xhd | grep -A1 vdb | grep -v vdb | awk '{if ($NF > 90){print $0}}'; sleep 1s; done
- 查看哪些进程占住磁盘
fuser -v -m /dev/vdb
- 观察高 IO 进程
iotop -oP # 展示 I/O 统计,每秒更新一次 pidstat -d 1 # 只看某个进程 pidstat -d 1 -p 3394470
- 使用 ebpf 抓高 IOPS 进程
安装 bcc-tools:yum install -y bcc-tools
分析过程:
- 获取io使用高的进程
cd /usr/share/bcc/tools # 需要运行一会,再ctrl+c ./biosnoop > io.txt cat io.txt | awk '{print $3,$2,$4,$5}' | sort | uniq -c | sort -rn | head -10
- 查看进程树
pstree -apnhs 2702
- 追踪线程
timeout 10 strace -fp 1040 > strace.txt 2>&1
- 查看磁盘挂载情况,过滤高io目录
- 合并排序,使用脚本分析哪些文件操作多
grep "/var" strace.txt > var.txt cat var.txt | awk -F '"' '{print $2}' | sort | uniq -c | sort -n > var-sorted.txt
- 获取io使用高的进程
注意
如果节点的load过高,导致ssh无法正常登陆,那么可以通过vnc的方式来登陆。但即使登陆上去,也可能无法执行命令。
这时可以从虚拟化底层入手,给虚拟机发信号触发 coredump。如果用的ecs,可以提工单让ecs的售后来排查分析。