load高排查

概述

查看节点负载情况的命令参考这里,如何判断当前load较高呢,一般如果 load 小于 CPU 数量,属于低负载,如果大于 CPU 数量 2~3 倍,就比较高了,当然也看业务敏感程度,不太敏感的大于 4 倍算高负载。

排查方法

1.先看监控

看prometheus的node-exporter监控,如果不是因为内核导致的,一般可以看出是什么应用导致的。
file

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,状态,命令

file

  • 如果是D住了,查看D在哪里
cat /proc/<PID>/stack

file

  • 如果是大量进程/线程在 R 状态,那就是同时需要 CPU 的进程/线程数过多,CPU 忙不过来了,可以利用 perf 分析程序在忙什么:
perf top -p <PID>

file

3.线程数过多

如果 load 高但 CPU 利用率不高,就是上面说的线程数过多。

  • 查看系统允许创建的进程数:
cat /proc/sys/kernel/pid_max

file

  • 修改方式:
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

file

找出线程数量较多的进程,可能就是某个容器的线程泄漏,导致 PID 耗尽,触发PIDPressure。
可以通过nsenter进入进程的网络命名空间,查看ip,再确认是哪个pod导致的。

nsenter -t 3562 -n ip a
k get po -o wide -A | grep 10.100.219.106

file

4.陷入内核态过久即sys占用过高

有些时候某些 CPU 可能会执行耗时较长的内核态任务,比如大量创建/销毁进程,回收内存,必须要执行完才能切回用户态。如果这种任务较多,整体的 CPU system 占用就会较高,影响到用户态进程任务的执行,对于业务来说,就是 CPU 不够用,处理就变慢,发生超时。

5.IOWAIT 较高

IO 设备的速度跟不上 CPU 的处理速度,CPU 需要在那里干等,这里的等待实际也占用了 CPU 时间,导致系统负载升高。

top 中 wa 通常是 0%,如果经常在 1% 之上,说明存储设备的速度已经太慢,无法跟上 cpu 的处理速度。

file

  • 检查设备是否 hang 住
    看是否有设备的 %util 为90-100%,如果有那基本 hang 住了
iostat -xhd 2

file

  • 观察高 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

file

  • 观察高 IO 进程
iotop -oP
# 展示 I/O 统计,每秒更新一次
pidstat -d 1
# 只看某个进程
pidstat -d 1 -p 3394470

file

  • 使用 ebpf 抓高 IOPS 进程
    安装 bcc-tools:
yum install -y bcc-tools

分析过程:

  1. 获取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

file

  1. 查看进程树
pstree -apnhs 2702

file

  1. 追踪线程
timeout 10 strace -fp 1040 > strace.txt 2>&1

file

  1. 查看磁盘挂载情况,过滤高io目录
    file
  2. 合并排序,使用脚本分析哪些文件操作多
grep "/var" strace.txt > var.txt
cat var.txt | awk -F '"' '{print $2}' | sort | uniq -c | sort -n > var-sorted.txt

file

注意

如果节点的load过高,导致ssh无法正常登陆,那么可以通过vnc的方式来登陆。但即使登陆上去,也可能无法执行命令。

这时可以从虚拟化底层入手,给虚拟机发信号触发 coredump。如果用的ecs,可以提工单让ecs的售后来排查分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠是柠檬的檬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值