🌘 使用 io_uring、kTLS 與 Rust 建構無系統呼叫的 HTTPS 伺服器
➤ 效能極致追求:從 epoll 到 io_uring,再結合 kTLS 與 Rust 的現代伺服器架構
https://blog.habets.se/2025/04/io-uring-ktls-and-rust-for-zero-syscall-https-server.html
這篇文章深入探討如何運用 Linux 核心的 io_uring 和 kTLS 技術,搭配 Rust 程式語言,打造一個能夠在處理每個請求時,盡量減少甚至完全避免系統呼叫的 HTTPS 伺服器。作者透過建構一個名為 tarweb 的實驗性伺服器,展示瞭如何透過 io_uring 的非同步 I/O 模型、kTLS 的硬體加速加密卸載,以及 Rust 的安全性與效能,來克服傳統伺服器架構的瓶頸,進而達成極致的效能提升。
+ 這篇文章的技術細節非常紮實,特別是關於 io_uring 如何改變傳統 I/O 模型,以及 kTLS 如何加
#Linux #效能 #網路 #Rust #io_uring #kTLS #HTTPS
io_uring, kTLS and Rust for zero syscall HTTPS server

Around the turn of the century we started to get a bigger need for high capacity web servers. For example there was the C10k problem paper.

io_uring, kTLS and Rust for zero syscall HTTPS server

Around the turn of the century we started to get a bigger need for high capacity web servers. For example there was the C10k problem paper.

@arichtman I didn’t replace openssl with an overlay but as a dependency input for specific services, as I knew there would have been issues with some packages. Now I see openssl is also a dependency of the linux kernel, which makes sense, given the cryptography features the kernel supports nowadays. I incidentally enabled #kTLS beforehand as well.

Сделал простой тест на скачивание большого файла и сравнил влияние поддержки шифрования TLS на уровне ядра (kTLS) на производительность web-сервера Nginx. Тестовый файл размером 14.3 Gb разместил на файловой системе tmpfs и скачивал его утилитой curl в /dev/null. Для каждого теста использовал по 100 замеров и вычислил среднее значение.

В настройках Nginx для поддержки kTLS надо активировать поддержку sendfile().

Теперь в NixOS модуль ssl автоматически загружает в ядро, если активирован web-сервер Nginx.

Пример настройки Nginx для активации kTLS в NixOS:
services.nginx.virtualHosts."example.com" = {
kTLS = true;
extraConfig = ''
sendfile on;
'';
};

Результаты тестирования в MBit/sec с разными комбинациями Sendfile и kTLS:
1) Sendfile off, kTLS off
- HTTP/1.1 - 4 274,53
- HTTP/2 - 4 039,19
- HTTP/3 - 3 321,10

2) Sendfile off, kTLS on
- HTTP/1.1 - 3 893,23
- HTTP/2 - 3 690,46
- HTTP/3 - 3 344,11

3) Sendfile on, kTLS off
- HTTP/1.1 - 4 385,40
- HTTP/2 - 4 190,42
- HTTP/3 - 3 320,28

4) Sendfile on, kTLS on
- HTTP/1.1 - 5 558,75
- HTTP/2 - 2 340,39
- HTTP/3 - 3 306,99

Мои предположения, что kTLS поддерживает HTTP/3 протокол и то, что скорость скачивания будет достаточно высокой, по сравнению с другими протоколами, оказались неверными.

В тестах, при скачивании по HTTP/3 протоколу, ядро процессора нагружалось всего до ~60%, по сравнение в 100%, при тестировании на остальных протоколах. Предполагаю, что протокол будут дальше отлаживать и оптимизировать.

При использовании kTLS и sendfile() значительно проседает скорость скачивания по HTTP/2 протоколу. А всё из-за того, что sendfile(), при включенном kTLS, начинает работать плохо для из-за фрейминга, вызывающий большое количество syscall-ов.

По итогу, для обслуживание больших статических файлов, рекомендуется включить поддержку kTLS и использовать только HTTP/1.1 протокол. Там, где это невозможно сделать, можно отключить HTTP/2 протокол и использовать остальные протоколы - HTTP/1.1 и HTTP/3. Не смотря на то, что HTTP/3 протокол имеет более низкую скорость скачивания, по сравнению с HTTP/1.1, он всё-равно позволяет ускорить работу сайта за счёт использования других преимуществ.

Благодарю разработчиков web-сервера Nginx за консультацию и советы!

#linux #nixos #nginx #sendfile #ktls #perfomance

FreeBSD 14.0 釋出

FreeBSD 14.0-RELEASE 的公告也出來了:「FreeBSD 14.0-RELEASE Announcement」,比較完整的 release notes 在「FreeBSD 14.0-RELEASE Release Notes」。 先從官方列的 highlight 來看,首先比較重要的是 GENERIC kernel 支援 1024 cores: FreeBSD supports up to 1024 cores on...

Gea-Suan Lin's BLOG

KTLS doesn't work well with HTTP/2 because it needs framing around each chunk. If you have a typical 4k chunk size, it ends up doing a write followed by a 4k sendfile call repeatedly. It actually makes CPU overhead worse without using very large chunks. Works well for HTTP/1.1.

#ktls #http2 #sendfile

FreeBSD KTLS

> Add kernel-side support for in-kernel TLS.