最新消息:

百万TCP并发的Linux系统配置

Linux ipcpu 2919浏览 0评论

百万并发配置.md

概述

科技发展太快,现在一台普通的机器都可以保持百万千万的TCP并发连接或是转发(并发数,这里我们和阿里云看齐,以TCP的ESTABLISH连接数来计算,这里只是保持TCP连接,并非QPS或者TPS),但Linux的一些默认设定过于保守,或者是十多年根本就没动过,一次想要达到百万的并发,很多参数还是需要研究琢磨的。

一、文件打开数

Linux默认的文件打开数是1024,这个基本上满足不了任何系统的需求,文件打开数超过1024就会报"too many open files"错误。

#vi sysctl.conf
fs.nr_open=10240000
fs.file-max=10240000
# vi /etc/security/limits.conf
* soft nofile 8420000 
* hard nofile 8420000

从CentOS7开始systemd被广泛应该,应该特别注意,建议添加到全局文件中

#vi /etc/systemd/system.conf
DefaultLimitCORE=infinity
DefaultLimitNOFILE=820000
DefaultLimitNPROC=410000
#执行systemctl daemon-reexec生效

还有在systemd的配置文件(CentOS7)中infinity并不是无穷大,而是65536。

二、nf_conntrack

nf_conntrack并不是一个常用的模块,如果不使用iptables的话。but,Docker和Kubernetes以及OpenStack可都是nf_conntrack重度依赖用户。
nf_conntrack数值设置过小,会出现"nf_conntrack: table full, dropping packet"错误。

#nf_conntrack的参数可以在线修改
echo "1048576" > /sys/module/nf_conntrack/parameters/hashsize
#/proc/sys/net/netfilter/nf_conntrack_buckets这个文件只读不让改,kernel4.8以后可以改
sysctl -w net.netfilter.nf_conntrack_max=4195060
sysctl -w net.nf_conntrack_max=4195060
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=600 #默认5天
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=60 #默认120s

Kubernetes中的kube-proxy就是直接修改的,并且conntrack_buckets*4=conntrack_max
也可以修改配置文件/etc/modprobe.d/custom.conf,重启后直接生效

options nf_conntrack hashsize=288576
#options nf_conntrack hashsize=1048576
#conntrack_buckets*8=conntrack_max
#设置太高会报nf_conntrack: falling back to vmalloc,可能与机器内存有关

这里再提示一个高风险命令,iptables -t nat -nvL ,执行此命令后会自动加载nf_conntrack 模块,慎用!

三、TCP参数设定

3.1 TCP接收和发送缓冲区设置

net.ipv4.tcp_rmem = 4096 8388608 16777216
net.ipv4.tcp_wmem = 4096 8388608 16777216
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#单位是字节

Assume RTT in data center with 10GbE network = 1~100ms
BDP=0.1sec * 10Gbps /8 = 134217728 Bytes = 134M Bytes
实际上1G带宽,按照16M设置就可以,rmem_max=BDP,wmem_default=BDP/2
数值设置过小,可能会出现"TCP: too many of orphaned sockets"错误。

3.2 TCP可以使用的内存

#vim /etc/sysctl.conf
#TCP内存设定8G,32G,96G
net.ipv4.tcp_mem = 2097152 8388608 25165824
#单位是页

第一个表示低于8G不做限制,第二值表示超出32G进行pressure(压制?),超出第三个值会报"Out of Socket memory"

3.3 其他TCP参数设置

net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0

注意经典话题,tcp_tw_recycle 和tcp_timestamps 不要同时打开。

测试工具

https://github.com/smallnest/1m-go-tcp-server

转载请注明:IPCPU-网络之路 » 百万TCP并发的Linux系统配置

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. net.ipv4.tcp_max_orphans 这个值是个坑,如果设置太小,也会报TCP: too many of orphaned sockets
    wss88482年前 (2021-07-02)Reply