准确认识系统负载
linux系统有个uptime
命令可以显示系统当前时间、系统已运行时间、登陆用户数以及系统平均负载,输出如下所示:
1
2
rongchangyu:~$ uptime
16:08:28 up 385 days, 2:47, 2 users, load average: 0.59, 0.58, 0.51
load average
后的数值就是系统负载,在公司实际生产环境中,load average
也是基础监控中非常重要的一个指标,可以反应服务器的负载情况。我刚接触这个概念的时候,认为这三个指标的含义为:在过去1min、5min、15min内所有可运行的(Runable)进程平均数值,当数值大于CPU核心数时就表示系统负载偏高,CPU资源不足了!。
然而随着深入的学习以及使用后发现并非如此,load average
的计算方法、表示的含义并非如此,或者说不准确,只有深入理解了load average
的计算才能深入理解这个指标的意义,才能更直接有效的分析系统问题、优化系统性能。
定义
通过查看uptime
的手册,在控制台执行man uptime
可以看到对系统平均负载的定义:
System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.
可以从中看出系统平均负载的含义:
- 系统在一段时间内处于可运行或不可打断状态进程的平均值。
- 可运行状态进程表示正在使用CPU或者等待CPU的进程;不可打断状态的进程为正在等待某些IO完成的进程,比如磁盘。
从这个定义中我们可以得出uptime
的三个数值分别为系统在过去1min、5min、15min内处于可运行或不可打断状态进程的平均值。可运行状态的进程好理解,当系统需要运行的进程数大于CPU核心数量,表示CPU忙不过来了,但是进程什么时候会处于uninterruptable
呢?系统负载的计算为什么需要包含uninterruptable
的进程以及这三个数值真的反应的是平均值吗?
带着这些疑问分别来探索一下uninterruptable
进程、系统负载计算的部分源码。
Linux Uninterruptible Tasks
待完成…