Репортаж от Wedoany,Инженер ByteDance Фэннань Чан (Fengnan Chang) разработал для ядра Linux алгоритм, упрощающий путь обработки прямого ввода-вывода, чтобы устранить узкое место производительности твердотельных накопителей NVMe PCIe Gen5 при случайном чтении блоков размером 4 КБ. Этот патч уже объединён в Git-репозиторий подсистемы VFS и, как ожидается, будет официально выпущен вместе с версией Linux 7.3 в конце этого года.
При выполнении случайного чтения блоков размером 4 КБ на NVMe SSD PCIe Gen5 инженеры обнаружили, что коренная причина ограничения пропускной способности кроется на уровне операционной системы. Ядро Linux потребляет слишком много ресурсов ЦП при обработке каждого небольшого запроса, причём особенно заметны накладные расходы подсистемы IOmap. IOmap отвечает за отображение логических адресов файлов на физические блоки диска при прямом вводе-выводе, однако выделение памяти для вспомогательных структур и поддержание сложного конечного автомата отнимают значительные вычислительные ресурсы, что становится основным узким местом, сдерживающим высокую пропускную способность.
Разработанный Фэннан Чаном упрощённый путь прямого ввода-вывода (simple dio path) снижает задержки за счёт удаления ресурсоёмких операций. Этот механизм требует одновременного выполнения четырёх условий: тип операции — только чтение; объём считываемых данных не превышает размер блока файловой системы (обычно 4 КБ); целевой файл не зашифрован; файловая система — EXT4 или XFS. Запросы, соответствующие этим условиям, обходят этапы конечного автомата и динамического выделения памяти подсистемы IOmap, направляясь по кратчайшему пути непосредственно на нижний уровень стека ввода-вывода ядра Linux.
Тесты в сочетании с подсистемой io_uring показали, что при случайном чтении блоков размером 4 КБ на EXT4 и XFS производительность выросла с 1,92 млн IOPS до 2,19 млн IOPS, то есть примерно на 14%. В настоящее время этот патч, получивший название «IOmap Simple DIO», прошёл проверку и объединён в ветку vfs-7.3.iomap Git-репозитория подсистемы VFS. Код будет передан в основную ветку Линуса Торвальдса (Linus Torvalds) для включения в окно слияния Linux 7.3.










