有客户反馈他们的一台ECS周期性地load升高,他们的业务流量并无上升,须要咱们排查是什么缘由形成的,是否由于底层异常?函数
要弄清Linux虚机load高,咱们要搞清楚Linux top命令中Load的含义。spa
在使用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的计算函数:对象