Команда nice в Linux: задание приоритета, изменение через renice и замер доли CPU при конкуренции
Команда nice в Linux задаёт значение nice (от -20 до 19), которое определяет, сколько процессорного времени программа уступает другим задачам при работе. На сервере с AlmaLinux 9 две задачи привязали к одному ядру CPU и провели замеры с разными значениями nice: доля CPU делилась только при конкуренции за процессор, а задача с nice 19 получила всего 1,4%.
Значение у уже запущенных процессов меняет renice, а уступать на стороне диска позволяет ionice. Для всех трёх команд приведён вывод в том виде, в каком он появился при запуске от root и от обычной учётной записи.
1️⃣ Команда nice в Linux: диапазон значений и доля CPU при конкуренции
Значение nice — это число, которое задаёт, насколько процесс уступает при распределении процессорного времени; его можно задать от -20 до 19. Обычно программы запускаются с 0; -20 обслуживается первым, а 19 уступает больше всех.
Легко решить, что чем больше число, тем раньше обслуживается процесс, но со значением nice всё наоборот. Планировщик Linux назначает каждому значению nice вес и делит процессорное время в этой пропорции: у nice 0 вес 1024, у 10 — 110, у 19 — 15.
Уступка происходит только при конкуренции за CPU. Если есть свободный процессор, задача даже с nice 19 запускается без ожидания. Это как места для пассажиров с детьми в автобусе: пока они свободны, сесть может любой, а уступают их только в давке.
Таблица весов — это массив [sched_prio_to_weight] в исходном коде ядра Linux [kernel/sched/core.c]; она устроена так, что при росте значения nice на 1 процессорное время сокращается примерно на 10%.
2️⃣ Основы nice: +10 без числа и значения вне диапазона
Если после nice указать команду, она запускается с изменённым значением nice, а если ввести nice без команды, выводится значение nice текущей оболочки.
nice0В примерах ниже запущенный bash выводит собственное значение nice через [ps -o ni=]. Без -n к текущему значению прибавляется 10, а -n 5 прибавляет 5.
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5Значения вне диапазона без ошибки приводятся к граничному, поэтому -n 50 запускается с 19.
nice -n 50 bash -c 'ps -o ni= -p $$' 19Продвигать вперёд отрицательным значением может только root. Обычная учётная запись получает предупреждение [cannot set niceness], а команда всё равно выполняется с nice 0.
# обычная учётная запись
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# учётная запись root
nice -n -5 bash -c 'ps -o ni= -p $$' -5Дочерние процессы, которые запускает команда, выполненная через nice, тоже работают с тем же значением nice.
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7Поэтому, если запустить скрипт через nice, уступать будут все команды внутри него.
3️⃣ renice: изменение значения nice у запущенного процесса
nice задаёт значение только при запуске, поэтому у уже работающего процесса его меняют через renice. Сначала посмотрите PID и текущее значение в столбце NI в top или через ps.
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10Как видно по выводу, renice -n не прибавляет к текущему значению, а выставляет указанное: получается 10, а не 15 (5 плюс 10). Это не нажатие кнопки ▲ на пульте кондиционера, чтобы поднять на одно деление, а установка нужной температуры — 24 градуса.
Официальная документация util-linux тоже описывает -n как абсолютное значение, а прибавление в новых версиях выполняет параметр [--relative]. В проверенной util-linux 2.37.4 этого параметра ещё не было.
Обычная учётная запись может только повышать значение своих процессов, а однажды повышенное значение снова понизить не может.
# обычная учётная запись
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedroot может и понижать: в том же тесте значение 10 сразу сменилось на 3.
🔲 Симулятор nice · renice
В симуляторе ниже, где выполнен вход под обычной учётной записью, можно самостоятельно ввести nice и renice и увидеть, как меняется значение nice.
4️⃣ Замер доли CPU при конкуренции: nice 0 vs 0·10·19
Повышение значения nice не всегда замедляет задачу. Её доля уменьшается, только когда она конкурирует с другой задачей за тот же CPU.
Две задачи привязали к одному ядру CPU (taskset) и одновременно запустили приведённый ниже скрипт, который 5 секунд считает по одному числу. Чем больше насчитано, тем больше процессорного времени получила задача.
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nСкрипт увеличивает n на 1, пока не пройдёт 5 секунд, а затем выводит последнее значение.
Две задачи nice 0 поделили время пополам, nice 10 получила около 10%, а nice 19 — всего 1,4%. Это совпадает с пропорциями, рассчитанными по весам ядра (1024 : 110 даёт 90,3 : 9,7, а 1024 : 15 — 98,6 : 1,4).
Когда на том же ядре работала только задача nice 19, за 5 секунд она насчитала примерно от 650 000 до 1 140 000 раз. Если уступать некому, даже nice 19 использует CPU полностью; нагрузка на сервер (load average) во время теста составляла 3–5.
5️⃣ ionice: уступка на стороне диска и проверка планировщика
nice определяет только долю CPU, поэтому для задач, которые долго читают и пишут на диск, например резервного копирования, порядок доступа к диску уступают через ionice. При запуске с -c3 (idle) задача обслуживается только тогда, когда диск не использует ни одна другая программа.
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0Процесс, для которого ничего не задано, отображается как [none]; согласно документации ядра, он обслуживается в классе best-effort, а приоритет рассчитывается из значения nice для CPU.
Классы ionice действуют только при поддержке со стороны дискового планировщика; в документации ядра поддерживающими названы bfq и mq-deadline. В квадратных скобках показан планировщик, который используется сейчас.
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqНа тестовом сервере NVMe-диск работает с [none], поэтому, согласно официальной документации, ionice там может не действовать; отдельно эффект не измерялся. Имя диска можно узнать командой lsblk.
6️⃣ Где использовать nice: резервные копии · cron · wp-cli
nice стоит добавлять к долгим, но не срочным задачам. Сжатие резервной копии нагружает и CPU, и диск, поэтому nice и ionice задают вместе.
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleЕсли уже работающая задача замедляет сервер, найдите её PID в top и повысьте значение через renice; для ежедневных заданий cron добавьте nice перед командой.
0 3 * * * nice -n 10 /usr/local/bin/backup.shЕсли на сервере WordPress запускать крупные задачи wp-cli, например поиск с заменой или повторное создание изображений, с nice -n 10, то при загруженном CPU первым процессор получает php-fpm, который обрабатывает запросы посетителей.
nice -n 10 wp media regenerate --yesИ наоборот, не повышайте значение nice у php-fpm и самого веб-сервера. Если уступают процессы, отвечающие посетителям, при загруженном CPU страницы отвечают медленнее.
🔢 FAQ & рекомендуемые материалы









ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.
