当发现服务器卡慢的时候,我们首先会执行uptime或top命令,来了解系统的平均负载。
# uptime 11:31:04 up 51 min, 1 user, load average: 0.21, 0.34, 0.35 //11:31:04 当前时间 //51 min 系统运行多少时间 //1 user 正在登录的用户
最后三个就是系统在过去1分钟、5分钟、15分钟的平均负载
之前我一直以为平均负载的参数就是cpu的使用率,但是这是不准确的。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,和cpu并没有直接的关系。
可运行状态进程也就是ps命令下的R进程,是正在使用cpu或正在等待cpu的进程。
不可中断状态进程是进程正在和硬件交互,为保证安全和一致性,该进程不能被打断。
所以平均负载就是平均活跃进程数。
那么最理想的情况是每个cpu都运行一个进程,比如我的系统,cpu为1核心,最近1分钟有平均0.21进程运行,最近5分钟只有平均0.34进程运行,最近15分钟平均0.35进程运行。
平均负载多少合理
先查看下系统的cpu数量
# grep 'model name' /proc/cpuinfo | wc -l 1
如果大于cpu数量, 那么肯定是过载的。
如果等于cpu数量,说明所有的cpu刚好被用完。
只有小于cpu数量,才说明没有负载,那么多少合适呢,一般来说低于百分之70即可。
但是也要关心三个指标的趋势,如果是升高的,说明系统负载在不断降低,如果是降低的,要警惕一下,最近负载升高,会不会持续升高?
平均负载和CPU使用率
平均负载升高会不会导致cpu使用率升高?
答案是否定的。
cpu密集型进程,会导致cpu繁忙进而导致负载的升高,此时cpu使用率高。
大量等待cpu调度的进程也会导致负载升高,此时cpu使用率高。
但是io密集型进程,等待io也会导致平均负载升高,cpu不一定高。
所以负载和cpu并没有直接关系。
工具
sysstat包含了常用的Linux性能工具,用来监控和分析系统的性能。比如mpstat(多核cpu性能分析)、pidstat(进程性能分析,实时查看进程的cpu,内存,io及上下文切换)
//mpstat -P ALL 5 监控所有cpu每5秒输出一组数据 # mpstat -P ALL 5 11:59:41 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:59:46 AM all 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11:59:46 AM 0 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 # pidstat -u 5 1 12:02:32 PM UID PID %usr %system %guest %CPU CPU Command 12:02:37 PM 0 28119 0.20 0.00 0.00 0.20 0 watch 12:02:37 PM 0 28618 99.40 0.00 0.00 99.40 0 stress
上面使用stress进程导致的(stress --cpu 1 --timeout 600 模拟CPU密集型,stress还可以模拟io密集型,多进程场景)
总结
平均负载高有可能是CPU密集型进程导致的
平均负载高并不一定代表cpu使用率高,还有可能io更繁忙了
发现负载高的时候,使用mpstat和pidstat分析原因。