我熟悉顶部的工作原理。各个进程是相对于1个vcpu的,汇总是相对于所有vcpu的。
我有一个进程进行了大量的睡眠,我试图了解它对服务器的真正影响。
在顶部,我有:
%Cpu(s): 1.4 us, 1.8 sy, 0.0 ni, 96.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
38772 root 20 0 62140 15480 12108 R 7.6 1.5 0:15.15 php
我只在 /proc/cpuinfo 中列出了 1 个 CPU(以及在 /sys/devices/system/cpu/ 中)
如果这一进程使用了 7.6% 的 CPU,那么服务器怎么会空闲 96.8%呢?这不是一次性误报,顶部进程的 CPU 使用率始终是顶部报告的整个服务器使用率的 2-3 倍。
我假设 top 是从 /proc/stat 和 /proc/pid/stat 中提取的
所以考虑到这一点...
当该进程在服务器上运行时,我检查了这两个虚拟文件:
第一次检查
/进程/统计
cpu 1970483 7927 2795587 10758959 2446 0 7301 631701 0 0
/proc/38772/stat
38772 (php) S 36827 38772 36827 34816 38772 1077936128 1251 0 0 0 2809 1819
第二次检查
/进程/统计
cpu 1970572 7927 2795638 10763502 2446 0 7301 632255 0 0
/proc/38772/stat
38772 (php) S 36827 38772 36827 34816 38772 1077936128 1251 0 0 0 3098 1986
做数学...
所以,对于这个过程,我认为计算就是这样的:
3098 - 2809 = 289
1986 - 1819 = 167
对于服务器来说,应该是这样的:
1970572 - 1970483 = 89
1970572 - 1970483 = 51
...所以在我看来,top 和 /proc 都同意,不知何故,这个进程使用的 CPU 比整个服务器还要多。这怎么可能?我应该假设哪种计算更准确?
我正在运行最新的 Ubuntu 20.04 版本 (5.4.0-88-generic)
答案1
如果这一进程使用了 7.6% 的 CPU,那么服务器怎么会空闲 96.8%呢?
如果您只有一个 CPU,那么它一次只能运行一个执行线程。因此,当输出写入屏幕时,唯一使用 CPU 的就是写入屏幕。而且它使用的是当时的所有CPU。您在此处看到的值是一段时间内的平均值 - 比标题利用率数据更长的时间内每个进程的 CPU 使用率。