I can confirm this issue.
tested with between Server and client both connected via 10 gbps.
nginx version:
# nginx -V
nginx version: nginx/1.27.0
built by gcc 13.2.1 20231014 (Alpine 13.2.1_git20231014)
built with OpenSSL 3.1.4 24 Oct 2023 (running with OpenSSL 3.1.5 30 Jan 2024)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_v3_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fstack-clash-protection -Wformat -Werror=format-security -fno-plt -g' --with-ld-opt='-Wl,--as-needed,-O1,--sort-common -Wl,-z,pack-relative-relocs'
normal latency:
# ping 192.168.2.87 -c 3
PING 192.168.2.87 (192.168.2.87) 56(84) bytes of data.
64 bytes from 192.168.2.87: icmp_seq=1 ttl=64 time=0.188 ms
64 bytes from 192.168.2.87: icmp_seq=2 ttl=64 time=0.181 ms
64 bytes from 192.168.2.87: icmp_seq=3 ttl=64 time=0.174 ms
--- 192.168.2.87 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2055ms
rtt min/avg/max/mdev = 0.174/0.181/0.188/0.005 ms
to test this issue I did run:
tc qdisc add dev enp3s0f0 root netem delay 100ms
latency now:
# ping 192.168.2.87 -c 3
PING 192.168.2.87 (192.168.2.87) 56(84) bytes of data.
64 bytes from 192.168.2.87: icmp_seq=1 ttl=64 time=100 ms
64 bytes from 192.168.2.87: icmp_seq=2 ttl=64 time=100 ms
64 bytes from 192.168.2.87: icmp_seq=3 ttl=64 time=100 ms
--- 192.168.2.87 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 100.202/100.213/100.232/0.013 ms
throughput with high latency:
TCP
# curl --http2 -o /dev/null "https://mydomain/1000mb.bin"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1000M 100 1000M 0 0 27.5M 0 0:00:36 0:00:36 --:--:-- 28.7M
UDP
# curl --http3 -o /dev/null "https://mydomain/1000mb.bin"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
10 1000M 10 100M 0 0 631k 0 0:27:00 0:02:42 0:24:18 631k^C
As you can see switching from http2 to http3 reduces the throughput from over 230 mbps to 4 mbps. The issue is persistent no matter with what client I test, curl, firefox or chrome all report the same slow throughput via http3 nginx.