'htop' 不显示正确的 CPU%,但 'top' 显示

Pet*_*r.O 13 cpu-load process

mencoder以线程 = 4运行时(在四核 CPU 上)。我注意到htop它没有显示其真正的CPU 使用率,但top确实显示了。

似乎htop只报告一个核心。这是htop的错误/限制吗?这里发生了什么?

在或或中没有显示mencoder 的其他条目。我认为100%意味着 1 个核心已达到最大值,但即使这对我来说也很奇怪;其他核心呢? pshtoptop

更新:添加了“系统监视器”输出

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Run Code Online (Sandbox Code Playgroud)

Ste*_*zzo 28

正如您自己所说,您可以点击H以显示用户线程。

只是以供将来参考(和乐趣),让我们计算的CPU利用率!

一点背景:

在现代操作系统中,有一个调度程序。它旨在确保所有进程及其线程获得公平的计算时间。我不会过多地进行调度(这真的很复杂)。但最终有一种叫做运行队列的东西。这是所有进程的所有指令排队等待轮到他们执行的地方。

任何进程都将它的“任务”放在运行队列中,一旦处理器准备好,它就会弹出它们并执行它们。例如,当程序进入睡眠状态时,它会将自己从运行队列中移除,并在准备好再次运行时返回到“行尾”。

在这个队列排序与流程做优先级(也称为‘nice值’ -即一个过程是很好的关于系统资源)。

队列的长度决定了系统的负载。例如,负载为 2.5 意味着 CPU 可以实时处理的每条指令有 2.5 条指令。

顺便说一下,在 Linux 上,此负载以 10 毫秒为间隔计算(默认情况下)。

现在进入 CPU 利用率的百分比值:

想象一下你有两个时钟,一个被调用t,它代表real time。它每秒测量一秒。我们称之为 的另一个时钟c。它仅在有处理工作时运行。这意味着,只有当一个进程计算某些东西时,时钟才会运行。这也称为 CPU 时间。系统上的每个进程“都有”其中之一。

现在可以计算单个进程的处理器利用率:

U = c/t = 0.5s / 1s = 0.5

或对于所有进程:

替代文字

在多核机器上,这当然可能导致值为 3.9,因为如果使用得当,CPU 每秒可以计算 4 秒的计算量。

维基百科提供了这个例子:

在 6-CPU UNIX 机器上运行的软件应用程序创建三个 UNIX 进程来满足用户需求。这三个进程中的每一个都创建两个线程。软件应用程序的工作均匀分布在为应用程序创建的 6 个独立执行线程上。如果不涉及等待资源,则总 CPU 时间预计为 Elapsed real time 的 6 倍。

这是一个执行此操作的小 python 片段

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %
Run Code Online (Sandbox Code Playgroud)

在理想情况下,您可以由此推断系统负载为 100 - 66.93 = 33.1%。(但实际上这是错误的,因为 I/O 等待、调度效率低等复杂的事情)

load 相比,这些计算将始终产生一个介于 0 和处理器数量之间的值,即介于 0 和 1 或 0 到 100% 之间。现在没有办法区分一台机器运行三个任务,使用 100% 的 CPU,和一台运行一百万个任务的机器,在其中任何一个任务上几乎没有完成任何工作,也是 100%。例如,如果您试图平衡多台计算机上的一堆进程,那么 CPU 利用率几乎是无用的。负载就是你想要的。

现在在现实中,这些处理时钟不止一个。例如,有一个用于等待 I/O。因此,您还可以计算 I/O 资源利用率。

这对最初的问题可能没有帮助,但我希望它很有趣。:)