找到Linux虚机Load高的"元凶"

问题描述

有客户反馈他们的一台ECS周期性地load升高,他们的业务流量并无上升,须要咱们排查是什么缘由形成的,是否由于底层异常?函数

要弄清Linux虚机load高,咱们要搞清楚Linux top命令中Load的含义。spa

Load average的值从何而来

在使用top命令检查系统负载的时候,能够看到Load averages字段,可是这个字段并非表示CPU的繁忙程度,而是度量系统总体负载。线程

Load averages采样是从/proc/loadavg中获取的:code

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 源码中关于这一块的说明:
static int loadavg_proc_show(struct seq_file *m, void *v)
{
        unsigned long avnrun[3];

        get_avenrun(avnrun, FIXED_1/200, 0);

        seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
                LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
                LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
                LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
                nr_running(), nr_threads,
                task_active_pid_ns(current)->last_pid);
        return 0;
}

Load的计算函数:对象