nice и renice
Приоритет процесса для планировщика — значения от -20 до 19, запуск с nice -n, изменение renice -p, кто может повышать
Niceness («уступчивость») — число от -20 до 19, которое подсказывает планировщику, кому отдавать CPU в первую очередь. Чем больше число, тем процесс «вежливее» и тем меньше CPU он получит, когда за процессор идёт борьба. По умолчанию — 0. nice запускает команду с изменённым значением, renice меняет его у уже работающего процесса. Пригодится, чтобы тяжёлый бэкап или сжатие логов не мешали веб-серверу.
Синтаксис
nice # показать текущий niceness
nice [-n поправка] команда [аргументы…]
renice [-n] значение [-p] PID…
renice [-n] значение -g PGID…
renice [-n] значение -u пользователь…
nice
| Форма | Что делает |
|---|---|
nice команда | запустить с niceness на 10 больше текущего |
nice -n 5 команда | на 5 больше текущего (поправка прибавляется) |
nice -n -5 команда | на 5 меньше — повысить приоритет, только root |
nice -5 команда | устаревшая запись -n 5 (не «минус пять»!) |
nice | напечатать niceness текущей оболочки |
Результат обрезается до диапазона: nice -n 30 даст 19.
renice
| Опция | Что делает |
|---|---|
-n значение | новое значение niceness (абсолютное, а не поправка) |
-p PID… | для процессов (по умолчанию аргументы и так считаются PID) |
-g PGID… | для всех процессов группы — например, всего конвейера |
-u пользователь… | для всех процессов пользователя |
--relative N | прибавить N к текущему значению |
Выводит 17 (process ID) old priority 0, new priority 5. Код возврата 1, если хоть для одного процесса не получилось.
Кто что может
| Действие | Обычный пользователь | root |
|---|---|---|
| увеличить niceness своего процесса (понизить приоритет) | да | да |
| уменьшить niceness, даже обратно до прежнего | нет | да |
| менять чужие процессы | нет | да |
| отрицательные значения | нет | да |
Обычному пользователю можно разрешить отрицательные значения через nice в /etc/security/limits.conf. Root может всё благодаря capability CAP_SYS_NICE.
Где посмотреть
| Команда | Что показывает |
|---|---|
ps -o pid,ni,cmd -p PID | столбец NI |
ps -eo pid,ni,comm --sort=-ni | все процессы, самые «вежливые» сверху |
top | столбцы NI и PR (PR = 20 + NI); r в top — renice; строка ni в %Cpu(s) — доля CPU у процессов с положительным nice |
Примеры
# тяжёлая задача с минимальным приоритетом
nice -n 19 tar -czf /tmp/backup.tgz /etc
# в cron — то же самое
# 0 3 * * * nice -n 19 /usr/local/bin/backup.sh
# понизить приоритет уже запущенного процесса
sleep 600 &
renice -n 10 -p "$!"
ps -o pid,ni,cmd -p "$!"
# все процессы пользователя — на минимум
renice -n 19 -u alice
# всем процессам с именем gzip
renice -n 15 -p $(pgrep gzip)
# дочерние процессы наследуют niceness
nice -n 10 bash -c 'nice' # 10
# приоритет диска — отдельная настройка: idle-класс ионного планировщика
ionice -c 3 nice -n 19 find / -name '*.log' > /dev/null 2>&1
Подводные камни
- Больше — значит ниже приоритет.
19— самый «уступчивый»,-20— самый жадный. Интуиция «больше — важнее» здесь обманывает. nice -nприбавляет,renice -nзадаёт.nice -n 5из оболочки с niceness 10 даст 15;renice -n 5установит ровно 5 (а для обычного пользователя это ошибка — уменьшение).nice -5— это +5, а не −5: дефис здесь — признак опции. Отрицательное значение пишутnice -n -5илиnice --5.- Нет прав — команда всё равно запускается.
nice -n -5 командаот обычного пользователя пишет «cannot set niceness: Permission denied», но запускает команду с прежним приоритетом и возвращает её код (часто 0). Не полагайся на код возвратаnice. - Вернуть обратно нельзя без root. Пользователь, поднявший niceness своего процесса до 10, не сможет опустить его до 5.
- В контейнере даже root обычно не может ставить отрицательные значения: Docker по умолчанию отбирает
CAP_SYS_NICE. В песочнице IzzyLabnice -n -5иreniceниже текущего отвечают «Permission denied». - nice влияет только на CPU и только когда за него есть конкуренция. На простаивающей машине процесс с 19 работает так же быстро. Для диска —
ionice. - renice меняет только один поток. Для многопоточной программы
renice -p PIDизменит лишь главный поток, остальные сохранят старое значение — проверьps -L -o tid,ni -p PID. Надёжнее сразу запускать программу черезnice: потоки наследуют значение при создании.
См. также
top · ps · pgrep · background · cron · capabilities