看看我们的服务器上的输出,我的一个同事告诉我,一些进程得到的CPU不到100%的事实是因为我运行了太多的进程。 他补充说,根据他的经验,如果我运行less于6个进程,那么可能所有的进程将有100“CPU%”。
我不想为其他用户烦恼,但我怀疑他说的是对的。 服务器有16个内核,当前的平均负载在10到11之间。据我所知,它不是过载的。 但是我不知道为什么有些进程只是不到100“CPU”? 真的是因为我吗?
感谢致敬!
这里是顶端的输出:
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
不知道你的朋友在说什么,但听起来很随意,而且,公然错了。
CPU措施的百分比有些误导。 实际上,目前CPU上“正在运行”的任何进程正在获得CPU的100%。 百分比是指在最后一次采样过程中,这些进程已经接收了多lessCPU时间。
所以他们显示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%的空闲时间。 所以你的其他进程,不pipe它们是什么,都不是CPU限制的。
程序不仅仅是等待CPU。 他们在磁盘上等待networkingI / O; 他们等待用户input。 并不是每个运行的程序都会使用100%的CPU来实现最高的刷新量。 例如,什么都没有运行,你看到init消耗100%的CPU吗? 没有。
您可以按“1”(一), top将显示CPU的统计数据在每个CPU的基础上。 你可能会发现这些信息。
你的朋友不仅是错误的,而且如果你做他所说的话,这很可能是反作用的。 如果你有16个内核,加载10个,那么你应该增加你正在运行的MLTest进程的数目,如果它目前仅限于9个,并且以某种方式可configuration。 为什么?
那么一个进程通常只能运行在1个CPU上。 如果进程使用了100%的cpu,那么就是cpu绑定。 所以如果你限制并说你只能使用9个进程去做任何MLTest所做的事情,那么你只能使用这16个处理器中的9个。
加载是指等待运行的进程的数量。 你显然有10个进程需要在CPU上运行。 谁知道他们需要做什么。 但是,如果只让MLTest进程在几个CPU上运行(请记住,每个CPU有一个进程),那么您(可能)的负载很高,因为所有这些进程总是在运行或等待运行。 通过更多的stream程,你可以更快地完成更多的工作,那么你就不用等那么长时间了。
然而,这只是一个理论场景。 要具体解决这个问题,你需要回答:
1)什么(进程)等待运行(造成负载)? 2)你是否可以运行MLTest进程的编号? 3)如果你让更多的MLTest进程运行,它会“更快地完成”你的问题/程序吗?
许多事情都可能导致这种情况,我首先想到的是,这不是一个警报或担心的原因。
不知道什么更多关于你在做什么,而不是你所包含的stream程列表公开,并不知道什么真正的关于Matlab,我会build议一些可能的事情正在进行是完全正常的,并可能导致你看到了。
首先,我想指出的是,top是在一定的时间内显示出一个平均值,可能是一个很短的一个 – 大约几秒钟。 你的一个进程只需要几秒钟(而不是100%)只运行93%,并不是什么大事。 在下一个时间段,可能会回到100%(不同的过程下降到93%)。
回到原因:
如果某个进程需要进行任何系统调用,特别是磁盘I / O,则可能会等待该操作完成。 这将导致<100%的CPU使用率,作为阻止I / O的时间的一部分。 其他用户的stream程在这里肯定有效果。 可能有足够多的核心,但是如果你们都在争夺同一个硬盘的带宽,那么没有人会看到100%的CPU利用率。
您的应用程序似乎一次使用多个进程甚至多个线程。 这可以加快事情的速度(这直接取决于应用程序以及如何分工)。 但是,当涉及到进程之间的通信时,这也会带来相关的成本。 例如,如果每个subprocess(或线程)必须与每个其他进程进行通信,则随着进程数量的增加,通信通道的数量将显着增加。 即使每个过程只与一个主要负责人进行沟通,那么当父母与另一个孩子交谈时,孩子们也可以阻止与父母的沟通。 这与磁盘I / O上的阻塞并不完全相同。
最后,即使核心数量无限,每增加一个工作进程,您也可能会看到收益递减。 在某个地方可能有一个甜蜜的地方,也许它是6,正如你的同事所build议的那样。 但是我不会使用他的分析(寻找<100%利用率)来确定最佳点的位置。