5.3. 增加系统范围的 TCP 套接字缓冲区


系统范围的 TCP 套接字缓冲区临时存储内核已接收或应发送的数据。net.ipv4.tcp_rmem(读)和 net.ipv4.tcp_wmem(写)套接字缓冲区内核设置各自包含三个设置:最小值、默认值和最大值。

重要

设置太大的缓冲区大小浪费内存。每个套接字可以设置为应用程序请求的大小,内核会加倍这个值。例如,如果应用程序请求 256 KiB 套接字缓冲区大小,并打开 100 万个套接字,则系统只能将最多 512 GB RAM (512 KiB x 100万)用于潜在的套接字缓冲空间。

另外,最大缓冲区大小的值太大可能会增加延迟。

先决条件

  • 您遇到了大量的 TCP 数据包丢包率。

流程

  1. 确定连接的延迟。例如,从客户端 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
    Copy to Clipboard Toggle word wrap

    在本例中,延迟为 17 ms。

  2. 使用以下公式为您要调优的流量计算 Bandwidth Delay Product(BDP):

    connection speed in bytes * latency in seconds = BDP in bytes
    Copy to Clipboard Toggle word wrap

    例如,要计算有 17 ms 延迟的 10 Gbps 连接的 BDP :

    (10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytes
    Copy to Clipboard Toggle word wrap
  3. 根据您的要求,创建 /etc/sysctl.d/10-tcp-socket-buffers.conf 文件,并设置最大读或写缓冲区大小,或者两者:

    net.ipv4.tcp_rmem = 4096 262144 42500000
    net.ipv4.tcp_wmem = 4096 262144 42500000
    Copy to Clipboard Toggle word wrap

    指定以字节为单位的值。当您尝试识别为您的环境优化的值时,请使用以下经验法则:

    • 默认缓冲区大小(第二个值):仅稍微增加此值或将其最多设为 524288 (512 KiB)。太高的默认缓冲区大小可能会导致缓冲区崩溃,因此延迟激增。
    • 最大缓冲区大小(第三个值):两到三倍 BDP 的值通常就足够了。
  4. /etc/sysctl.d/10-tcp-socket-buffers.conf 文件载入设置:

    # sysctl -p /etc/sysctl.d/10-tcp-socket-buffers.conf
    Copy to Clipboard Toggle word wrap
  5. 如果您已更改了 net.ipv4.tcp_rmemnet.ipv4.tcp_wmem 参数中的第二个值,请重启应用程序以使用新的 TCP 缓冲区大小。

    如果您只更改了第三个值,则不需要重启应用程序,因为自动调优会动态应用这些设置。

验证

  1. 可选:使用 iperf3 测试 TCP 吞吐量
  2. 使用您在遇到数据包丢弃时使用的相同的方法来监控数据包丢弃统计信息。

    如果数据包丢弃仍然发生,但比率较低,请进一步增加缓冲区大小。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部