Linux下对TCP缓冲区参数调整

一、查看

  • 查看TCP读缓冲区
king@ubuntu:~$ cat /proc/sys/net/ipv4/tcp_rmem
4096	87380	6291456
第一个值:4096	    
给socket接收缓冲区分配的最小值min
第二个值:87380 	  	默认值deafult
默认值,接收缓冲区大小在系统负载不重的情况下可以增长到这个值
第三个值:6291456 	最大值max
是接收缓冲区最大值

当我们修改TCP缓冲区大小时,最小不能小于4096,最大不能大于6291456
修改的值需要在这个范围内
  • 查看TCP写缓冲区
king@ubuntu:~$ cat /proc/sys/net/ipv4/tcp_wmem
4096	16384	4194304
  • 查看TCP使用的内存
king@ubuntu:~$ cat /proc/sys/net/ipv4/tcp_mem
22317	29759	44634
其中,这三个值不是很好理解:
low:
当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,
最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )  

 
pressure:
当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,
当内存消耗低于low值时则退出pressure状态。
(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)
 
 
high:
允许所有tcp sockets用于排队缓冲数据报的页面量。
(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。
在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;
或者使现有连接能够传输 2.5 倍的数据。

一般情况下这些值是在系统启动时根据系统内存数量计算得到的,以页为单位(4K)。

TCP内存的初始化过程:

 static void tcp_init_mem(void)
{
    /* nr_free_buffer_pages()计算ZONE_DMA和ZONE_NORMAL的页数,
     * 对于64位系统来说,其实就是所有内存了。
     */
    unsigned long limit = nr_free_buffer_pages() / 8;
    limit = max(limit, 128UL); /* 不能低于128页 */
 
    sysctl_tcp_mem[0] = limit / 4 * 3; /* 最小值设为3/32的系统内存 */
    sysctl_tcp_mem[1] = limit; /* 压力值设为1/8的系统内存 */
    sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2; /* 最大值设为3/16的系统内存 */
}

二、调整

如何永久性修改TCP缓冲区的大小:在 /etc/sysctl.conf 修改如下内容:

net.ipv4.tcp_mem = 6177504 8236672 16777216
net.ipv4.tcp_rmem = 4096 873800 16777216
net.ipv4.tcp_wmem = 4096 873800 16777216

然后执行 /sbin/sysctl –p 使之生效,修改完后再查看

king@ubuntu:~$ sudo /sbin/sysctl -p
[sudo] king 的密码: 
net.ipv4.tcp_mem = 6177504 8236672 16777216
net.ipv4.tcp_rmem = 4096 873800 16777216
net.ipv4.tcp_wmem = 4096 873800 16777216
发布了237 篇原创文章 · 获赞 98 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/KingOfMyHeart/article/details/98240185
今日推荐