每次发现系统变慢/卡顿时,我们通常做的第一件事,就是执行 top, uptime等命令,来了解系统的负载情况。
|
大多数人对前面几列比较熟悉,分别是当前时间/系统运行时间/正在登陆的用户。
而后面三个数字呢? 依次是过去1分钟,5分钟,15分钟的平均负载。
“平均负载” 对于很多人来说,可能即熟悉又陌生。运维的日常工作中,也都会经常提到这个词, 但是否真正理解背后的含义呢? 比如: 什么是平均负载?
很多人把平均负载认为是单位时间内的cpu使用率,上面的0.61代表cpu的使用率是63%, 其实并不是这样(可以通过man uptime查看详细解释)。
简单来说, 平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数, 它和cpu使用率并没有直接关系。
可运行状态进程,是指正在使用cpu或者正在等待cpu的进程,可以通过ps命令查看,处于R状态的进程。
不可中断进程,则是处于内核关键流程中的进程,且相关流程是不可打断的, 比如最常见的等待硬件设备i/o响应,可以通过ps命令查看,处于D状态的进程(eg: 当一个进程向磁盘读写数据时,为了保证数据一致性,在得到磁盘回复前,是不能被其他进程中断/打断的,此时,相关进程就处于不可中断状态,如果被打断,就容易出现磁盘数据和进程数据不一致的情况)。 所以: 不可中断状态是系统对进程和硬件设备的一种保护机制。
既然平均的是活跃进程数,那么最理想的,就是每个cpu上都刚好运行着一个进程,这样每个cpu都得到了充分利用。
平均负载为多少时合适?
在评判平均负载时, 首先,我们需要知道系统有几个cpu(可以通过top或者从文件/proc/cpuinfo中获取)。得到了cpu个数,我们就可以判断出,当平均负载比cpu个数还大时,系统已经出现了过载。当然,在日常工作中,我们应当根据实际环境进行监控判断(比如:阈值设置为80%,即充分利用了资源,也预留了一些应对突增的情况)。
影响平均负载的因素,包含以下几个场景:
1. cpu密集型: 使用大量cpu会导致平均负载升高,此时: cpu使用率会高。
2. i/0密集型: 等待i/o也会导致平均负载升高,但cpu使用率不一定高。
3. 大量进程型: 大量等待cpu的进程调度也会导致平均负载升高, 此时的cpu使用率也会比较高。
通常情况下, 我们可以通过top,iostat,mpstat,pidstat等工具,找出平均负载升高等根源,从而解决问题。