← Весь справочник

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. В песочнице IzzyLab nice -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