6.5. 增加系统范围的 UDP 套接字缓冲区
套接字缓冲区临时存储内核已收到的或应发送的数据:
- 读套接字缓冲区保留内核已收到的,但应用程序尚未读取的数据包。
- 写套接字缓冲区保留应用程序已写到缓冲区,但内核尚未传给 IP 堆栈和网络驱动程序的数据包。
如果 UDP 数据包太大,且超过缓冲区大小或数据包以太快的速度发送或接收,则内核会丢弃任何新传入的 UDP 数据包,直到数据从缓冲区中删除为止。在这种情况下,增加套接字缓冲区可以阻止数据包丢失。
设置太大的缓冲区大小浪费内存。每个套接字可以设置为应用程序请求的大小,内核会加倍这个值。例如,如果应用程序请求一个 256 KiB 套接字缓冲区大小,并打开 100 万个套接字,则系统只需要 512 GB RAM (512 KiB x 100万)用于潜在的套接字缓冲区空间。
先决条件
- 您遇到了明显的 UDP 数据包丢弃率。
流程
创建
/etc/sysctl.d/10-udp-socket-buffers.conf文件,并根据您的要求设置最大读或写缓冲区大小,或者两者:net.core.rmem_max = 16777216 net.core.wmem_max = 16777216
net.core.rmem_max = 16777216 net.core.wmem_max = 16777216Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定以字节为单位的值。本例中的值将缓冲区的最大大小设置为 16 MiB。这两个参数的默认值都为
212992字节(208 KiB)。从
/etc/sysctl.d/10-udp-socket-buffers.conf文件中载入设置:sysctl -p /etc/sysctl.d/10-udp-socket-buffers.conf
# sysctl -p /etc/sysctl.d/10-udp-socket-buffers.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将应用程序配置为使用大型套接字缓冲大小。
net.core.rmem_max和net.core.wmem_max参数定义应用程序中setsockopt()函数可以请求的最大缓冲区大小。请注意,如果您将应用程序配置为不使用setsockopt()函数,则内核使用rmem_default和wmem_default参数的值。详情请查看应用程序的编程语言的文档。如果您不是应用的开发人员,请联系开发人员。
- 重启应用程序以使用新的 UDP 缓冲区大小。
验证
使用与您在遇到数据包丢弃时使用的相同的方法来监控数据包丢弃统计信息。
如果数据包丢弃仍然发生,但比率较低,请进一步增加缓冲区大小。