如何计算CPU负载?

如何计算CPU负载?

top -b -n2 -d 1 | grep Cpu我正在循环中运行,并注意到它在每次迭代中返回两个条目......

1)对于每个循环,有两行结果...我应该使用第一行还是第二行...两者之间有什么区别?

2) 要计算 CPU 利用率,是否添加 %us、%sy、%ni、%hi 和 %si?

Cpu(s):  1.6%us,  1.7%sy,  0.0%ni, 96.6%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Cpu(s):  8.7%us,  9.4%sy,  0.0%ni, 81.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st


Cpu(s):  1.6%us,  1.7%sy,  0.0%ni, 96.6%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Cpu(s):  9.7%us,  8.9%sy,  0.0%ni, 81.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

答案1

  1. @garethTheRed 是正确的,您要求输出两次迭代。

  2. 这取决于“CPU 利用率”的含义。线上的每个项目代表不同的东西:

    • %us是nice 值为0 或更高的进程在用户模式下花费的时间。这包括大多数用户应用程序所做的大部分事情。
    • %sy是在内核模式下花费的时间,不属于任何其他区域。这主要是花费在系统调用上的时间。
    • %ni是nice值低于0的进程在用户模式下花费的时间。本质上,这是后台任务。
    • %id是无所事事的时间。它应该等于 100 减去其他值的总和。
    • %wa是等待 I/O 完成而未用于执行其他操作的时间。这包括等待向磁盘读取或写入数据所花费的时间。
    • %hi是内核模式服务硬件中断所花费的时间。在大多数好的系统上,这个值应该接近于零。
    • %si是花费在内核模式服务软件和延迟中断上的时间(在大多数系统上,这主要是网络中断)。
    • %st系统本来可以运行某些东西,但另一个虚拟机正忙。除非您自己运行虚拟机,或者在 EC2、GCE、DigitalOcean 或 Linode 等云托管平台上运行,否则该值应该为零。这个可能不会出现在某些系统上,尤其是旧的或非 Linux 系统。

根据大多数非程序员的定义,系统的 CPU 利用率等于%us%sy、 和的总和%ni(事实上,旧的 UNIX 系统仅显示这些值)。更准确的说法是,它等于除%id%wa、 和之外的所有值的总和%st(因为 CPU 在这些状态下实际上什么也不做)。

使用您提供的示例行,第二个定义下的利用率将为:3.4%、18.1%、3.4% 和 18.6%。

答案2

 command = "top -bn 2 -d 0.01 | grep '^Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'" 

'''
The 1st iteration of top -b returns the percentages since boot. 
We need at least two iterations (-n 2) to get the current percentage. 
To speed things up, you can set the delay between iterations to 0.01. 
top splits CPU usage between user, system processes and nice processes, we want the sum of the three. 
Finally, you grep the line containing the CPU percentages and then use gawk to sum user, system and nice processes:

top -bn 2 -d 0.01 | grep '^Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
        |      |           |             |             |------> add the values
        |      |           |             |--> keep only the 2nd iteration
        |      |           |----------------> keep only the CPU use lines
        |      |----------------------------> set the delay between runs
        |-----------------------------------> run twice in batch mode
'''

相关内容