本文目录导读:

tcp_rmem 是 Linux 内核中用于控制 TCP 接收缓冲区大小的关键参数,它的完整路径是 /proc/sys/net/ipv4/tcp_rmem。
读取它的方式非常直接,但需要理解其三个数值的含义。
如何读取
最直接的方法是在终端使用 cat 命令:
cat /proc/sys/net/ipv4/tcp_rmem
示例输出:
4096 131072 6291456
如何解读这三个数值
输出结果是 三个整数,用空格分隔,分别代表:
- 第一个数值 (min):最小值。
- 即使在内存压力下,每个 TCP 连接接收缓冲区至少可以分配到这个大小(通常是一个 page size,如 4096 字节)。这是绝对的下限。
- 第二个数值 (default):默认值。
- 当应用程序创建 TCP 套接字时,如果没有通过
setsockopt指定SO_RCVBUF,系统会使用这个值作为接收缓冲区的大小。 - 关键点:内核在自动调整(Auto-tuning)过程中,不会让缓冲区低于这个值,但它可以调整到高于这个值(直到最大值)。
- 当应用程序创建 TCP 套接字时,如果没有通过
- 第三个数值 (max):最大值。
- 接收缓冲区可以动态增长到的绝对上限。
- 即使应用程序通过
setsockopt设置SO_RCVBUF为更大的值,内核也会将实际大小截断到这个值。 - 关键点:
tcp_rmem的最大值会覆盖net.core.rmem_max的值。
内核如何利用这三个数值(动态调整机制)
理解这一点很重要:内核不会在创建连接时就分配 max 大小的缓冲区,它会根据网络状况(如带宽延迟积 BDP)动态调整:
- 初始分配:套接字创建时,缓冲区大小设置为
default值(第二个数)。 - 增长过程:如果接收数据的速率很高,内核会自动增加缓冲区大小,最高可以增加到
max值,这是 TCP 的自动缓冲区调整功能。 - 收缩:当接收流量减少或内存紧张时,内核可以将其缩小到
min以上,但不会低于default。
为什么需要读取/修改它?
- 性能调优:如果你的服务器处理大量并发连接(如 Web 服务器),过大的
max值会导致每个连接占用大量内存,触发 OOM(内存溢出),通常建议调小max。 - 高吞吐量场景:如果服务器处理少量大文件下载(如流媒体),过小的
max值会限制 TCP 窗口,导致吞吐量上不去,通常建议调大default和max。 - 低延迟场景:如果需要低延迟(如实时游戏),过大的缓冲区会增加数据在内存中的停留时间,引入延迟,通常建议调小
default和max。
如何临时修改(立即生效,重启丢失)
# 设置为 8192 65536 16777216 echo "8192 65536 16777216" > /proc/sys/net/ipv4/tcp_rmem # 或者使用 sysctl sysctl -w net.ipv4.tcp_rmem="8192 65536 16777216"
如何永久修改(推荐)
编辑 /etc/sysctl.conf 文件,添加或修改以下行:
net.ipv4.tcp_rmem = 8192 65536 16777216
然后运行 sysctl -p 使配置生效。
总结性答案
直接回答你的问题:
在 Linux 中,通过 cat /proc/sys/net/ipv4/tcp_rmem 读取,它会输出三个数字,4096 131072 6291456。
- 4096 = 最小缓冲区
- 131072 = 默认缓冲区(128KB)
- 6291456 = 最大缓冲区(6MB)
实际建议:除非你明确知道需要修改,否则通常建议保留默认值,Linux 内核的自动缓冲区调整机制在大多数场景下已经可以很好地平衡内存占用和传输性能,如果你遇到性能瓶颈(如高并发下内存不足,或高带宽下吞吐量上不去),再根据上述原理进行调整。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。