跳到主要内容

Linux运维-监控数据

系统平均负载和CPU使用率

现实工作中,我们经常容易把平均负载值和CPU使用率混淆,所以在这里,我也做一个区分。

可能你会疑惑,既然平均负载代表的是活跃进程数,那平均负载高了,不就意味着CPU使用率高吗?

我们还是要回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程

而CPU使用率,是单位时间内CPU繁忙情况的统计,跟平均负载并不一定完全对应。比如:

  • CPU密集型进程,使用大量CPU会导致平均负载升高,此时两者是一致的。
  • I/O密集型进程,等待I/O也会导致平均负载升高,但CPU使用率不一定很高。
  • 大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也会比较高。

那么,在实际生产环境中,平均负载多高时,需要我们重点关注呢?

在我看来,当平均负载高于逻辑CPU数量的70%的时候,你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。

但是,70%这个数字并不是绝对的,最推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势。当发现负载有明显升高趋势时,比如说负载翻倍了,你再去做分析和调查。

获取系统平均负载

cat /proc/loadavg
# 0.32 0.29 0.13 1/357 1909

一般来说每个CPU的当前活动进程数不大于3那么系统的性能就是良好的。如果每个CPU的任务数大于5,那么就表明机器的性能有严重问题。

对于上面的例子来说,假设系统有8个CPU,那么其每个CPU在1分钟内的进程数为:0.32/8=0.04。

如何获取CPU数量呢?不同的操作系统的可能不太一样。

# Euler OS 2.0 SP8
cat /proc/cpuinfo | grep processor | wc -l
# Centos 7
# Ubuntu 22.04.3 LTS
cat /proc/cpuinfo | grep "model name" | wc -l