Linux Labs

Система изнутри: ресурсы, ядро, процессы / Ступень 5 из 12

Кто нагружает диск

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 4 из 6 · теория · 6 мин

Уступить диск

Выгрузку не всегда можно остановить: она нужна, просто не в часы работы магазина. Ей можно велеть уступать диск другим.

Запросы к диску ставит в очередь планировщик ввода-вывода ядра; у 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 от смены класса не упадёт: диск по-прежнему занят. Класс решает, чей запрос пойдёт первым, когда к диску ждут несколько процессов.

Проверь себя 1 вопрос

Ты перевёл процесс выгрузки в 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.
Ubuntu 24.04
Загрузка…