5.3. 增加系统范围的 TCP 套接字缓冲区
系统范围的 TCP 套接字缓冲区临时存储内核已接收或应发送的数据。net.ipv4.tcp_rmem(读)和 net.ipv4.tcp_wmem(写)套接字缓冲区内核设置各自包含三个设置:最小值、默认值和最大值。
设置太大的缓冲区大小浪费内存。每个套接字可以设置为应用程序请求的大小,内核会加倍这个值。例如,如果应用程序请求 256 KiB 套接字缓冲区大小,并打开 100 万个套接字,则系统只能将最多 512 GB RAM (512 KiB x 100万)用于潜在的套接字缓冲空间。
另外,最大缓冲区大小的值太大可能会增加延迟。
先决条件
- 您遇到了大量的 TCP 数据包丢包率。
流程
确定连接的延迟。例如,从客户端 ping 服务器来测量平均 Round Trip Time (RTT):
ping -c 10 server.example.com ... --- server.example.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 17.208/17.056/19.333/0.616 ms
# ping -c 10 server.example.com ... --- server.example.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 17.208/17.056/19.333/0.616 msCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,延迟为 17 ms。
使用以下公式为您要调优的流量计算 Bandwidth Delay Product(BDP):
connection speed in bytes * latency in seconds = BDP in bytes
connection speed in bytes * latency in seconds = BDP in bytesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,要计算有 17 ms 延迟的 10 Gbps 连接的 BDP :
(10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytes
(10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您的要求,创建
/etc/sysctl.d/10-tcp-socket-buffers.conf文件,并设置最大读或写缓冲区大小,或者两者:net.ipv4.tcp_rmem = 4096 262144 42500000 net.ipv4.tcp_wmem = 4096 262144 42500000
net.ipv4.tcp_rmem = 4096 262144 42500000 net.ipv4.tcp_wmem = 4096 262144 42500000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定以字节为单位的值。当您尝试识别为您的环境优化的值时,请使用以下经验法则:
-
默认缓冲区大小(第二个值):仅稍微增加此值或将其最多设为
524288(512 KiB)。太高的默认缓冲区大小可能会导致缓冲区崩溃,因此延迟激增。 - 最大缓冲区大小(第三个值):两到三倍 BDP 的值通常就足够了。
-
默认缓冲区大小(第二个值):仅稍微增加此值或将其最多设为
从
/etc/sysctl.d/10-tcp-socket-buffers.conf文件载入设置:sysctl -p /etc/sysctl.d/10-tcp-socket-buffers.conf
# sysctl -p /etc/sysctl.d/10-tcp-socket-buffers.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您已更改了
net.ipv4.tcp_rmem或net.ipv4.tcp_wmem参数中的第二个值,请重启应用程序以使用新的 TCP 缓冲区大小。如果您只更改了第三个值,则不需要重启应用程序,因为自动调优会动态应用这些设置。
验证
- 可选:使用 iperf3 测试 TCP 吞吐量。
使用您在遇到数据包丢弃时使用的相同的方法来监控数据包丢弃统计信息。
如果数据包丢弃仍然发生,但比率较低,请进一步增加缓冲区大小。