查看我们服务器上的 top 输出时,我的一位同事告诉我,某些进程的“%CPU”低于 100 是因为我运行了太多进程。他补充说,根据他的经验,如果我运行的进程少于 6 个,那么所有进程的“%CPU”可能都会达到 100。
我不想给其他用户添麻烦,但我怀疑他说的是否正确。该服务器有 16 个核心,当前负载平均值在 10 到 11 之间。据我了解,它没有超载。但我不知道为什么有些进程的“%CPU”低于 100?真的是因为我吗?
感谢致敬!
以下是 top 的输出:
top - 16:34:13 up 32 days, 1:36, 12 users, load average: 10.61, 10.39, 10.22
Tasks: 380 total, 10 running, 370 sleeping, 0 stopped, 0 zombie
Cpu(s): 55.0%us, 1.7%sy, 0.0%ni, 42.2%id, 0.5%wa, 0.1%hi, 0.4%si, 0.0%st
Mem: 130766620k total, 39859784k used, 90906836k free, 849412k buffers
Swap: 47351548k total, 279456k used, 47072092k free, 19792956k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17197 tim 18 -2 1315m 1.3g 1504 R 100 1.0 4510:11 MLtest
28762 tim 18 -2 1315m 1.3g 1504 R 100 1.0 4633:01 MLtest
29249 tim 18 -2 1315m 1.3g 1504 R 100 1.0 4623:03 MLtest
29560 tim 18 -2 1315m 1.3g 1504 R 100 1.0 4626:59 MLtest
4904 tim 18 -2 1315m 1.3g 1504 R 100 1.0 4757:12 MLtest
5143 tim 18 -2 1315m 1.3g 1504 R 100 1.0 4759:40 MLtest
29389 tim 18 -2 1315m 1.3g 1504 R 99 1.0 4622:11 MLtest
5285 tim 18 -2 1315m 1.3g 1504 R 97 1.0 4758:49 MLtest
4763 tim 18 -2 1315m 1.3g 1504 R 93 1.0 4754:22 MLtest
9456 zma 18 -2 206m 85m 11m S 48 0.1 60:46.78 dropbox
7527 vals 18 -2 1266m 436m 42m S 4 0.3 613:57.10 MATLAB
2903 root 15 -5 0 0 0 S 1 0.0 19:00.01 rpciod/0
19133 vals 18 -2 1380m 503m 42m S 1 0.4 798:47.99 MATLAB
12454 tim 18 -2 19248 1588 1024 R 1 0.0 0:48.88 top
12 root RT -5 0 0 0 S 1 0.0 35:01.05 migration/3
2924 root 15 -5 0 0 0 S 1 0.0 27:20.92 nfsiod
12690 jun 18 -2 913m 84m 2684 S 1 0.1 121:55.65 MATLAB
19650 jun 18 -2 19244 1600 1028 S 1 0.0 6:58.41 top
6 root RT -5 0 0 0 S 0 0.0 129:49.45 migration/1
9 root RT -5 0 0 0 S 0 0.0 104:34.66 migration/2
2870 daemon 20 0 8180 404 308 S 0 0.0 5:18.91 portmap
8985 root 20 0 28484 344 264 S 0 0.0 6:24.77 hald-addon-stor
9293 root 20 0 369m 4208 2316 S 0 0.0 83:36.35 kdm_greet
24028 tim 18 -2 871m 140m 45m S 0 0.1 7:50.56 MATLAB
1 root 20 0 4104 304 224 S 0 0.0 0:03.59 init
2 root 15 -5 0 0 0 S 0 0.0 0:00.26 kthreadd
3 root RT -5 0 0 0 S 0 0.0 0:00.31 migration/0
4 root 15 -5 0 0 0 S 0 0.0 1:08.91 ksoftirqd/0
答案1
不确定你的朋友在说什么,但听起来很武断并且......显然是错误的。
CPU 百分比测量值有些误导。事实上,任何当前“占用”CPU 的进程在当时都获得了 100% 的 CPU。该百分比指的是这些进程在上一次采样期间获得了多少 CPU 时间。
因此,它们显示的 CPU 使用率低于 100% 并不表示存在问题。
顶部输出中更相关的度量是以下行:Cpu(s): 55.0%us, 1.7%sy, 0.0%ni, 42.2%id, 0.5%wa, 0.1%hi, 0.4%si, 0.0%st
它显示 CPU 的空闲时间为 42%。因此,您的其他进程(无论它们是什么)都不会受到 CPU 限制。
答案2
程序所做的不仅仅是等待 CPU。它们还等待磁盘和网络 I/O;它们等待用户输入。并非每个运行的程序都会使用 100% 的 CPU 来进行 top 的刷新量程。例如,当没有程序运行时,您是否看到init
消耗 100% 的 CPU?没有。
答案3
您可以按“1”(一),top
系统将在顶部按每个 CPU 显示 CPU 统计信息。您可能会发现这很有用。
答案4
很多因素都可能导致这种情况,首先我想说的是,这并不值得恐慌或担忧。
我对您正在做的事情一无所知,除了所包含的流程列表之外,对 Matlab 也一无所知,我将提出一些可能发生的完全正常的事情,并可能导致您所看到的结果。
不过,首先我想指出的是,top 显示的是在特定时间段内的平均值,而且这个时间段可能非常短——大约几秒钟。您的某个进程在几秒钟内仅以 93% 的速率运行(而不是 100%)并不是什么大事。在下一个时间间隔内,它可能又会恢复到 100%(另一个进程的速率降至 93%)。
回到为什么:
如果某个进程执行任何需要系统调用的操作,尤其是磁盘 I/O,它可能会空闲一段时间,等待该操作完成。这将导致 CPU 使用率低于 100%,因为部分时间它被 I/O 阻塞。其他用户的进程肯定会对此产生影响。可能内核绰绰有余,但如果你们都在争夺同一块硬盘的带宽,那么没有人会看到 100% 的 CPU 利用率。
您的应用程序似乎同时使用了多个进程甚至多个线程。这可以在一定程度上加快速度(这直接取决于应用程序及其工作分配方式)。但是,当涉及到进程之间的通信时,这也会产生相关成本。例如,如果每个子进程(或线程)都必须与其他进程通信,那么随着进程数量的增加,通信通道的数量会显著增加。即使每个进程只与负责的主进程通信,那么当父进程与另一个子进程通信时,子进程也可以阻塞与父进程的通信。这与磁盘 I/O 阻塞并没有太大区别。
最后,即使拥有无限数量的内核,您也可能会发现,随着您使用每个额外的进程来完成工作,收益会逐渐减少。可能存在一个最佳点,也许是 6 个,正如您的同事所建议的那样。但我不会使用他的分析(寻找 <100% 的利用率)来确定最佳点在哪里。