socket最大连接数

书接上文,同样在多线程访问网络的时候,遇到了创建socket的失败的情况,所以本篇介绍一下如何增加64位Centos系统的socket最大连接数。

本着linux“一切皆文件”的思想,socket其实也被算做是一种文件,自然而然也就是受到了系统能够打开的最大文件数的限制。

查看允许打开的最大文件数量,命令如下

ulimit -a

查看当前状态

centos l2tp 连接数限制 centos最大连接数_centos l2tp 连接数限制


这个已经是我修改过的结果,默认是1024。

修改方法

1.编辑/etc/security/limits.conf文件,增加下面两行

* soft nofile 65535
* hard nofile 65535

2.修改/etc/pam.d/login文件,增加下面一行

session    required     /lib64/security/pam_limits.so

然后保存文件,重启机器,再次查看最大打开文件数量,就会变成了65535。到此为止,就可以允许用户创建socket的数量得到了巨大的提升。

不过事情没有这么简单。还需要内核来支撑


然后就是允许创建了这么多socket就能够正常使用,还需要配置/etc/sysctl.conf
/etc/sysctl.conf是用来控制linux网络的配置文件,网上搜索到了一个推荐的配置,里面配置与TCP连接相关的性能参数,参数的解释也是来源于网络上的各种文档,仅供参考

net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

字段名称

含义

net.ipv4.ip_local_port_range = 1024 65535

系统中的程序会选择这个范围内的端口来连接到目的端口(目的端口当然是用户指定的;

net.core.rmem_max=16777216

套接字接收缓冲区大小的最大值

net.core.wmem_max=16777216

套接字发送缓冲区大小的最大值

net.core.rmem_default = 262144

套接字接收缓冲区大小的缺省值

net.core.wmem_default = 262144

套接字发送缓冲区大小的缺省值

net.ipv4.tcp_rmem=4096 87380 16777216

表示tcp接受数据缓冲区范围从4096 到 87380 到16777216

net.ipv4.tcp_wmem=4096 65536 16777216

表示tcp发送数据缓冲区范围从4096 到 65536到16777216

net.ipv4.tcp_fin_timeout = 10

表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认是60,降低这个值以提高系统性能

net.ipv4.tcp_tw_recycle = 1

0表示禁用,1表示启用,允许将TIME_WAIT sockets快速回收以便利用,默认为0,表示关闭

net.ipv4.tcp_timestamps = 0

该参数用于设置时间戳,可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉

net.ipv4.tcp_window_scaling = 0

tcp滑动窗口扩大使能,要支持超过 64KB 的窗口,必须启用该值

net.ipv4.tcp_sack = 0

启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用,其实就是快速重传使能

net.core.netdev_max_backlog = 30000

表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值为128(可能不同的linux系统该数值也不同)

net.ipv4.tcp_no_metrics_save=1

默认情况下一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接.通常情况下是关闭的

net.core.somaxconn = 262144

该参数用于调节系统同时发起的TCP连接数,一般默认值为128.在客户端存在高并发请求的情况下,该默认值较小,肯那个导致连接超时或重传问题,我们可以根据实际需要结合并发请求数来调节此值

net.ipv4.tcp_syncookies = 0

表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击默认为0,表示关闭;

net.ipv4.tcp_max_orphans = 262144

该参数用于设定系统中最多允许存在多少tcp套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的tcp套接字符将立即被复位,同时给出警告信息。这个限制只是为了防止简单的DoS攻击。一般在系统内存比较充足的情况下,可以增大这个参数的赋值

net.ipv4.tcp_max_syn_backlog = 262144

定义backlog队列容纳的最大半连接数,如果配置高可以设置的更高

net.ipv4.tcp_synack_retries = 2

该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量。为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,这个参数主要影响这个过程,一般赋值为1,即内核放弃连接之前发送1次SYN+ACK包

net.ipv4.tcp_syn_retries = 2

该参数的作用与上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量,赋值和上个参数一样即可

关于这个文件,还有很多配置参数,感兴趣的可以去网上搜索一下