#sendfile — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #sendfile, aggregated by home.social.
-
All you never wanted to know about creating fast socket I/O on #Linux. Unless you are a real geek.
A small, ultra-high performance publish-subscribe server doing kind of TCP #multicast using #sendfile, #io_uring, #splice, (mapped) files, and #fallocate for file hole punching.
Saturating a 10 Gbps link with useful data with just 8 cores.
A beautiful writeup for anyone into fast Linux networking. Not just for #ATproto
h/t @nohillside
#PubSub #Kernel #Hacking
https://www.asayers.com/jetrelay -
Сделал простой тест на скачивание большого файла и сравнил влияние поддержки шифрования 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,102) Sendfile off, kTLS on
- HTTP/1.1 - 3 893,23
- HTTP/2 - 3 690,46
- HTTP/3 - 3 344,113) Sendfile on, kTLS off
- HTTP/1.1 - 4 385,40
- HTTP/2 - 4 190,42
- HTTP/3 - 3 320,284) 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 за консультацию и советы!
-
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.