Установить привязку к процессору для всех процессов конкретного пользователя с помощью набора задач
У меня есть 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
чтобы получить максимально возможную производительность.