查看互联网上的 TCP 优化指南,一个常见的主题是将 tcp_mem、tcp_rmem 或 tcp_wmem 三整数向量设置为 sysctl.conf 文件中的相等值。
借用 TCP 手册页,这些值的功能描述如下:
低的
- 当 TCP 全局分配的页面数量低于此数量时,TCP 不会调节其内存分配。
压力
- 当 TCP 分配的内存量超过此页数时,TCP 会缓和其内存消耗。一旦分配的页数低于低位标记,就会退出此内存压力状态。
高的
- TCP 全局分配的最大页面数。此值将覆盖内核施加的任何其他限制。
也许我疯了,但根据这些描述,设置相等的值可能会导致可怕的内部冲突。
有谁能比我更聪明,对 Linux 内核中的 TCP 内存谈谈将这些值设置为相等的效果吗?
答案1
你是对的,很多人不知道他们在说什么,也不会自己思考,所以他们只是从其他地方获取货物崇拜设置,而不了解这些设置的作用或可调参数的真正含义。
你显然不是那种人。点赞吧!
将可调参数的所有三个值设置tcp_.mem
为相同的值会破坏 TCP 自动调整缓冲区大小和内存使用情况(net.ipv4.tcp_moderate_rcvbuf=1
可调参数)的能力,而这是 Linux TCP 实现的一个很好的优点。
假设这些值都很高,那么 TCP 内存的使用效率就会很低。
如果创建了足够多的插座,以至于达到定义的天花板net.ipv4.tcp_mem
(注意这些是以页面,而不是字节),那么 TCP 会变得更加低效,因为它开始将缓冲区折叠在一起以减少内存使用量,这会导致%sys
比实际需要更高的 CPU 使用率。
如果内存压力足够大,内核就会开始丢弃数据包,首先是从无序队列,然后是主接收队列。
可调参数的正确值为tcp_rmem
:
- 低:4kb 或 8k(如果不是 x86,则为一页或两页)
- 默认值:发展局您最常用的连接
- 高:某个大于默认值的值,允许批量传输,并允许应用程序从套接字缓冲区读取时的延迟
对于 1Gbps,4Mb~6Mb 通常就足够了。对于 10Gbps,您可能需要高达 16Mb。我还没有见过比这更高的系统有用,但也许存在这样的系统。
通常您可以保留tcp_wmem
可调参数的原样。
系统运行和服务网络连接的时间越长,TCP 的自动调整功能就越能根据先前连接的 BDP 和 RTT 预测理想的默认缓冲区大小。