Установить привязку к процессору для всех процессов конкретного пользователя с помощью набора задач

У меня есть Ubuntu Server 14.04, и мне интересно, есть ли простой способ решить эту задачу.

Например, я уже могу сделать это для отдельных процессов с taskset -pac 2 29435, но есть ли способ назначить его через имя пользователя вместо идентификатора процесса?

Заранее спасибо.

1 ответ

Решение

Ничего не делать. Действительно ничего не делать.

Если ваша цель здесь состоит в том, чтобы максимально эффективно распределить ваши ресурсы, то правильное решение - оставить операционную систему для перемещения процессов в соответствующие ЦП по требованию и по мере необходимости.

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

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

Временами, когда вы можете захотеть нанести ущерб процессу, будет:

  • Вы являетесь хостинг-провайдером и предлагаете минимальную / максимальную привязку к тем ресурсам, которые доступны для потребителя ресурса.
  • Процесс написан очень плохо / плохо себя ведет и неправильно использует все ресурсы в данной системе, что приводит к остановке других процессов. Это может привести к тому, что ваша нагрузка увеличится, но "спасет" систему от ненужного использования процессора, который может быть использован для других целей. Как правило, вы стремитесь исправить программу в этом случае как правильное исправление.

Так что - ничего не делать и пусть операционная система разберется с этим. Через некоторое время ваших экземпляров (и если они действительно сильно загружены процессором) вы можете запустить команду ps -Lo psr,pid,tid $(pgrep <processname>) и вы увидите, что каждый ресурс правильно распределяется на процессоре.

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

$ ps -Lo psr,pid,tid,etime,cputime,comm $(pgrep firefox)
PSR   PID   TID     ELAPSED     TIME COMMAND
  2  3400  3400  1-07:16:10 01:22:29 firefox
  2  3400  3425  1-07:16:10 00:00:00 gdbus
  2  3400  3426  1-07:16:09 00:00:00 Gecko_IOThread
  3  3400  3427  1-07:16:09 00:00:00 Link Monitor
  1  3400  3428  1-07:16:09 00:02:50 Socket Thread
  1  3400  3429  1-07:16:09 00:00:00 firefox
  0  3400  3430  1-07:16:09 00:00:25 JS Helper
  3  3400  3431  1-07:16:09 00:00:26 JS Helper
  3  3400  3432  1-07:16:09 00:00:25 JS Helper
  1  3400  3433  1-07:16:09 00:00:25 JS Helper
  1  3400  3434  1-07:16:09 00:00:26 JS Helper
  3  3400  3435  1-07:16:09 00:00:25 JS Helper
  0  3400  3436  1-07:16:09 00:00:25 JS Helper
  0  3400  3437  1-07:16:09 00:00:26 JS Helper
  2  3400  3438  1-07:16:09 00:00:02 JS Watchdog
  2  3400  3439  1-07:16:09 00:00:00 Hang Monitor
  1  3400  3440  1-07:16:09 00:00:00 BgHangManager
  3  3400  3441  1-07:16:09 00:00:32 Cache2 I/O
  0  3400  3442  1-07:16:09 00:02:41 Timer
  3  3400  3444  1-07:16:09 00:00:00 GMPThread
  2  3400  3447  1-07:16:09 00:07:24 Compositor
  0  3400  3448  1-07:16:09 00:01:08 ImageBridgeChil
  3  3400  3449  1-07:16:09 00:00:31 ImgDecoder #1
  1  3400  3450  1-07:16:09 00:00:32 ImgDecoder #2
  3  3400  3451  1-07:16:09 00:00:31 ImgDecoder #3
  2  3400  3452  1-07:16:09 00:00:00 ImageIO
  2  3400  3453  1-07:16:09 00:04:07 SoftwareVsyncTh
  0  3400  3454  1-07:16:08 00:00:00 firefox
  2  3400  3455  1-07:16:08 00:00:00 Cert Verify
  2  3400  3456  1-07:16:08 00:00:00 IPDL Background
  0  3400  3457  1-07:16:08 00:00:37 DOM Worker
  2  3400  3458  1-07:16:08 00:00:03 HTML5 Parser
  2  3400  3462  1-07:16:07 00:00:01 mozStorage #1
  1  3400  3463  1-07:16:07 00:00:00 Proxy R~olution
  1  3400  3464  1-07:16:07 00:00:49 URL Classifier
  2  3400  3466  1-07:16:07 00:00:02 mozStorage #2
  0  3400  3467  1-07:16:07 00:00:00 gmain
  3  3400  3468  1-07:16:07 00:00:00 Cache I/O
  3  3400  3471  1-07:16:07 00:00:00 mozStorage #3
  2  3400  3477  1-07:16:07 00:00:35 DOM Worker
  2  3400  3479  1-07:16:07 00:00:00 mozStorage #4
  0  3400  3482  1-07:16:07 00:00:00 localStorage DB
  2  3400  3483  1-07:16:07 00:00:03 mozStorage #5
  1  3400  3519  1-07:15:57 00:00:00 mozStorage #6
  2  3400  3537  1-07:14:09 00:00:31 DOM Worker
  0  3400  3562  1-07:08:35 00:00:00 mozStorage #7
  0  3400  3587  1-06:59:39 00:00:00 threaded-ml
  2  3400  3597  1-06:49:40 00:00:00 mozStorage #8
  2  3400  7594  1-01:36:55 00:00:34 threaded-ml
  3  3400 11679    10:48:07 00:00:00 firefox
  2  3400 11684    10:48:07 00:00:00 typefind:sink
  2  3400 11687    10:48:07 00:00:00 typefind:sink
  1  3400 11689    10:48:07 00:00:00 typefind:sink
  0  3400 11690    10:48:07 00:00:00 mpegaudioparse0
  1  3400 11691    10:48:07 00:00:00 mpegaudioparse1
  2  3400 11692    10:48:07 00:00:00 mpegaudioparse2
  0  3400 11693    10:48:07 00:00:00 aqueue:src
  1  3400 11694    10:48:07 00:00:00 aqueue:src
  1  3400 11695    10:48:07 00:00:00 aqueue:src
  2  3400 22770    05:38:46 00:00:00 firefox
  3  3400 29803       10:17 00:00:00 DNS Res~er #226
  3  3400 30018       01:28 00:00:00 DNS Res~er #228

В этом примере я использовал firefox на моей машине, но вы можете изменить имя процесса в соответствии со своими потребностями.

Здесь я запрашиваю каждый поток, который живет в процессе. Столбцы означают следующее:

  • PSR - это номер процессора, назначенный для этой задачи.
  • PID - это идентификатор процесса.
  • TID - это идентификатор потока. (основные процессы tid равны его pid)
  • ELAPSED предоставляет общее количество времени, в течение которого процесс был запущен. В основном, количество времени, за которое оно было начато.
  • ВРЕМЯ - это общее количество времени, которое процесс фактически выполнял на ЦП.
  • COMMAND - это имя команды, объявленное процессом. Здесь вы можете видеть, что каждому фактическому потоку присваивается определенное имя, предположительно используемое для описания его назначения.

Чтобы определить процент использования процессов в течение срока их службы в процентах, вы можете выполнить следующий расчет (там я использую Firefox):

TIME     /    ELAPSED * 100  = UTIL
112570   /    4949    * 100  = 4.40

Примечание. Фактический идентификатор процесса (основной начальный поток, tid == pid) действует как "контейнер" для суммарного суммарного времени всех потоков (существующих или более не существующих) времени ЦП, поэтому вы получаете достаточно точное описание процессов все использование.

Объяснение: если время жизни процесса равно времени его процессора, это означает, что за все время, в течение которого процесс когда-либо жил, требовался и получался процессор, на котором он работал. Это будет равно 100% загрузки процессора.

Я почти уверен, что на самом деле вы обнаружите, что ваши процессы будут использовать практически не процессор.

Итак, повторяю, чтобы работать как можно более эффективно, ничего не делайте, поскольку ваше ядро ​​знает, как наилучшим образом расставить приоритеты ресурсов ЦП, чтобы наилучшим образом использовать вашу систему. Все, что вы могли бы добавить, в большинстве случаев снижает вашу общую эффективность.

Если вы не планируете каким-либо образом нанести вред процессам (и есть обстоятельства, когда вы действительно можете это сделать), вы не хотите использовать taskset, control groups или же LXC/Docker чтобы получить максимально возможную производительность.

Другие вопросы по тегам