sysctl TCP优化

内核参数优化

1
2
3
4
5
6
7
8
9
10
11
echo 2048 > /proc/sys/net/core/somaxconn 每一个端口最大的监听队列的长度
echo never > /sys/kernel/mm/transparent_hugepage/enabled 关闭透明页功能
vm.max_map_count=655350 限制一个进程可以拥有的VMA(虚拟内存区域)的数量
fs.file-max = 65536
同时修改vim /etc/security/limits.conf
*  soft  nofile  65536
*  hard  nofile  65536
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited

每保持一个TCP连接,进程就要创建一个文件对象,约占内存3.3KB,4GB内存可以维持长达100万条长连接,客户端发送数据的话,还得为TCP对象开启接收缓冲区,这就增大了内存开销, Linux系统里,系统级、用户级、进程级都有最大打开文件数限制

  • 系统级: 当前系统可以打开的文件数,通过fs.file-max参数修改
  • 用户级: 指定用 户可以打开的数量,通过/etc/security/limits.conf
  • 进程级: 单个进程可以打开的数量,通过fs.nr_open参数修改
1
2
3
4
为每一个TCP连接Socket分配的最少字节数或说是接收缓冲区,默认4K,最大可设8MB
net.ipv4.tcp_rmem = 4096(为TCP连接分配的最少字节数) 87380 8388608
net.core.rmem_default = 2129922
net.core.rmem_max = 8388608
1
2
3
net.ipv4.tcp_wmem= 4096(发送缓存区最小值,默认4K) 65536  8388608
net.core.wmem_default = 212992
net.core.wmem_max = 8388608
1
ss -n | grep ESTAB |wc -l TCP活动连接数统计
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node03 ~]# slabtop 关注dentry/filp/TCP/sock_node_cache指标
Active / Total Objects (% used) : 3721737 / 4145714 (89.8%)
Active / Total Slabs (% used) : 125168 / 125168 (100.0%)
Active / Total Caches (% used) : 95 / 131 (72.5%)
Active / Total Size (% used) : 821348.16K / 878889.63K (93.5%)
Minimum / Average / Maximum Object : 0.01K / 0.21K / 8.00K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
1928862 1578283 81% 0.10K 49458 39 197832K buffer_head
448077 447905 99% 0.19K 21337 21 85348K dentry (指标1)
298544 297412 99% 1.00K 18659 16 298544K filp(指标2)
288966 288966 100% 0.04K 2833 102 11332K TCP(指标3)
233070 233070 100% 0.12K 6855 34 27420K sock_node_cache(指标4)

华为官网建议配置
华为优化

1
2
3
4
5
6
7
8
echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 1024 > /proc/sys/net/core/somaxconn
echo 16777216 > /proc/sys/net/core/rmem_max
echo 16777216 > /proc/sys/net/core/wmem_max
echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem
echo "4096 65536 16777216" > /proc/sys/net/ipv4/tcp_wmem
echo 360000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 2048 > /sys/block/${device}/queue/nr_requests # $device=sda

解释说明

1
2
3
4
5
6
7
tcp_max_syn_backlog: 是指定所能接受SYN同步包的最大客户端数量,默认值是2048
net.core.somaxconn: 服务端所能accept即处理数据的最大客户端数量,即完成连接上限。默认值是128,建议修改成1024。
net.core.rmem_max: 接收套接字缓冲区大小的最大值。默认值是229376,建议修改成16777216。
net.core.wmem_max: 发送套接字缓冲区大小的最大值(以字节为单位)。默认值是229376,建议修改成16777216。
net.ipv4.tcp_rmem: 配置读缓冲的大小,三个值,第一个是这个读缓冲的最小值,第三个是最大值,中间的是默认值。默认值是"4096 87380 6291456",建议修改成"4096 87380 16777216"。
net.ipv4.tcp_wmem: 配置写缓冲的大小,三个值,第一个是这个写缓冲的最小值,第三个是最大值,中间的是默认值。默认值是"4096 16384 4194304",建议修改成"4096 65536 16777216"。
net.ipv4.max_tw_buckets: 表示系统同时保持TIME_WAIT套接字的最大数量。默认值是2048,建议修改成360000。

来个示例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@server01 ~]# sysctl   -p
net.core.somaxconn = 2048
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.ip_local_port_range = 1024 65535
fs.nr_open = 5000000
fs.file-max = 2000000
fs.inotify.max_user_watches = 16384
vm.max_map_count = 655360
[root@server01 ~]#
[root@server01 ~]#
[root@server01 ~]# cat /etc/security/limits.conf
* hard nofile 1024000
* soft nofile 1024000
* hard nproc unlimited
* soft nproc unlimited
* soft core 0
* hard core 0

总结

慢慢积累吧