我猜一定会有同学会说,平均负载不就是单位时间的 CPU 使用率吗?上面 2.85,就代表 CPU 使用率是 285%。其实不是这样的。
CPU 负载值在 Linux 系统中表示正在运行,处于可运行状态的平均作业数(读取一组与流程执行线程对应的机器语言的程序指令),或者非常重要,休眠但不可中断(不可交错的休眠状态))。也就是说,要计算 CPU 负载的值,只考虑正在运行或等待分配 CPU 时间的进程。不考虑正常的休眠过程(休眠状态),僵尸或停止的过程。
简单来说,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
进程状态代码 R 正在运行或可运行(在运行队列中) D 不间断休眠(通常为IO) S 可中断休眠(等待事件完成) Z 失效/僵尸,终止但未被其父 T 停止,由作业控制停止信号或因为它被追踪 [...]
性能基础之理解Linux系统平均负载和CPU使用率
这里先解释下,可运行状态和不可中断状态。
可运行状态的进程,指的是正在使用CPU或者正在等待CPU的进程,也就是我们常用 ps 命令看到处于 R 状态(Running 或 Runnable)的进程。
不可中断状态的进程,指的是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如常见是等待硬件设备的 I/O 响应。也就是我们在Ps 命令看到的D状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。 比如,当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时间的进程就处于不可中断状态。如果此时的进程被打断,就容易出现磁盘数据与进程数据不一致的问题。
举个例子,如果你的计算机装了 2 个 CPU,会发生什么情况呢? 2 个 CPU,意味着计算机的处理能力翻了一倍,能够同时处理的进程数量也翻了一倍。 还是用大桥来类比,两个 CPU 就意味着大桥有两根车道了,通车能力翻倍了
性能基础之理解Linux系统平均负载和CPU使用率
所以,2 个CPU表明系统负载可以达到 2.0,此时每个 CPU 都达到 100%的工作量。推广开来,n 个 CPU 的计算机,可接受的系统负载最大为n.0。
芯片厂商往往在一个 CPU 内部,包含多个CPU核心,这被称为多核CPU。
在系统负载方面,多核 CPU 与多 CPU 效果类似,所以考虑系统负载的时候,必须考虑这台计算机有几个 CPU、每个 CPU 有几个核心。然后,把系统负荷除以总的核心数,只要每个核心的负荷不超过 1.0,就表明计算机正常运行。 怎么知道PC有多少个 CPU 核心呢?
如果我们观察在给定时间间隔内通过 CPU 的不同进程,则利用率百分比将表示相对于 CPU 执行与每个进程相对应的指令的那个时间间隔的时间部分。但这种计算只运行的进程,而不是那些正在等待,无论它们是在队列(可运行状态)还是休眠但不可中断(例如在等待输入/输出操作的结束)被认为。 因此,这个指标可以让我们了解哪些进程最大程度地挤压 CPU,但是如果系统状态过载或者未充分利用,则不能给出真实的系统状态图。
现实工作中,我们经常容易把平均负载和 CPU 使用率混淆,从上面我们知道平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括正在使用 CPU 的进程,还包括等待 CPU 和等待I/O 的进程。而 CPU使用率,从上面的解释我们知道是单位时间内繁忙程度,跟平均负载并不一定完全对应。比如: