Ускорение на 14%: в Linux 7.3 устранят «бутылочное горлышко» для PCIe Gen5 NVMe-накопителей

от автора

Хотя окно слияния Linux® 7.2 закрылось буквально на днях, а до релиза стабильной версии остается еще около двух месяцев, разработчики уже активно готовят патчи для следующего цикла — Linux 7.3.

Одним из самых интересных изменений на старте новой волны оптимизаций может стать устранение «значительного» бутылочного горлышка, которое мешало высокоскоростным накопителям PCIe Gen5 NVMe раскрыть свой потенциал при мелкоблочном прямом вводе-выводе.

В чем проблема

Инженер компании ByteDance Фэннань Чанг (Fengnan Chang) обнаружил ограничение производительности при произвольном чтении блоков 4 КБ на SSD-накопителях PCIe Gen5 NVMe. Оказалось, что пропускная способность ограничивается на уровне операционной системы: ядро Linux тратит слишком много ресурсов процессора на обработку каждого запроса, из-за чего накопитель не может выйти на максимальную производительность. 

Проведя профилирование, инженер выявил высокий оверхед внутри подсистемы IOmap, которая отвечает за сопоставление логических адресов файлов с физическими блоками диска при прямом вводе-выводе. Вместо выполнения операций передачи данных процессор тратил много времени на выделение памяти под служебные структуры и обслуживание сложного автомата состояний IOmap. При обработке большого количества мелких запросов в секунду эти внутренние задержки стали основным сдерживающим фактором. 

Как решили

Фэннань Чанг разработал упрощенный алгоритм обработки запросов (simple dio path). Новый механизм исключает ресурсоемкие операции, если запрос соответствует ряду критериев:

  • характер операции: запрашивается только чтение данных (не запись);

  • размер запроса: объем считываемых данных не превышает размер блока файловой системы (как правило, это 4 КБ);

  • безопасность: целевой файл не должен быть зашифрован;

  • тип файловой системы: на данном этапе оптимизация реализована для EXT4 и XFS.

Хотите выиграть призы и бонусы на аренду серверов?

Приглашаем решить ИТ-кроссворд! Более 100 вопросов на разные темы из мира ИИ и машинного обучения — ежедневно с 6 по 9 июля

Зарегистрироваться →

Если запрос подходит под эти критерии, то, минуя сложный автомат состояний подсистемы IOmap и этап динамического выделения памяти, запрос по кратчайшему пути отправляется на нижние уровни стека ввода-вывода ядра Linux. Это минимизирует вычислительные задержки операционной системы при обработке мелких операций.

Результаты тестов

В связке с подсистемой io_uring на EXT4 и XFS наблюдается скачок производительности с 1,92 млн IOPS до 2,19 млн IOPS (прирост около 14%) при произвольном чтении блоков 4 КБ.

Сравнение производительности до и после оптимизации. Источник.

Сравнение производительности до и после оптимизации. Источник.

Когда ждать в продакшене

Патчи с реализацией Simple DIO для IOmap уже успешно прошли ревью и были объединены в ветку vfs-7.3.iomap Git-репозитория подсистемы VFS.

Поскольку код уже закреплен за веткой 7.3 в репозитории vfs/vfs.git, официальный пул-реквест в основную ветку Линуса Торвальдса ожидается во время окна слияния Linux 7.3. Если все пойдет по плану, релиз с этой оптимизацией выйдет в конце этого года.

ссылка на оригинал статьи https://habr.com/ru/articles/1054958/