进程的 CPU 百分比

进程的 CPU 百分比

查看我们服务器上的 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% 的利用率)来确定最佳点在哪里。

相关内容