Запустить процесс linux с очень низким приоритетом?

12

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

Я пытался работать с nice -20 ./low_priority_processи, nice --20 ./high_priority_processно все еще с более низким приоритетом, потреблял значительный объем ресурсов ЦП, когда требуется процесс с высоким приоритетом, как я могу запустить процесс, который будет действительно работать или даже автоматически приостанавливаться, когда другой процесс использует мощность ЦП

Урай
источник
Как вы определяете, что процесс с высоким приоритетом действительно нужен?
Муру
он порождает много потоков, или процесс потребляет более 50% процессорной мощности процессора
uray
Используйте RRпланирование для процесса с высоким приоритетом.
Рамеш
@Ramesh Какая разница изменится?
Кен Шарп

Ответы:

10

Взгляните на cgroups , он должен предоставить именно то, что вам нужно - резервирование процессора (и многое другое). Я бы посоветовал прочитать контроль приоритетов приложений, использующих cgroups .

Тем не менее, поместите важные, но часто бездействующие процессы в группу с выделенным 95% ЦП, а остальные приложения - в другое с выделенными 5% - вы получите (почти) всю мощность для ваших задач, когда это необходимо, а постоянно Энергозатратный процесс получит только 5% максимум в то время. Когда вычислительные всплески исчезнут, производительность всех процессоров будет снижена для остальных процессов. В качестве преимущества, если вы создадите специальную группу (с минимальными требованиями к производительности) для таких процессов, как sshdвы, вы сможете войти в систему, независимо от того, что пытается получить весь процессор, который он может - для этого будет отведено некоторое время процессора sshd.

peterph
источник
1
Есть ли команда, как cpulimitили niceизменить группу процесса? потому что я, если cgroup является вызовом API, я не могу перекомпилировать ни одно из этих приложений, чтобы использовать
cgroup
Нет, вы просто где-то монтируете иерархию cgroup, создаете каталоги для каждой группы и записываете PID процессов в некоторые файлы. Все это должно быть сделано от имени пользователя root (или, точнее, с соответствующими привилегиями). Некоторые системы инициализации (а именно systemd, по крайней мере, в некоторых случаях) «крадут» интерфейс cgroups у пользователей, которые должны использовать интерфейс системы init (обычно это специальная команда). Прочитайте связанный ответ и статью в Википедии. В самом деле. :)
Петер
Да, и есть также libcgroupпакет, который поставляется с утилитами для работы с cgroups, включая daemon ( cgrulesengd), который может фактически сортировать процессы в группы в зависимости от некоторых условий.
Петер
7

Если приоритет процесса (хорошее значение) низкий, он не будет прерывать процесс с более высоким приоритетом. Причина вы видите процесс низкого приоритета по- прежнему потребляют значительное количество ресурсов ЦП, выше приоритет процесс работает потому , что чем выше приоритет процесс не что занят. Вероятно, жду на IO. Используйте chrt -p -i 0 $PIDдля запуска процесса с еще более низким приоритетом, чем nice 19 -p $PID(при условии, что мы говорим о Linux здесь).

chrt -p -i 0 $PID помещает процесс в «истинный» планировщик простоя.

http://linux.die.net/man/1/chrt

Кен Шарп
источник
2
chrt -p -i 0 $ PID
Роберт Фосс
CHRT все еще не достаточно. То, что я пытаюсь сделать, это смотреть видео, перекодируя другие видео в фоновом режиме. Использование chrt помогло с видео на YouTube, но mkvs очень высокого качества по-прежнему пропускают. Я хотел, чтобы мое видео воспроизводилось нормально, но использовал каждый бит мощности процессора, оставшийся для перекодирования, потому что у меня огромный пакет.
согер
0

Попробуйте этот пример, чтобы запустить процесс как процесс с низким уровнем.

Если ты работаешь хорошо, tar xvf asets.zip

использование

хороший tar xvf assets.zip

После этого выпуска

сверху, чтобы следить за процессом распаковать с

PS Aux | grep "tar"

Попробуйте что-то конкретное с cpulimit

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 python 0 9999999999> / dev / null &

unixmiah
источник
да, -20это «низкий приоритет» и --20«высокий приоритет», посмотрите на двойную черту для niceкоманды. и да, я полностью понимаю, о хорошем значении, но мой вопрос в том, есть ли способ отличить планировщик от использования хорошего значения
uray
2
@ user77710 ты уверен? Ни справочная страница Ubuntu, ни справочная страница POSIX не определяют этот синтаксис. И использовать -n -20, -n 20и т. Д.
Муру
да что угодно, синтаксис не важен, моя точка зрения заключается в том, что хорошее значение очень низкое и очень высокое для обоих процессов не дает того, что я хотел
uray
2
@ user77710 ЧТО? "синтаксис не важен"? Как вы можете быть уверены, что вы устанавливаете значения милости тогда?
Муру
потому что я могу видеть, что процесс имеет хорошее значение htopили topили psили что-то еще
uray
-1

Для будущих посетителей, вот полный пример niceсо стрессом .

  1. Тестовая машина имеет 2 процессора
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Установить stress:apt-get install stress
  2. Сделайте 2 ЦП занятыми вызовом стресса с низким приоритетом: nice -20 stress --cpu 2
  3. Проверьте использование процессора с помощью top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

Это показывает, что оба процессора полностью заняты.

  1. Запустите процесс стресса с одним процессором с высоким приоритетом: nice --20 stress --cpu 1
  2. Проверьте использование процессора еще раз с top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

Это показывает, что процесс нагрузки одноядерного процессора получает полную загрузку процессора, тогда как процессы с более низким приоритетом совместно используют оставшийся 1 процессор

  1. С другой стороны, если убить все вышеперечисленные stressвызовы и просто запустить один трехпроцессный процесс stress --cpu 3, каждый из них получит по 66% ЦП.
Шади
источник