- 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
100 lines
6.9 KiB
Markdown
100 lines
6.9 KiB
Markdown
# Reniced
|
|
|
|
Сервис автоматического изменения приоритета исполнения процессов. Работает по принципу периодического вылавливания
|
|
списка запущенных процессов и изменения приоритета "проклятым" и (если получится) "благословлённым" процессам.
|
|
|
|
## Зачем это нужно?
|
|
|
|
В некоторых случаях необходимо, чтобы система обладала достаточной интерактивностью, чтобы, например, нормально работала
|
|
видеосвязь в таких мессенджерах, как VK Teams.
|
|
|
|
## Как это установить и заставить работать?
|
|
|
|
### Установка reniced
|
|
|
|
Для установки и работы нам понадобятся модули, которые скорее всего с дистрибутивом не идут. Чтобы их установить нам
|
|
понадобятся собственно perl и его пакетный менеджер cpanm.
|
|
|
|
Для debian-образных дистрибутивов эти пакеты можно установить командами:
|
|
|
|
```bash
|
|
dnf install perl perl-App-cpanminus
|
|
```
|
|
|
|
Для rhel-образых - командами:
|
|
|
|
```bash
|
|
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, автоматически, при запуске системы.
|
|
Во всяком случае без танцев с бубнами и отключения "защиты" системных файлов от модификации этого не сделать. Поэтому
|
|
придётся при запуске системы логиниться и ручками писать
|
|
|
|
```bash
|
|
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. Без их мессенджера, с его "недостатками", не было бы этого костыля.
|