Linux
如何調整初始 TCP 重傳超時?
對於大多數基於 LAN 的應用程序來說,初始 TCP RTO 值 3s 太長了。怎麼調低一點?有 sysctl 嗎?
請參閱這篇博文,了解如何製作一個覆蓋超時的 eBPF 程序。
總之,你需要載入這個
sockops
程序:#include<linux/bpf.h> #define SEC(NAME) __attribute__((section(NAME), used)) // TODO: assumes little-endian (x86, amd64) #define bpf_ntohl(x) __builtin_bswap32(x) SEC("sockops") int bpf_sockmap(struct bpf_sock_ops *skops) { const int op = (int) skops->op; if (op == BPF_SOCK_OPS_TIMEOUT_INIT) { // TODO: this is in jiffies, and despite `getconf CLK_TCK` return 100, HZ is clearly 250 on my kernel. // 5000 / 250 = 20 seconds skops->reply = 5000; return 1; } return 0; } char _license[] __attribute((section("license"),used)) = "GPL"; int _version SEC("version") = 1;
您可以使用以下命令編譯和載入它:
clang $CFLAGS -target bpf -Wall -g -O2 -c set_rto.c -o set_rto.o sudo bpftool prog load set_rto.o /sys/fs/bpf/bpf_sockop sudo bpftool cgroup attach /sys/fs/cgroup/unified/ sock_ops pinned /sys/fs/bpf/set_rto