在线程数为 4 的情况下运行时mencoder
(在四核 CPU 上)。我注意到它htop
没有显示其真的CPU 使用率,但top
确实如此。
看起来顶部仅报道一个核。这是顶部? 这里发生了什么?
没有其他条目门编码器出现在ps
或htop
或top
。我假设100%意味着 1 个核心已达到最大值,但是这对我来说似乎很奇怪;其他核心怎么办?
更新:添加“系统监视器”输出
PID %CPU COMMAND
"top" 1869 220 mencoder
"htop" 1869 95 mencoder -noodml /media/...
"System Monitor" 1869 220 mencoder
答案1
正如您自己所说,您可以点击H显示用户线程。
只是备查(为了好玩),让我们计算一下 CPU 利用率!
一些背景知识:
在现代操作系统中,有一个调度程序。它旨在确保所有进程及其线程都获得公平的计算时间份额。我不会过多地讨论调度(它真的很复杂)。但最终有一个叫做运行队列。所有进程的所有指令都在这里排队等待被执行。
任何进程都会将其“任务”放入运行队列,一旦处理器准备就绪,它就会弹出并执行这些任务。例如,当程序进入睡眠状态时,它会将自己从运行队列中移除,一旦准备好再次运行,它就会返回到“队列末尾”。
此队列的排序与进程有关优先事项(也称为“好值” - 即一个过程是好的关于系统资源)。
队列的长度决定了加载系统的负载。例如,负载为 2.5 意味着 CPU 可以处理的每条指令有 2.5 条指令即时的。
顺便说一下,在 Linux 上,这个负载以 10ms 为间隔计算(默认)。
现在来看看 CPU 利用率的百分比值:
假设你有两个时钟,一个叫t
,它代表即时的。它每秒测量一秒。另一个时钟我们称之为c
。它仅在有处理时运行。这意味着,只有当一个进程计算某些东西时,时钟才会运行。这也称为 CPU 时间。系统上的每个进程都“拥有”其中之一。
现在可以计算单个进程的处理器利用率:
或者对于所有进程:
在多核机器上,这当然可能导致 3.9 的值,因为如果利用得当,CPU 每秒可以计算四秒的计算量。
维基百科提供了这个例子:
在 6-CPU UNIX 机器上运行的软件应用程序会创建三个 UNIX 进程来满足用户需求。这三个进程中的每一个都会创建两个线程。软件应用程序的工作均匀分布在为该应用程序创建的 6 个独立执行线程上。如果不涉及等待资源,则预计总 CPU 时间是实际耗用时间的六倍。
下面是一个实现此目的的 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 %
在理想情况下,您可以从中推断出系统负载为 100 - 66.93 = 33.1%。(但实际上,由于 I/O 等待、调度效率低下等复杂因素,这是错误的)
相反加载,这些计算将总是结果是介于 0 和处理器数量之间的值,即介于 0 和 1 之间或 0 到 100% 之间。现在无法区分运行三个任务的机器,使用 100% 的 CPU,和运行一百万个任务的机器,其中任何一个任务几乎没有完成任何工作,也是 100%。例如,如果您试图平衡多台计算机上的一堆进程,那么 CPU 利用率几乎毫无用处。负载就是您想要的。
实际上,处理时钟不止一个。例如,有一个用于等待 I/O。因此,您还可以计算 I/O 资源利用率。
对于原始问题来说这可能没有帮助,但我希望它很有趣。:)