После того как мы сделали обзор нативной поддержки NVMe от Microsoft, реализованной в операционной системе Windows Server 2025, многие пользователи попросили нас провести непосредственное сравнение производительности NVMe накопителей под управлением ОС Windows Server 2025 с нативной поддержкой NVMe и под управлением серверной ОС на базе Linux. Один энтузиаст с Reddit даже пообещал поставить нам пива за этот обзор. За неимением других вариантов, мы решили провести на Linux те же самые тесты.

Ядро Linux поддерживает NVMe начиная с версии 3.3, выпущенной в марте 2012 года. Примерно с того же времени протокол поддерживается системой Windows Server (не нативно, а посредством преобразования команд NVMe в команды SCSI) – начиная с версии 2012 R2, вышедшей в октябре 2013 года. И спустя более десяти лет пользователи продолжают спорить, какая ОС – Windows или Linux – более эффективно управляет накопителями. Поэтому мы тоже решили подкинуть материала для дискуссий и предлагаем сравнить результаты бенчмарков.
Поскольку мы тестировали Windows Server 2025, используя как нативный, так и не-нативный стек для накопителей, то, соответственно, для оценки взяли также два стека на Linux. Для бенчмарков FIO мы использовали libaio и io_uring – два наиболее популярных API для транзакций подсистемы хранения данных. Хотя io_uring – значительно новее и предлагает многочисленные улучшения в части асинхронного ввода/вывода, libaio остается широко популярным благодаря своей гибкости и простоте использования [см. Didona, D., Pfefferle, J., Ioannou, N., Metzler, B., & Trivedi, A. (2022, June 13). Understanding Modern Storage APIs: A systematic study of libaio, SPDK, and io_uring. SYSTOR ’22, 120-121.]. Всесторонний обзор архитектуры обоих стеков выходит за рамки данной статьи, но мы приводим здесь результаты для сравнения их по эффективности с нативным и не-нативным стеками Windows Server.
Все варианты программных стеков для NVMe тестировались на одной и той же аппаратной серверной платформе. Чтобы гарантировать максимум пропускной способности, мы использовали систему с двумя 128-ядерными процессорами AMD EPYC 9754, 768 ГБ памяти DDR5-4800 MT/с и 15 дисками Solidigm P5316 30.72 TB NVMe SSD PCIe 4.0 в конфигурации JBOD.
Как мы уже отмечали в предыдущей статье, размер логического блока данных в SSD Solidigm P5316 составляет 64 килобайта, и это значит, что скорость записи с меньшими размерами блока (например, в тестах с размером блока 4 КБ, или 4K) часто бывает ниже ожидаемой. Как обычно, мы запускали тесты с различными размерами блоков данных – 4K, 64K и 128K – чтобы получить результаты для широкого диапазона сценариев чтения/ записи.
В качестве примера ОС Linux мы выбрали версию Ubuntu Server 24.04.4 LTS, ввиду ее популярности и долгосрочной поддержки. По умолчанию она работает на ядре Linux 6.8, которое не является ни самым новым, ни самым продвинутым, но, вероятно, представляет большую часть Linux-конфигураций в мире.
| Тест | Случайное чтение 4K | Случайное чтение 64K | ||||||
| Метрика | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring |
| Пропускная способность, ГиБ/с | 6.1 | 10.058 | 9.198 | 9.504 | 74.291 | 91.165 | 77.517 | 77.7 |
| IOPS | 1598959 | 2636516 | 2411000 | 2491000 | 1217176 | 1493637 | 1270000 | 1273000 |
| Средняя задержка, мс | 0.169 | 0.104 | 0.198 | 0.192 | 0.239 | 0.207 | 0.377 | 0.376 |
| Потребление ресурсов CPU, % | 72.67 | 74.22 | 99.77 | 99.76 | 68.44 | 65.11 | 83.16 | 84.72 |
| Тест | Последовательное чтение 64K | Последовательное чтение 128K | ||||||
| Метрика | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring |
| Пропускная способность, ГиБ/с | 35.596 | 35.623 | 31.867 | 31.433 | 86.791 | 92.562 | 97.05 | 97 |
| IOPS | 583192 | 583638 | 522000 | 515000 | 710978 | 758252 | 795000 | 795000 |
| Средняя задержка, мс | 0.809 | 0.812 | 0.919 | 0.932 | 0.613 | 0.608 | 0.603 | 0.604 |
| Потребление ресурсов CPU, % | 44.89 | 37.11 | 53.94 | 41.74 | 61.56 | 49.56 | 75.14 | 76.90 |
| Тест | Случайная запись 4K | Случайная запись 64K | ||||||
| Метрика | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring |
| Пропускная способность, ГиБ/с | 1.803 | 1.756 | 1.876 | 1.815 | 7.654 | 7.655 | 7.652 | 7.651 |
| IOPS | 472725 | 460383 | 492000 | 476000 | 125391 | 125406 | 125000 | 125000 |
| Средняя задержка, мс | 0.992 | 1.028 | 0.974 | 1.007 | 3.814 | 3.816 | 3.827 | 3.828 |
| Потребление ресурсов CPU, % | 26.00 | 20.67 | 45.76 | 22.80 | 12.22 | 9.33 | 20.07 | 10.90 |
| Тест | Последовательная запись 64K | Последовательная запись 128K | ||||||
| Метрика | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring | Windows Non-Native | Windows Native | Linux libaio | Linux io_uring |
| Пропускная способность, ГиБ/с | 44.67 | 50.087 | 52.283 | 52.25 | 50.477 | 50.079 | 52 | 52.083 |
| IOPS | 731859 | 820603 | 856000 | 856000 | 413495 | 410232 | 426000 | 427000 |
| Средняя задержка, мс | 0.399 | 0.558 | 0.560 | 0.560 | 1.022 | 1.149 | 1.126 | 1.125 |
| Потребление ресурсов CPU, % | 70.44 | 57.78 | 61.88 | 62.75 | 58.44 | 47.33 | 61.49 | 44.27 |
Примечание: показатели IOPS в тестах под Linux округлены до тысяч, так как FIO по-разному записывает эти результаты для Windows Server 2025 и Ubuntu Server 24.04.4 LTS. Показатели пропускной способности, задержки и использования ресурсов CPU округляются одинаково для обеих платформ.
Что мы видим сразу: Ubuntu не превосходит Windows во всех аспектах. Хотя libaio и io_uring обеспечивают отличную пропускную способность случайного чтения, они не достигают уровня производительности нативного NVMe-стека Microsoft. В тестах на случайное чтение 64K ядро Windows NT обгоняет ядро Linux примерно на 17%, с результатом нативного NVMe-стека 91.165 ГиБ/с против лучшего результата io_uring 77.7 ГиБ/с.

Однако для банды альтернативщиков Торвальдса еще не все потеряно. Ubuntu Server чуть-чуть опережает Windows Server в одном из тестовых сценариев чтения: это последовательное чтение 128K. Здесь лучший результат принадлежит Linux libaio – 97.05 ГиБ/с против 92.562 ГиБ/с нативного NVMe-стека Windows, преимущество составляет около 5%. Это показывает, что Linux может удерживать минимальное преимущество, когда размер блоков чтения больше, чем размер логического блока данных в SSD.

Пропускная способность случайной записи под Linux и под Windows практически одинакова, особенно в тестах 64K. В этих тестах разница между лучшим и худшим результатом составляет всего 0.05%, и это показывает, что все стеки для NVMe полностью реализуют потенциал дисков.
Интересно, что ядро Linux 6.8 претендует на победу в последовательном чтении с размером блоков 64K и 128K. Хотя разница невелика, в обоих тестах программные стеки с открытым исходным кодом превосходят нативный NVMe-стек Windows Server примерно на 2 ГиБ/с.

Показатели задержки в целом повторяют тренд пропускной способности, что лучше всего видно на примере результатов случайного чтения. К сожалению для Тукса, libaio и io_uring дают более высокую задержку, с наибольшей разницей 0.17 мс в тесте на случайное чтение 64K: 0.207 мс нативного NVMe-стека Windows Server против 0.377 мс libaio.

Возможно, самое впечатляющее откровение этих бенчмарков – это солидная разница в загрузке CPU стеками Windows Server 2025 и Ubuntu Server 24.04.4 LTS. В трех из четырех тестов на случайное и последовательное чтение нативный NVMe-стек Windows Server меньше всего нагружает процессор. Самую заметную разницу мы видим в тесте на последовательное чтение 128K, где Windows использует на 27.34% меньше ресурсов CPU, чем Linux.


Немного лучшие с точки зрения загрузки процессора результаты libaio и io_uring демонстрируют в тестах на случайную и последовательную запись, но этого недостаточно, чтобы помешать нативному NVMe-стеку Windows Server победить в трех из этих бенчмарков. Заметным исключением из этого ряда стал результат libaio в тесте на случайную запись 4K – задействование 45.76% системных ресурсов CPU, в то время как другие стеки использовали около 20%.

Как показывают наши результаты, Windows Server и Ubuntu Server обеспечивают достаточно близкую производительность в тестах со случайным и последовательным доступом с различными размерами блоков данных. В части пропускной способности Windows Server 2025 с нативной поддержкой NVMe в целом превосходит Linux в большинстве тестов на чтение, в то время как Linux отвечает немного лучшими результатами в тестах на запись. Показатели задержки дают похожую картину, но действительно значительное достижение Windows Server 2025 – это более эффективное использование ресурсов CPU нативным NVMe-стеком.

Microsoft очевидно приложила усилия к тому, чтобы сделать свой новейший стек для накопителей лучшим, и, хотя он не всегда побеждает libaio и io_uring, общий счет – в пользу Windows Server. Эти результаты, конечно, не охватывают все пользовательские сценарии и серверные конфигурации, но они могут помочь администраторам принять решение о развертывании серверов под Windows или под Linux, когда производительность накопителей имеет более высокий приоритет, чем совместимость ОС.