Найти в Дзене

Linux ускоряется на 40% от одного патча, а Microsoft уже стырила идею

Привет! Linux снова готовит всем сюрприз: один-единственный патч в .NET runtime, и вдруг серверы, микросервисы и всякие там облачные штуки начинают летать, как будто им в кофе подмешали реактивное топливо. А Microsoft? Они, как всегда, подсмотрели у соседа крутую игрушку и уже давно впихнули её аналог в Windows 11 под названием I/O Ring. Короче, классика: Linux придумал гениальную фишку, все восхитились, а потом приходит дядя Билл и говорит «это теперь наше, но с блеском и телеметрией». Всё дело в io_uring — это такая штука в ядре Linux, которая с 2019 года (Linux 5.1, привет, старичок) позволяет делать асинхронный ввод-вывод без тонны системных вызовов и переключений контекста. Представь: раньше каждый раз, когда программа хотела почитать файл или принять пакетик по сети, она стучалась в ядро, как назойливый сосед в дверь — раз за разом. io_uring же кладёт все просьбы в общую корзинку (submission queue), ядро само их обрабатывает пачками и кидает результаты обратно в другую корзинку

Привет! Linux снова готовит всем сюрприз: один-единственный патч в .NET runtime, и вдруг серверы, микросервисы и всякие там облачные штуки начинают летать, как будто им в кофе подмешали реактивное топливо. А Microsoft? Они, как всегда, подсмотрели у соседа крутую игрушку и уже давно впихнули её аналог в Windows 11 под названием I/O Ring. Короче, классика: Linux придумал гениальную фишку, все восхитились, а потом приходит дядя Билл и говорит «это теперь наше, но с блеском и телеметрией».

Всё дело в io_uring — это такая штука в ядре Linux, которая с 2019 года (Linux 5.1, привет, старичок) позволяет делать асинхронный ввод-вывод без тонны системных вызовов и переключений контекста. Представь: раньше каждый раз, когда программа хотела почитать файл или принять пакетик по сети, она стучалась в ядро, как назойливый сосед в дверь — раз за разом. io_uring же кладёт все просьбы в общую корзинку (submission queue), ядро само их обрабатывает пачками и кидает результаты обратно в другую корзинку (completion queue). Всё через общую память, без лишних звонков в дверь. Меньше суеты — больше скорости, меньше жрёт CPU. Гениально просто, как велосипед, но только для I/O.

А теперь Бен Адамс (не путать с тем, кто в раю делает гитары) — чувак из Illyriad Games, Microsoft MVP и вообще монстр в .NET — взял и переписал сокеты в .NET runtime под Linux именно на io_uring вместо старого доброго epoll. Pull request #124374 в dotnet/runtime — это уже не эксперимент, а полноценный production-grade движок на чистом C# с крошечным нативным шимом в 333 строки. Включается пока через переменную окружения DOTNET_SYSTEM_NET_SOCKETS_IO_URING=1, требует ядро 6.1+, но когда вольют — будет по умолчанию, и привет, новые рекорды.

Что обещают? В первоначальной версии описания (которая успела засветиться в Wayback Machine, потому что Бен потом скромно подчистил цифры — видимо, не хотел спойлерить до релиза) были такие вкусняшки:

- HTTP/1.1: нагрузка на CPU падает на 15–40% на запрос — потому что пакетная обработка решает проблему тонны syscall'ов в TechEmpower-бенчмарках.

- HTTP/2 на одно соединение: +5–15% пропускной способности.

- Память для неактивных соединений: минус 30–50%.

- Задержки на коротких соединениях (HttpClient между микросервисами): –10–20%.

- С базами данных (Npgsql, MySQL, Redis): задержки –5–15% на запрос.

Короче, для ASP.NET на Linux это как апгрейд с велосипеда на электросамокат — особенно в сценариях с кучей коротких соединений или burst-нагрузкой. Люди в LinkedIn и на Reddit уже называют это «engineering masterclass» и пророчат огромный буст для веб-серверов.

А Microsoft? Они не стали ждать. Ещё в 2021-м ввели свой I/O Ring в Windows 11 — почти копия io_uring, только с небольшими правками для совместимости и, конечно, с фирменным «мы всё контролируем». Так что пока Linux-девы радовались нативной фишке, Windows уже тихонько юзала её аналог. Теперь .NET на Linux догоняет и перегоняет — ирония судьбы в чистом виде.

Но есть нюанс: Бен сначала накидал все эти сочные проценты, а через пару дней переписал описание, убрав почти все цифры. Почему? Может, бенчмарки ещё дорабатывают, может, не хотят, чтобы конкуренты заранее готовились, а может, просто скромность уровня «я тут случайно ускорил весь интернет». Факт остаётся: патч открыт, тесты на 118+ кейсов, сообщество в восторге, Phoronix уже кричит о «massive performance benefits».

Для обычных смертных (вроде нас с тобой, кто юзает Linux дома) это пока не изменит загрузку YouTube на 500%, но для серверов, контейнеров, облаков — это прям подарок. А когда вольют в .NET 10 или 11 — жди, что куча хостингов и DevOps-ов тихо улыбнутся и скажут: «Спасибо, Линус и Бен, вы только что сэкономили нам тонну железа и электричества».

Linux снова доказывает: иногда один умный API круче, чем целая новая подсистема. А Microsoft? Они как тот парень, который увидел чужой велик, купил такой же, но покрасил в синий и приклеил логотип. Всё честно, все счастливы. Почти. 😏