6.5. 增加系统范围的 UDP 套接字缓冲区


套接字缓冲区临时存储内核已收到的或应发送的数据:

  • 读套接字缓冲区保留内核已收到的,但应用程序尚未读取的数据包。
  • 写套接字缓冲区保留应用程序已写到缓冲区,但内核尚未传给 IP 堆栈和网络驱动程序的数据包。

如果 UDP 数据包太大,且超过缓冲区大小或数据包以太快的速度发送或接收,则内核会丢弃任何新传入的 UDP 数据包,直到数据从缓冲区中删除为止。在这种情况下,增加套接字缓冲区可以阻止数据包丢失。

重要

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

先决条件

  • 您遇到了明显的 UDP 数据包丢弃率。

流程

  1. 创建 /etc/sysctl.d/10-udp-socket-buffers.conf 文件,并根据您的要求设置最大读或写缓冲区大小,或者两者:

    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    Copy to Clipboard Toggle word wrap

    指定以字节为单位的值。本例中的值将缓冲区的最大大小设置为 16 MiB。这两个参数的默认值都为 212992 字节(208 KiB)。

  2. /etc/sysctl.d/10-udp-socket-buffers.conf 文件中载入设置:

    # sysctl -p /etc/sysctl.d/10-udp-socket-buffers.conf
    Copy to Clipboard Toggle word wrap
  3. 将应用程序配置为使用大型套接字缓冲大小。

    net.core.rmem_maxnet.core.wmem_max 参数定义应用程序中 setsockopt() 函数可以请求的最大缓冲区大小。请注意,如果您将应用程序配置为不使用 setsockopt() 函数,则内核使用 rmem_defaultwmem_default 参数的值。

    详情请查看应用程序的编程语言的文档。如果您不是应用的开发人员,请联系开发人员。

  4. 重启应用程序以使用新的 UDP 缓冲区大小。

验证

  • 使用与您在遇到数据包丢弃时使用的相同的方法来监控数据包丢弃统计信息。

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat