问题描述
有客户反馈他们的一台 ECS 周期性地 load 升高, 他们的业务流量并没有上升, 需要我们排查是什么原因造成的, 是否因为底层异常?
要弄清 Linux 虚机 load 高, 我们要搞清楚 Linux top 命令中 Load 的含义
Load average 的值从何而来
在使用 top 命令检查系统负载的时候, 可以看到 Load averages 字段, 但是这个字段并不是表示 CPU 的繁忙程度, 而是度量系统整体负载
Load averages 采样是从 / proc/loadavg 中获取的:
0.00 0.01 0.05 1/161 29703 每个值的含义依次为: lavg_1 (0.00) 1 - 分钟平均负载 lavg_5 (0.01) 5 - 分钟平均负载 lavg_15(0.05) 15 - 分钟平均负载 nr_running (1) 在采样时刻, 运行队列的任务的数目, 与 / proc/stat 的 procs_running 表示相同意思, 这个数值是当前可运行的内核调度对象 (进程, 线程)nr_threads (161) 在采样时刻, 系统中活跃的任务的个数 (不包括运行已经结束的任务), 即这个数值表示当前存在系统中的内核可调度对象的数量 last_pid(29703) 系统最近创建的进程的 PID, 包括轻量级进程, 即线程假设当前有两个 CPU, 则每个 CPU 的当前任务数为 0.00/2=0.00 如果你看到 load average 数值是 10, 则表明平均有 10 个进程在运行或等待状态有可能系统有很高的负载但是 CPU 使用率却很低, 或者负载很低而 CPU 利用率很高, 因为这两者没有直接关系
Linux 源码中关于这一块的说明:
Load 的计算函数:
从这个函数中可以看到, 内核计算 load 采用的是一种平滑移动的算法, Linux 的系统负载指运行队列的平均长度, 需要注意的是: 可运行的进程是指处于运行队列的进程, 不是指正在运行的进程即进程的状态是 TASK_RUNNING 或者 TASK_UNINTERRUPTIBLE
Linux 内核定义一个长度为 3 的双字数组 avenrun, 双字的低 11 位用于存放负载的小数部分, 高 21 位用于存放整数部分当进程所耗的 CPU 时间片数超过 CPU 在 5 秒内能够提供的时间片数时, 内核计算上述的三个负载, 负载初始化为 0
假设最近 1515 分钟内的平均负载分别为 load1load5 和 load15, 那么下一个计算时刻到来时, 内核通过下面的算式计算负载:
- load1 -= load1 - exp(-5 / 60) -+ n (1 - exp(-5 / 60 ))
- load5 -= load5 - exp(-5 / 300) + n (1 - exp(-5 / 300))
- load15 = load15 exp(-5 / 900) + n (1 - exp(-5 / 900))
其中, exp(x) 为 e 的 x 次幂, n 为当前运行队列的长度
如何找出系统中 load 高时处于运行队列的进程
通过前面的讲解, 我们已经明白有可能系统有很高的负载但是 CPU 使用率却很低, 或者负载很低而 CPU 利用率很高, 这两者没有直接关系, 如何用脚本统计出来处于运行队列的进程呢?
每隔 1s 统计一次:
从统计出来的结果可以看到:
在 load 比较高的时候, 有大量的 nginx 处于 R 或者 D 状态, 他们才是造成 load 上升的元凶, 和我们底层的负载确实是没有关系的
最后也给大家 share 一下查 CPU 使用率比较高的线程小脚本:
- #!/bin/bash
- LANG=C
- PATH=/sbin:/usr/sbin:/bin:/usr/bin
- interval=1
- length=86400
- for i in $(seq 1 $(expr ${length} / ${interval}));do
- date
- LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20
- date
- LANG=C cat /proc/loadavg
- { LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | sed -e 's/^ *//' | tr -s '' | grep -v CPU | sort -n -r | cut -d' '-f 1 | xargs -I{} echo -n"{} + "&& echo' 0'; } | bc -l
- sleep ${interval}
- done
- fuser -k $0
来源: http://www.jianshu.com/p/3edc2c9f05e9