节点负载高排查

概述

查看节点负载情况的命令参考这里,如何判断当前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

    2. 查看进程树
      pstree -apnhs 2702

      file

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

      file

    4. 查看磁盘挂载情况,过滤高io目录
      file
    5. 合并排序,使用脚本分析哪些文件操作多
      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的售后来排查分析。

0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
最旧
最新 最多投票
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x