我试图对服务器应用程序中的负载有一个实际的了解。应用程序在 TCP 连接上读取大量数据。当我使用 来检查 CPU 利用率时htop
,该进程经常报告高 (85-100+%) CPU%,尽管 CPU 可视化的数量htop
要低得多。报告的 CPU% 与top
.
示例输出 - 用户 tom pid 为 26655/26656 的进程的 CPU% 为 96.2,而我们似乎只使用了 CPU 1 的 6.9% 和 CPU 2 的 37.4%,总计 CPU 利用率为 44.3%。
1 [||| 6.9%] Tasks: 48, 128 thr; 2 running
2 [|||||||||||||| 37.4%] Load average: 0.06 0.10 0.09
Mem[|||||||||||||||||||1.10G/3.70G] Uptime: 1 day, 15:16:55
Swp[ 0K/0K]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
26655 tom 24 4 3216M 63832 13056 S 96.2 1.6 0:33.24 java -jar java_go
26656 tom 24 4 3216M 63832 13056 R 96.2 1.6 0:32.31 java -jar java_go
986 jerry 20 0 3576M 594M 18268 S 18.3 15.7 4h13:46 java -Dcom.sun.ma
1479 jerry 20 0 3576M 594M 18268 S 16.3 15.7 3h37:02 java -Dcom.sun.ma
26881 tom 20 0 129M 2392 1540 R 1.0 0.1 0:00.08 htop
运行该流程可以time
发现用户时间加上系统时间远小于实际时间,这表明可视化更加准确:
real 1m26.787s
user 0m32.344s
sys 0m23.024s
( user + sys / real = 0.6380
)
然后我htop
使用一个重复执行求幂来消耗 CPU 的无意义程序来比较这种行为。输出htop
更接近我的预期 - 相关进程消耗了 105% CPU,并且可视化显示 100% 的 CPU 1 已使用。但请注意,报告的 CPU 消耗为 105%,而总 CPU% 仅为 102.2%。
1 [||||||||||||||||||||||||100.0%] Tasks: 46, 117 thr; 2 running
2 [||| 2.2%] Load average: 0.39 0.11 0.08
Mem[|||||||||||||||||||1.06G/3.70G] Uptime: 1 day, 15:12:23
Swp[ 0K/0K]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
25636 tom 20 0 122M 4604 2032 R 105. 0.1 0:16.32 /usr/bin/python .
986 jerry 20 0 3576M 595M 18268 S 10.5 15.7 4h13:18 java -Dcom.sun.ma
1479 jerry 20 0 3576M 595M 18268 R 9.1 15.7 3h36:35 java -Dcom.sun.ma
25714 tom 20 0 129M 2360 1540 R 1.4 0.1 0:00.04 htop
1298 groot 20 0 173M 67784 11240 S 0.7 1.7 0:04.67 splunkd -p 8089 s
1247 groot 20 0 173M 67784 11240 S 0.7 1.7 9:11.01 splunkd -p 8089 s
top
为什么和中的各个流程线htop
报告的利用率远高于 中的 CPU 可视化htop
?
我早些时候开始调查这篇关于 CPU 利用率的帖子,这似乎重申了我之前的理解:CPU 利用率是<process_clock>/<wall_clock>
。我知道我们可以隐藏和显示 中的内核和用户条目htop
,但我希望这能回答为什么可视化的利用率比下面列表中的进程条目的总和更高,而不是相反。
提前致谢!
编辑:
- 操作系统:CentOS 7
- 服务器:AWS t2.medium 实例
我还阅读了有关 AWS 上 XEN 虚拟机管理程序中 CPU 被盗的信息这里,建议使用 CloudWatch 是出于扩展原因实际了解资源使用情况的更有效方法;但是,我仍然很好奇为什么htop
会报告给定进程的过多 CPU 消耗,因为此链接表明我应该看到我无法使进程的 CPU% 总和超过一定数量,而不是我应该看到这篇文章中描述的差异。