为什么一些tcp_ ?mem $ voodoo显示所有相等的值?

通过Internet查看TCP优化指南,常见的主题是将tcp_mem,tcp_rmem或tcp_wmem三整数向量设置为在sysctl.conf文件中具有相同的值。

从TCP手册页借用,值的function描述如下:

  • 当TCP全局分配的页数低于这个数字时,TCP不调整它的内存分配。

压力

  • 当由TCP分配的内存量超过这个页数时,TCP调节其内存消耗。 一旦分配的页面数量低于低标记,此内存压力状态就会退出。

  • TCP将分配的全局最大页数。 该值将覆盖内核强加的任何其他限制。

也许我疯了,但基于这些描述,设定相同的价值可能会导致可怕的内部冲突。

有人能比我更聪明的在Linux内核的TCP内存说话的设置这些值的影响是平等的?

谢谢,

你是对的,很多人不知道他们在说什么,也不会为自己思考,所以他们只是从别处的货物崇拜设置,而不了解这些设置的作用或可调参数的真正意义。

你显然不是那些人之一。 有一个upvote!

tcp_.mem可调参数的所有三个值设置为相同的值将会破坏TCP自动调整缓冲区大小和内存使用情况的能力( net.ipv4.tcp_moderate_rcvbuf=1可调参数),这是Linux TCP实现的一个很好的优势。

假设值都很高,这将是TCP内存的低效使用。

如果创build了足够多的套接字来创build由net.ipv4.tcp_mem定义的最高限制(注意,这些套接字是以页面而不是字节为单位),那么TCP开始将缓冲区合并在一起以降低内存使用率会导致更高的效率%sys CPU使用率比真正需要的。

如果有足够的内存压力,内核将开始丢弃数据包,首先从乱序队列,然后是主接收队列。

tcp_rmem可调参数的正确值是:

  • 低:4kb或8k(如果不是x86,则一个或两个页面)
  • 默认:您最常用的连接的BDP
  • 高:某些值大于默认值,这允许批量传输以及应用程序从套接字缓冲区读取的延迟

对于1Gbps,4Mb〜6Mb通常就足够了。 对于10Gbps,你可能想要高达16Mb。 我还没有看到一个比那个更有用的系统,但也许有这样一个系统存在。

您通常可以保留tcp_wmem可调参数。

系统启动和服务networking连接的时间越长,根据以前连接的BDP和RTT,越好的TCP自动调整将得到预测理想的默认缓冲区大小。