为什么某些 tcp_[rw]?mem$ voodoo 显示所有相等的值?

为什么某些 tcp_[rw]?mem$ voodoo 显示所有相等的值?

查看互联网上的 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 预测理想的默认缓冲区大小。

相关内容