Назад | Перейти на главную страницу

% CPU для процесса

Глядя на вывод команды top на нашем сервере, один из моих коллег сказал мне, что тот факт, что некоторые процессы имеют менее 100% ЦП, объясняется тем, что я выполняю слишком много процессов. Он добавил, что исходя из его опыта, если я запускаю менее 6 процессов, то, вероятно, все процессы будут иметь 100% ЦП.

Я не хочу раздражать других пользователей, но сомневаюсь, что он сказал правильно. Сервер имеет 16 ядер, и текущая средняя нагрузка составляет от 10 до 11. Насколько я знаю, он не перегружен. Но я не знаю, почему некоторые процессы просто получают менее 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

Не уверен, о чем говорит ваш друг, но это звучит довольно произвольно и ... ну, явно неверно.

Процент измерения ЦП несколько вводит в заблуждение. Фактически, любой процесс, который в данный момент находится "на" ЦП, в этот момент получает 100% ЦП. Процент относится к тому, сколько процессорного времени эти процессы получили во время последней выборки времени.

Так что тот факт, что они отображают менее 100% загрузки ЦП, не является признаком проблемы.

Более подходящим показателем в вашем главном выводе является следующая строка: ЦП: 55,0% us, 1,7% sy, 0,0% ni, 42,2% id, 0,5% wa, 0,1% hi, 0,4% si, 0,0% st.

Он показывает 42% простоя ЦП. Таким образом, ваши другие процессы, какими бы они ни были, не связаны с процессором.

Ваш друг не только неправ, но и если вы сделаете то, что он говорит, это может оказаться контрпродуктивным. Если у вас 16 ядер и нагрузка 10, вам, вероятно, следует увеличить количество запущенных процессов MLTest, если в настоящее время оно ограничено только 9 и каким-либо образом настраивается. Зачем?

Ну, процесс обычно может работать только на 1 процессоре. Если процесс использует 100% ЦП, он привязан к ЦП. Итак, если вы ограничиваете и говорите, что можете использовать только 9 процессов для того, что делает MLTest, то вы можете использовать только 9 из этих 16 процессоров.

Под нагрузкой понимается количество процессов, ожидающих запуска. Очевидно, у вас есть 10 процессов, которые необходимо запустить на ЦП. Кто знает, что им нужно делать. Но если вы позволяете процессам MLTest запускаться только на нескольких ЦП (помните, по одному процессу на ЦП), тогда у вас (может) быть высокая нагрузка, потому что все эти процессы всегда выполняются или ожидают запуска. Однако, разрешив большему количеству процессов, вы сможете выполнять больше задач быстрее, и вам не придется ждать, чтобы запустить так много времени.

Однако это лишь один теоретический сценарий. Чтобы конкретно решить проблему, нужно ответить:

1) какой (процесс) ожидает запуска (вызывая нагрузку)? 2) Вы ограничиваете количество процессов MLTest, которые могут выполняться? 3) Если вы позволите запускать больше процессов MLTest, будет ли это быстрее «решать» вашу проблему / программу?

Вы можете нажать «1» (один) и top покажет статистику ЦП вверху для каждого ЦП. Вы можете найти это информативным.

Программы не просто ждут от процессора. Они ждут на диске сетевого ввода-вывода; они ждут ввода пользователя. Не каждая запущенная программа будет использовать 100% ЦП для кванта обновления top. Например, когда ничего не работает, вы видите init потребляет 100% CPU? Нет.

Это может быть вызвано рядом причин, и сначала я бы сказал, что это не повод для беспокойства или беспокойства.

Не зная ничего больше о том, что вы делаете, чем список процессов, который вы включили, и ничего не зная на самом деле о Matlab, я собираюсь предложить некоторые возможные вещи, которые происходят, что совершенно нормально и может привести к тому, что вы наблюдаем.

Однако сначала я хочу отметить, что top показывает вам среднее значение за определенный период времени, и, вероятно, очень короткое - порядка нескольких секунд. Один из ваших процессов, работающий всего лишь на 93% в течение пары секунд (а не на 100%), не имеет большого значения. Вероятно, он вернется к 100% (и другому процессу до 93%) в следующем интервале.

Вернуться к почему:

Если процесс делает что-либо, требующее системного вызова, особенно дисковый ввод-вывод, он может некоторое время бездействовать, ожидая завершения этой операции. Это приведет к загрузке ЦП <100%, поскольку часть времени блокируется при вводе-выводе. Здесь определенно сказываются процессы других пользователей. Может быть более чем достаточно ядер, но если вы все боретесь за пропускную способность одного и того же жесткого диска, тогда никто не увидит 100% загрузки процессора.

Кажется, ваше приложение использует несколько процессов или даже несколько потоков одновременно. Это может ускорить процесс до определенного момента (и это напрямую зависит от приложения и того, как оно распределяет работу). Однако это также может иметь связанные с этим затраты, когда дело доходит до связи между процессами. Если, например, каждый дочерний процесс (или поток) должен взаимодействовать друг с другом, то количество каналов связи значительно возрастает по мере увеличения количества процессов. Даже если каждый процесс взаимодействует только с главным ответственным процессом, потомки могут блокировать связь с родителем, когда родитель разговаривает с другим дочерним процессом. На самом деле это не так уж и отличается от блокировки дискового ввода-вывода.

В конце концов, даже с бесконечным количеством ядер, вы, вероятно, увидите убывающую отдачу от каждого дополнительного процесса, который вы используете для выполнения своей работы. Вероятно, где-то есть золотая середина, и, возможно, это 6, как предлагает ваш коллега. Но я бы не стал использовать его анализ (поиск <100% использования), чтобы определить, где находится эта золотая середина.