当前位置:首页 >> 服务器

linux并发连接50万的配置方法

- A 64 bits hardware/kernel (AMD64, Opterons)
 - At least 8GB of ram
 - A recent linux kernel (2.6.x)

 About tuning, I prefer to not fully disclose them because servers are targets of many attacks, so it's better not help hackers.

 The most touchy thing is the IP route cache : You have to tune it or else the machine drops many connections

 (hint : rhash_entries=... in the boot append string)
 hints :
 echo 1 > /proc/sys/net/ipv4/route/gc_interval
 echo 150 >/proc/sys/net/ipv4/route/gc_timeout
 echo 2 >/proc/sys/net/ipv4/route/gc_elasticity

 - Use of hugeTLB pages
 hint :
 echo xxx >/proc/sys/vm/nr_hugepages

 Tune tcp :
 echo "4096 49152 131072" >/proc/sys/net/ipv4/tcp_wmem
 echo xxxx >/proc/sys/net/ipv4/tcp_max_syn_backlog
 echo xxxx >/proc/sys/net/core/somaxconn
 echo 1200000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
 echo 7 >/proc/sys/net/ipv4/tcp_retries2
 echo "600000 650000 700000" >/proc/sys/net/ipv4/tcp_mem
 echo 0 >/proc/sys/net/ipv4/tcp_timestamps
 echo 0 >/proc/sys/net/ipv4/tcp_window_scaling
 echo 0 >/proc/sys/net/ipv4/tcp_sack
 echo 330000 >/proc/sys/net/ipv4/tcp_max_orphans
 echo "10000 62000" >/proc/sys/net/ipv4/ip_local_port_range


 others :
 echo 1300000 >/proc/sys/fs/file-max
  
有多种方法加大Linux的threads数
 1、sysctl -w kernel.threads-max=8167 最大threads数
 2、echo 8167 > /proc/sys/kernel/threads-max

重启后保存修改值
 编辑/etc/sysctl.conf
增加
kernel.threads-max = 8167

 #sysctl -p 马上生效
 
 /proc/sys/net/ipv4/参数说明

参数名 参数类型
 参数值(如无特别标注,内存类的单位为byte,关于时间的单位为秒)
官方详细说明(skylove对该参数的个人心得或补充说明)

ip_forward :BOOLEAN
 0 - 关闭(默认值)
非0值 - 打开ip转发
 在网络本地接口之间转发数据报。该参数非常特殊,对该参数的修改将导致其它所有相关配置参数恢复其默认值(对于主机参阅RFC1122,对于路由器参见 RFC1812)(在其他一些操作系统中,这个参数不是boolean型,而是INTEGER型,设置为0为不转发,1为根据接口情形决定是否转发,2是 始终转发)

ip_default_ttl :INTEGER
默认值为 64
表示IP数据报的Time To Live值(在网络传递中,每经过一"跳",该值减少1,当ttl为0的时候,丢弃该包.该值越大,即在网络上可以经过的路由器设备的数量越多,但一个错 误的包,也会越发浪费生存周期.根据目前的实际情形而看,设置为32已经足够普通网络访问Internet的需求了)

ip_no_pmtu_disc :BOOLEAN
默认值为FALSE(0)
关闭路径MTU探测(典型的瓶颈原理,一次成功的传输中,mtu是由网络上最"窄"的位置决定的.如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。
 几种常见网络的MTU值:


超通道         65535
 16Mb/ s令牌网(IBM)   17914
 4Mb/ s令牌网(IEEE 802.5) 4464
 FDDI          4352
以太网         1500
 IEEE 802.3/802.2     1492
 X.25          576
点对点(低延时)     296

 ipfrag_high_thresh :INTEGER
默认值为262144
用来组装分段的IP包的最大内存量。两个文件分别表示用于重组IP分段的内存分配最低值和最高值,一旦达到最高内存分配值,其它分段将被丢弃,直到达到最 低内存(ipfrag_low_thresh 见下文)分配值。(根据我个人理解,就是达到最高后,就"关门打狗",直到处理到最低值的时候才又开门放分段的ip包进来处理.如果最高/最低差距过小, 很可能很快又达到限制又开始丢弃包;而设置过大,又会造成某段时间丢包时间持续过久.因此需要适当地考虑,默认值中给出的最低/最高比率值为3/4.此外 补充说明, kernel中,对内存的使用单位,都是以byte为单位的.当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被 转发。我在1G内存的NAT机器上,分别设置最低为262144,最高为393216)

 ipfrag_low_thresh :INTEGER
默认值为196608
参见ipfrag_high_thresh。

ipfrag_time :INTEGER
默认值为30
保存一个IP分片在内存中的时间。

inet_peer_threshold :INTEGER
默认值为65664
 INET 对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多"两个完全相同"的SACK。

tcp_ecn :BOOLEAN
缺省值为0
打开TCP的直接拥塞通告功能。

tcp_reordering :INTEGER
默认值是3
 TCP流中重排序的数据报最大数量 。 (一般有看到推荐把这个数值略微调整大一些,比如5)

 tcp_retrans_collapse :BOOLEAN
缺省值为1
对于某些有bug的打印机提供针对其bug的兼容性。(一般不需要这个支持,可以关闭它)

tcp_wmem(3个INTEGER变量): min, default, max
 min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。

default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。

max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为 131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)

tcp_rmem (3个INTEGER变量): min, default, max
 min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。

default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下,TCP窗口大小为65535。 默认值为87380

 max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,"静态"选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。(可以看出,.max的设置最好是default的两倍,对于NAT来说主要该增加它,我的网络里为 51200 131072 204800)

tcp_mem(3个INTEGER变量):low, pressure, high
 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 倍的数据。 我的网络里为192000 300000 732000)

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

tcp_app_win : INTEGER
默认值是31
保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。

tcp_adv_win_scale : INTEGER
默认值为2
计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

tcp_rfc1337 :BOOLEAN
缺省值为0
这个开关可以启动对于在RFC1337中描述的"tcp 的time-wait暗杀危机"问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST 包.

tcp_low_latency : BOOLEAN
缺省值为0
允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项一般情形是的禁用。(但在构建Beowulf 集群的时候,打开它很有帮助)

tcp_westwood :BOOLEAN
缺省值为0
启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。

tcp_bic :BOOLEAN
缺省值为0
为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。

==============IP、ICMP===========

 ip_local_port_range: (两个INTEGER)
定于TCP和UDP使用的本地端口范围,第一个数是开始,第二个数是最后端口号,默认值依赖于系统中可用的内存数:
> 128Mb 32768-61000
 < 128Mb 1024-4999 or even less.
该值决定了活动连接的数量,也就是系统可以并发的连接数(做nat的时候,我将它设置为了1024 65530 工作正常)

ip_nonlocal_bind : BOOLEAN
默认值是0
如果您想让应用程式能够捆绑到一个不属於该系统的位址"逆向路径过滤(Reverse Path Filtering)"。基本上?假如对此封包作出的回应?不是循其进入的界面送出去?那它就被置之不理。)

arp_filter : BOOLEAN
默认值为False
 1 -允许多个网络介质位于同一子网段内,每个网络界面依据是否内核指派路由该数据包经过此界面来确认是否回答ARP查询(这个实现是由来源地址确定路由的时候决定的),换句话说,允许控制使用某一块网卡(通常是第一块)回应arp询问。(做负载均衡的时候,可以考虑用
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
这样的方式就可以解决,当然 利用
echo 2 /proc/sys/net/ipv4/conf/all/arp_announce
 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
两条命令配合使用更好,因为arp_announce 和arp_ignore 似乎是对arp_filter的更细节控制的实现。)

0 -默认值,内核设置每个网络界面各自应答其地址上的arp询问。这项看似会错误的设置却经常能非常有效,因为它增加了成功通讯的机会。在Linux主机 上,每个IP地址是网络界面独立的,而非一个复合的接口。只有在一些特殊的设置的时候,比如负载均衡的时候会带来麻烦。
all/ 或者{interface}/ 下至少有一个为True即可生效。(简单来说,就是同一Linux上,如果有某些原因,有2块网卡必须设置为同一网段,那么默认情况下,会有一块工作,而另外一块不工作或者内核频繁报告错误,这个时候就需要打开这个选项了)

arp_announce : INTEGER
默认为0
对网络接口上本地IP地址发出的ARP回应作出相应级别的限制:

确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP 不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出 访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息(关于arp代理这一段我普遍翻译地不好,去啃一下tcp/ip bible的卷一,然后再翻译吧)

arp_ignore : INTEGER
默认为0
定义对目标地址为本地IP的ARP询问不同的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来自10.1.1.2这样地址发起的对10.1.1.1 的arp查询也会回应--而原本这个请求该是出现在eth1上,也该有eth1回应的)

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应)
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内(比如eth0=192.168.0.1/24, eth1=10.1.1.1/24,eth1收到来自10.1.1.2这样地址发起的对192.168.0.1的查询不会回答,而对 192.168.0.2发起的对192.168.0.1的arp查询会回应)
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻译地似乎不好,这个我的去问问人)
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

tag : INTEGER
默认为0