Выгрузку не всегда можно остановить: она нужна, просто не в часы работы магазина. Ей можно велеть уступать диск другим.
Запросы к диску ставит в очередь планировщик ввода-вывода ядра; у vda это mq-deadline (cat /sys/block/vda/queue/scheduler). Он учитывает класс ввода-вывода процесса, который задаёт команда ionice:
| Класс | Когда процесс получает диск |
|---|---|
| realtime (1) | раньше всех; ставит только root |
| best-effort (2) | на общих основаниях, это обычный класс |
| idle (3) | когда диск больше никому не нужен |
ionice -p <PID> показывает класс процесса; none: prio 0 значит, что класс не задан и процесс работает как best-effort. sudo ionice -c3 -p <PID> переводит работающий процесс в idle до его конца. Новый процесс службы получит класс из юнита — строку IOSchedulingClass=idle в разделе [Service] кладут в drop-in, как LimitNOFILE в уроке о лимитах.
wa от смены класса не упадёт: диск по-прежнему занят. Класс решает, чей запрос пойдёт первым, когда к диску ждут несколько процессов.
Ты перевёл процесс выгрузки в idle командой sudo ionice -c3 -p <PID>, а ночью служба перезапустилась. Что ionice -p покажет у её нового процесса?
-
realtime ставит root явно. По умолчанию процесс получает
none: prio 0и работает как best-effort. -
ionice меняет класс одного процесса. Новый процесс запускает systemd, и класс он берёт из юнита: без IOSchedulingClass —
none: prio 0.
Класс — свойство процесса, и новый процесс службы берёт его из юнита. В юните класса нет, поэтому ionice -p показывает none: prio 0. Чтобы класс пережил перезапуск, его пишут в юнит строкой IOSchedulingClass=idle.
Главное в шаге
-
Класс ввода-вывода решает, чей запрос к диску пойдёт первым; без класса у процесса
none: prio 0— обычный best-effort. -
sudo ionice -c3 -p <PID>переводит работающий процесс в idle до его конца. -
Чтобы класс пережил перезапуск службы, его задают в юните:
IOSchedulingClass=idle.