原创

Linux下解决高并发Socket最大连接数所受的各种限制

Linux作为服务器系统,当运行高并发TCP程序时,通常会出现连接建立到一定个数后不能再建立连接的情况

本人在工作时,测试高并发Tcp程序(GPS服务器端程序),多次测试,发现每次连接建立到3800左右时,再也不能建立Tcp连接,最总上网搜索,参考:Http://Blog.Csdn.Net/Guowake/Article/Details/6615728解决了连接限制的问题,此处记录下来,方便日后工作继续使用,虽然参考博文中内容有点多,文中所描述的内容也不怎么明白,但总结下来,按如下几步操作即可(我映像中,按此方法设置后,测试建立连接8000多时也未出现什么错误) :

  • 第一步,修改/Etc/Security/Limits.Conf文件,在文件中添加如下行(*指代系统用户名),修改Linux系统对用户的关于打开文件数的软限制和硬限制:

* Soft Nofile 20000

* Hard Nofile 20000

 

  • 第二步,修改/Etc/Pam.D/Login文件,在文件中添加如下行:

Session Required /Lib/Security/Pam_limits.So

如果是64bit系统的话,应该为 :
Session Required /Lib64/Security/Pam_limits.So

  • 第三步,修改/Etc/Sysctl.Conf文件,在文件中(清楚文件原始内容)添加如下行(修改网络内核对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
  • 第四步,执行如下命令(使上述设置生效):

/Sbin/Sysctl -P /Etc/Sysctl.Conf /Sbin/Sysctl -W Net.Ipv4.Route.Flush=1

  • 第五步,执行如下命令(Linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的):

echo Ulimit -HSn 65536 >> /etc/rc.Local

echo Ulimit -HSn 65536 >>/root/.bash_profile

ulimit -HSn 65536

  • 第六步,重启机器。
正文到此结束
本文目录