Linux

如何調整初始 TCP 重傳超時?

  • December 12, 2020

對於大多數基於 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

引用自:https://serverfault.com/questions/295390