在 Linux 系统中,UDP 协议的接收和发送缓冲区大小可以通过内核参数进行配置。要查看 UDP 缓冲区的默认大小(即未显式设置时的初始值)以及最大限制,可以使用以下方法:
1.查看系统级别的 UDP 缓冲区默认值和限制
这些值由以下/proc文件控制:
# 接收缓冲区:min, default, max(单位:字节) cat /proc/sys/net/core/rmem_default # 默认接收缓冲区大小 cat /proc/sys/net/core/rmem_max # 最大接收缓冲区大小 # 发送缓冲区:min, default, max(单位:字节) cat /proc/sys/net/core/wmem_default # 默认发送缓冲区大小 cat /proc/sys/net/core/wmem_max # 最大发送缓冲区大小注意:虽然这些参数是“core”级别的,但它们也适用于 UDP 套接字,除非应用程序显式调用
setsockopt()设置SO_RCVBUF或SO_SNDBUF。
2.查看针对 UDP 的自动调整缓冲区范围(Linux 内核 2.6.7+)
现代 Linux 内核对 UDP 使用自动缓冲区调整机制,其范围由以下参数定义:
cat /proc/sys/net/ipv4/udp_mem输出格式为三个数字(单位:页,不是字节):
- low:内存压力低,可自动增长缓冲区。
- pressure:进入内存压力状态,开始限制缓冲区。
- high:硬上限,超过此值将丢弃数据包。
要转换为字节,乘以页面大小(通常为 4096 字节):
getconf PAGESIZE # 通常是 4096此外,还有两个 UDP 特定的缓冲区大小参数:
cat /proc/sys/net/ipv4/udp_rmem_min # 每个 UDP socket 最小接收缓冲区(字节) cat /proc/sys/net/ipv4/udp_wmem_min # 每个 UDP socket 最小发送缓冲区(字节)这些值决定了即使你没设置SO_RCVBUF,内核也会至少分配这么多缓冲区给 UDP socket。
3.查看某个运行中进程的 UDP socket 缓冲区大小(可选)
如果你想知道某个具体 UDP socket 当前使用的缓冲区大小,可以使用ss命令:
ss -ulnmp-u:UDP-l:监听 socket-n:不解析服务名-m:显示内存使用(包括 rcvbuf 和 sndbuf)-p:显示进程信息(需要权限)
示例输出片段:
State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:53 *:* users:(("dnsmasq",pid=1234,fd=3)) skmem:(r0,rb212992,t0(tb0,f0,w0))其中:
rb212992表示接收缓冲区大小为 212992 字节tb...表示发送缓冲区(如果存在)
总结
| 参数 | 含义 | 路径 |
|---|---|---|
| 默认接收缓冲区 | 应用未设置时的 recv buffer | /proc/sys/net/core/rmem_default |
| 最大接收缓冲区 | recv buffer 上限 | /proc/sys/net/core/rmem_max |
| UDP 最小接收缓冲区 | 每个 UDP socket 至少分配 | /proc/sys/net/ipv4/udp_rmem_min |
| UDP 内存控制 | 自动调整范围(页为单位) | /proc/sys/net/ipv4/udp_mem |
如需临时修改(重启失效):
sudo sysctl -w net.core.rmem_default=262144