修改应用场景

修改读写缓存,只是暂时将数据保存在缓存中,避免阻塞住读写的操作,如果网络一直有问题或者应用程序无法及时处理缓存,修改该网络参数没有任何意义


tcp_wmem

1)瞬间发送大量的数据包,通过增大写缓存的方式,实现平滑的发送,TCP底层有一种机制,判断是否写缓存数据已经超过了一半,如果是,就立刻发送

当发送缓存满的情况下,上层应用程序调用发送接口,就会被阻塞

2)网络偶尔存在极端的异常不稳定情况,通过增大缓存,实现平滑发送

如果网络一直有问题,修改这个参数毫无意义

tcp_rmem

1)瞬间接收到大量的数据包,通过增大读缓存的方式,允许应用程序有足够的时间去处理缓存的数据

如果一直收到大量的数据包,而应用程序没有足够多的时间处理,也是没有任何意义的



定义及计算方式

tcp_mem:单位是page,此值是动态的,linux根据机器自身内存情况进行分配

最小:在这个页数之下,TCP不担心它的内存需求。

压力:当TCP分配的内存量超过此页数时,TCP将减缓其内存消耗并进入内存压力模式,当内存消耗低于“min”时,该模式将退出。

最大:所有TCP套接字允许排队的页面数。超出则打印Out of socket memory

假设一个page大小是4K

net.ipv4.tcp_mem = 196608 262144 393216   # 设置page数,* 4k 即是内存数值

那么对应的内存分配就是:768M 1G 1.5G

内存为1G时进入压力模式

大于TCP套接字允许排队的页面数则打印。


tcp_rmem:单位是字节 接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取

最小:默认值4K,TCP套接字使用的接收缓冲区的最小大小。即使在中等的内存压力下,它也能保证连接到每个TCP套接字。

默认:默认值87380字节,TCP套接字使用的接收缓冲区的初始大小。此值覆盖net.core.rmem默认值。此值将导致窗口为65535,默认设置为tcp_adv_win_scale和tcp_app_win:0,默认设置为tcp_app_win时,窗口会小一些。

最大:介于87380字节和6MB之间,取决RAM大小。TCP套接字接收器允许接收缓冲区的最大大小,此值不会覆盖net.core.rmem_max。使用SO_RCVBUF调用setsockopt()将禁用该套接字的接收缓冲区大小的自动调整,在这种情况下,将忽略此值。


tcp_wmem:单位字节 发送缓存区大小,缓存应用程序的数据,有序列号被应答确认的数据会从发送缓冲区删除掉。

最小:默认4K,为TCP套接字的发送缓冲区保留的内存量。每个TCP套接字由于其诞生的事实而有权使用它。

默认:最大16K,自动调整。TCP套接字使用的发送缓冲区的初始大小。此值将覆盖net.core.wmem_default,通常低于net.core.wmem_default。

最大:介于64K和4MB之间,具体取决于RAM大小。TCP套接字的发送缓冲区所允许的最大内存量。此值不会覆盖net.core.wmem_max。使用SO_SNDBUF调用setsockopt()会禁用该套接字的发送缓冲区大小的自动调整,在这种情况下该值将被忽略。