Даже самые надёжные серверы иногда должны перезагружаться, хотя бы при замене выходящих из строя компонентов или обновлении прошивок. Также не секрет, что наличие в системе сложных контроллеров и карт расширения может замедлять время загрузки, добавляя паузы на инициализацию таких плат. Но недавно Google столкнулась с уникальным случаем: Linux-серверы, оснащённые слишком большим числом NVMe-накопителей, стали перезагружаться слишком медленно.
Дело в том, что в текущем виде API ядра Linux выполняют процесс выключения и перезагрузки системы в синхронном режиме. При этом каждый NVMe-накопитель завершает свой процесс выключения примерно за 4,5 с, и пока он не завершится, система не перейдет к выключению следующего накопителя. Но популярность NVMe растёт, и наличие в сервере десятка-двух таких SSD — уже не редкость. Следовательно, только процесс завершения работы ОС может удлиняться на минуту и более, что неприемлемо с точки зрения минимизации времени простоя серверов.
Google предлагает для ядра Linux переход на асинхронную модель процесса выключения системы, и уже разработала свой патч, сохраняющий, впрочем, совместимость со старой синхронной моделью. В текущем варианте он переводит все устройства на шине PCIe на использование асинхронной модели вызовов и вносит соответствующие изменения в драйвер NVMe. В этом случае команды на выключение отправляются последовательно сразу для всех дисков, после чего ожидается их завершение.
Источник: