我曾看到过 CPU 使用率超过 100%。这怎么可能呢?是不是因为我有四个 CPU 核心,所以 100% 并不是最大值?
另外,当程序执行此操作时,除了使用命令之外,我还可以在 top 中做什么k
?
答案1
据我所知,top 显示的 CPU 使用率与 1 个核心的功率有关,即如果您的任务占用了 200% 的 CPU,那么它就占用了两个核心。
答案2
来自顶部手册页
k: %CPU -- CPU usage
The task's share of the elapsed CPU time since the last screen
update, expressed as a percentage of total CPU time. In a true SMP
environment, if 'Irix mode' is Off, top will operate in number of
CPUs. You toggle 'Irix/Solaris' modes with the 'I' interactive com-
mand.
因此,是的,top 显示了每个核心的 CPU 百分比,但是您可以按“I”来切换此行为。
答案3
是的,如果 top 中的进程超过 100% 或 top 显示负载 >1.0,则意味着占用了多个核心,或者系统超额认购。超额认购意味着需要放到核心上的工作比物理上可管理的要多。
您top
还可以按不同的参数(如已用内存)对视图进行排序。如果您想查看可以按什么进行排序,请参阅 的帮助或手册页top
。
您还可以查看有关进程本身的各种信息,例如进程使用的虚拟内存或驻留内存、进程是否处于休眠状态或当前正在运行,以及使用的 CPU 时间。
top中的load average,如果需要的话也可以通过命令来查看uptime
。
答案4
如果启用了超线程,则显示的 CPU 使用率top
是每个 CPU 的使用率,不是核心。例如,在具有 24 个核心且每个核心有 2 个线程(总共 48 个 CPU)的服务器上,使用率可能高达 4800。运行可lscpu -p
提供有关核心和 CPU 的准确信息:
$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
...
...
...
46,22,1,1,,22,22,22,1
47,23,1,1,,23,23,23,1
我做了以下步骤来验证上述答案:
- 在服务器上,我启动了这个循环:
$ while true; do x="reee";x="asdasd";z="asdasdasd;"; done
- 在一个单独的线程上,我运行
top
并验证了 bash 是否使用了大约 100% 的 CPU:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14791 hpaknia 20 0 129156 5188 1856 R 99.7 0.0 28:08.54 bash
- 然后在同一个 top 终端中,我按下
1
查看每个 CPU 的使用情况。48 个 CPU 中只有 CPU 线程 3 使用了 100% 的 CPU:
%Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
在我的情况下,每个核心有 2 个 CPU 线程。如果top
百分比显示每个核心的使用情况,则该值必须是 50%,但事实并非如此。因为top
显示的是每个 CPU 线程的使用情况。