Если вы являетесь поклонником работы под управлением Linux, у нас для вас хорошие новости: эта операционная система скоро может получить значительный прирост производительности. Это связано с тем, что разработчик, вносящий вклад в .NET, подтвердил крупное обновление производительности для сокетов .NET в Linux в среде выполнения, поскольку они перерабатываются для использования собственного API ядра io_uring. Изменение было раскрыто в недавнем запросе на слияние (pull request) на GitHub, что знаменует собой значительный шаг вперед для пользователей и разработчиков, работающих с подобными нагрузками.
Для тех, кто интересуется, io_uring был представлен в ядре Linux 5.1 еще в 2019 году как современный фреймворк для асинхронного ввода-вывода (aio). Его конструкция призвана минимизировать системные вызовы и переключения контекста, что должно привести к существенному улучшению производительности как файлового, так и сетевого ввода-вывода.
Пол Мур из Microsoft, ведущий инженер-программист компании, ранее подчеркивал некоторые из этих преимуществ:

Интересно, что Microsoft заимствовала эту функцию для Windows 11, поскольку текущая реализация Windows I/O Ring API, по-видимому, в значительной степени основана на Linux io_uring, с некоторыми изменениями, внесенными, среди прочего, для обеспечения совместимости.
Запрос на слияние был выдвинут Беном Адамсом, техническим директором и соучредителем Illyriad Games, а также MVP Microsoft. Вот некоторые из «ожидаемых улучшений», которые обещает этот апгрейд в различных рабочих нагрузках и сценариях:
- Kestrel HTTP/1.1 Keep-Alive (TechEmpower Plaintext)
-
Снижение затрат ЦП на один запрос на 15–40%. TechEmpower plaintext исторически ограничен системными вызовами; пакетирование io_uring напрямую решает эту проблему.
-
- Kestrel HTTP/2 Multiplexed Streams (gRPC, Modern Web)
- Увеличение пропускной способности на соединение на 5–15%. HTTP/2 в меньшей степени зависит от ввода-вывода, чем HTTP/1.1 на уровне TCP.
- Серверы с большим количеством простаивающих соединений (WebSocket/SignalR Hubs, 10K+)
- Снижение накладных расходов на память для простаивающих соединений на 30–50%. Улучшение задержки пробуждения на 10–30%.
- Сверхнизкая задержка с SQPOLL (Игровые серверы, HFT, Real-Time)
- Снижение задержки отправки в среднем в 20 раз / P99 в 100 раз при постоянной нагрузке
- Исходящие запросы HttpClient (от микросервиса к микросервису)
- Снижение задержки на запрос на 10–20% для краткосрочных соединений.
- Драйверы баз данных (Npgsql, MySQL Connector, Redis)
- Ожидаемое улучшение: снижение задержки на запрос на 5–15%.
- UDP-нагрузки (DNS, игровые серверы, сборщики телеметрии)
- Увеличение количества пакетов в секунду для высокоскоростного UDP на 20–40%.
- Нагрузки с большим количеством подключений (балансировщики нагрузки, прокси, всплески соединений)
- Ожидаемое улучшение: увеличение количества соединений в секунду при пиковой нагрузке на 20–50%.
Интересно, что запрос на слияние с заголовком «Use io_uring for sockets on Linux» был значительно отредактирован, чтобы удалить все вышеуказанные заявления о производительности после его первоначальной публикации 17-го числа прошлого месяца. Тем не менее, он все еще доступен через архив.
Источник: Wayback Machine
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Sayan Sen




