Files
reniced/README.md
eleksir 3082dd2add Implemented commandline params, updated README.md, added cpanfile, fixed couple of bugs
- Use Proc::Find instead of ps utility
- Use builtin kill instead of commandline utility
- Use setpriority instead of renice utility
- Implemented config parameter loopdelay
- Implemented config parameter cmddelay
- Implemented commandline parameter --config
- Added --help parameter
- Implemented commandline parameter --pidfile
- Added cpanfile and bootstrap.sh to bootstrap this daemon
- Optimized algo - do not send signals to already "signaled" processes, do not ionice already ioniced pids
2023-05-01 16:33:27 +03:00

6.9 KiB

Reniced

Сервис автоматического изменения приоритета исполнения процессов. Работает по принципу периодического вылавливания списка запущенных процессов и изменения приоритета "проклятым" и (если получится) "благословлённым" процессам.

Зачем это нужно?

В некоторых случаях необходимо, чтобы система обладала достаточной интерактивностью, чтобы, например, нормально работала видеосвязь в таких мессенджерах, как VK Teams.

Как это установить и заставить работать?

Установка reniced

Для установки и работы нам понадобятся модули, которые скорее всего с дистрибутивом не идут. Чтобы их установить нам понадобятся собственно perl и его пакетный менеджер cpanm.

Для debian-образных дистрибутивов эти пакеты можно установить командами:

dnf install perl perl-App-cpanminus

Для rhel-образых - командами:

apt install perl cpanminus

И далее приложение надо будет "забутстрапить". С этим есть небольшая тонкость - если у вас определена переменная PERL5LIBS, то при запуске модули будут браться из системы и каталогов, обозначенных в ней, если не определена, то только из системы. Соответственно, предполагается, что у нас запуск команды reniced будет в окружении, в котором есть всё необходимое (в cpanfile есть список всех нужных для работы библиотек), либо в системе, где все нужные либы уже установлены штатным пакетным менеджером.

Бутстрапится приложение командой

bash bootstrap.sh

При этом все либы складываются в ~/perl5. У рута это будет /root/perl5, у обычного пользователя - ${HOME}/perl5. (при этом $HOME обычно это /home/имя_пользователя). В случае MacOS пути будут иные: /var/root/perl5 для рута и ${HOME}/perl5 (при этом $HOME обычно это /Users/имя_пользователя). Собственно, тот каталог с либами далее можно переместить куда надо.

Работа с reniced

Вначале надо скопировать конфиг из example_config.json в ~/.reniced.json, если запуск планируется от пользователя (что не рекомендуется см. Caveats ниже), либо скопировать конфиг из example_config.json в /etc/reniced.json, если запуск будет от суперпользователя (рута, uid=0) и далее подправить все необходимые значения в нём.

После настройки списка процессов и приоритетов их работы, можно запускать сервис как unix daemon или как обычный процесс. Второй вариант нужен для запуска сервиса через systemd.

Аргументы командной строки

--help - краткая справка по запуску команды

--pidfile - указать положение pidfile, в который будет записываться process id (для рута по-умолчанию /run/reniced.pid, для обычного пользователя по-умолчанию /tmp/reniced-UID.pid)

--config - указать положение файла с конфигом (для рута - /etc/reniced.json, для обычного пользователя - ~/.reniced.json)

Caveats

Для MacOS

В свежих выпусках Mac OS нет возможности запускать сервисы от пользователя с uid=0, автоматически, при запуске системы. Во всяком случае без танцев с бубнами и отключения "защиты" системных файлов от модификации этого не сделать. Поэтому придётся при запуске системы логиниться и ручками писать

sudo reniced

в каталоге с reniced. Кроме того, под MacOS конфиг всегда ищется в ~/.reniced.json, а при таком запуске нужно, чтобы была выставлена переменная окружения PERL5LIB, например в ~/.zprofile.

В линуксах такой проблемы пока нет (но возможно будет, когда придут "атомарные" обДНОвления).

Для Linux

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

Общего характера

По понятным причинам, нет возможности изменять niceness до отрицательных величин, если процесс reniced запущен от обычного пользователя (uid > 0).

При запуске reniced от обычного пользователя, niceness процесса может идти только в плюс. То есть, процесс с nice=11 не получится сделать с nice=9, например (без перезапуска процесса, конечно). Зато от суперпользователя такое работает.

Special thanks

Авторам VK Teams. Без их мессенджера, с его "недостатками", не было бы этого костыля.