CentOS 7如何调整挂载缓冲区大小

作者:袖梨 2026-07-19
UDP收发缓冲区设置不生效的主因是系统级上限限制,需先调大/proc/sys/net/core/rmem_max和wmem_max,再通过setsockopt设置socket选项,并在bind前调用且验证实际值。

UDP收发缓冲区为什么改了没生效

直接改 setsockoptSO_RCVBUFSO_SNDBUF 不生效,大概率是撞上了系统级上限——/proc/sys/net/core/rmem_max/proc/sys/net/core/wmem_max。哪怕你在程序里传了 32MB,只要超过这两个值,内核就默默截断到最大值,还不会报错。

验证方法很简单:

cat /proc/sys/net/core/rmem_maxcat /proc/sys/net/core/wmem_max

常见默认值是 212992(约 208KB),远低于高吞吐 UDP 场景所需。所以必须先调系统参数,再改 socket 选项。

永久修改系统 UDP 缓冲区上限

编辑 /etc/sysctl.conf,追加三行(单位字节,例如设为 16MB):

net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.core.rmem_default = 8388608

然后执行 sysctl -p 生效。注意:rmem_default 是新 socket 的默认接收缓冲区大小,不设它的话,即使 rmem_max 调高了,新 socket 仍用旧默认值(通常很小)。

别用 /etc/rc.local echo 方式——它依赖启动顺序,容易被 systemd 服务覆盖,且重启后可能失效。

程序中正确设置 socket 缓冲区

bind() 之前调用 setsockopt,且传入的值不能超过 rmem_max

int size = 8388608; // 必须 ≤ rmem_maxif (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)) == -1) {    perror("setsockopt SO_RCVBUF");}
  • 调用后建议用 getsockopt 检查实际生效值,因为内核会向上对齐到最小页倍数(如 4KB)
  • SO_RCVBUF 影响接收队列长度,丢包前能暂存更多数据;SO_SNDBUF 影响发送端排队能力,对突发发包有帮助
  • 如果用的是 AF_UNIX 或 TCP,这套逻辑不适用——TCP 有滑动窗口自适应,UDP 才真靠这个硬扛丢包

XFS 文件系统下调整挂载点容量时别碰缓冲区

“挂载缓冲区”不是标准术语——有人误把 mount 时的 buffer 选项或文件系统缓存当成 UDP 缓冲区。CentOS 7 的 XFS 默认使用 write-back 缓存,和网络缓冲区完全无关。

如果你真正想调的是磁盘 I/O 缓存行为,那是 /proc/sys/vm/dirty_* 参数的事;如果是扩容 /home/ 分区,用的是 lvextend + xfs_growfs,和 rmem_max 没半毛钱关系。

混淆这两类“缓冲区”,会导致改了一堆 sysctl 却发现磁盘写入变慢,或者拼命调 dirty_ratio 却解决不了 UDP 丢包——它们压根不在一个子系统里。

相关文章

精彩推荐