当前位置:   article > 正文

Linux下解决高并发socket最大连接数限制,tcp默认1024个连接_一个socket并发可以链接多少个连接

一个socket并发可以链接多少个连接

 linux获取TCP连接

  1. 方法一:
  2. [admin@zabbix ~]$ ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}'
  3. ESTAB 535
  4. TIME-WAIT 80
  5. LISTEN 13
  6. 方法二:
  7. [admin@zabbix ~]$ netstat -an | awk '/^tcp/ {a[$NF]++} END {for (b in a) print b,a[b]}'
  8. TIME_WAIT 91
  9. SYN_SENT 7
  10. ESTABLISHED 535
  11. LISTEN 13
  12. 方法三:
  13. [admin@zabbix ~]$ cat /proc/net/snmp
  14. Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
  15. Ip: 1 64 12503948767 0 0 0 0 0 12503948767 12822437575 0 0 0 0 0 0 0 0 0
  16. Icmp: InMsgs InErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
  17. Icmp: 985733 389 3779 69 0 0 0 490950 490935 0 0 0 0 984433 0 2548 0 0 0 0 490935 490950 0 0 0 0
  18. IcmpMsg: InType0 InType3 InType8 InType11 OutType0 OutType3 OutType8
  19. IcmpMsg: 490935 3779 490950 69 490950 2548 490935
  20. Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts
  21. Tcp: 1 200 120000 -1 1585243925 55029885 290059 15370 535 12500488405 12818246605 731883 25103 3821760
  22. Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
  23. Udp: 2546210 3436 0 2657997 0 0
  24. UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
  25. UdpLite: 0 0 0 0 0 0
  26. 注:通过CurrEstab获取tcp连接数
  27. [admin@zabbix ~]$ cat /proc/net/snmp | grep Tcp | tail -1 | awk '{print $10}'
  28. 535
  29. 扩展:如何获取每秒新增的TCP连接呢?
  30. 通过cat /proc/net/snmp得到最近240秒内PassiveOpens的增量,除以240可以得到每秒的tcp连接增量。
  31. 详情参考我的另一篇文章:https://blog.csdn.net/m0_37814112/article/details/80774935
  32. 如果想知道cat /proc/net/snmp输出选项各个参数的意义,可以参考
  33. http://perthcharles.github.io/2015/11/10/wiki-netstat-proc/
  1. Linux下 查看tcp连接数及状态
  2. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  3. LISTEN: 侦听来自远方的TCP端口的连接请求
  4. SYN-SENT: 再发送连接请求后等待匹配的连接请求
  5. SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
  6. ESTABLISHED: 代表一个打开的连接
  7. FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
  8. FIN-WAIT-2: 从远程TCP等待连接中断请求
  9. CLOSE-WAIT: 等待从本地用户发来的连接中断请求
  10. CLOSING: 等待远程TCP对连接中断的确认
  11. LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
  12. TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
  13. CLOSED: 没有任何连接状态

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

  本人在工作时,测试高并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建立到1000左右时,再也不能建立tcp连接,最总上网搜索,linux系统默认ulimit为1024个访问 用户最多可开启的程序数目。一般一个端口的最高连接为2的16次方65535

  • 第一步,修改/etc/security/limits.conf文件,在文件中添加如下行(*指代系统用户名),修改Linux系统对用户的关于打开文件数的软限制和硬限制:
    1. soft nofile 65535
    2. hard nofile 65535

  • 第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
  •     session required /lib/security/pam_limits.so

        如果是64bit系统的话,应该为 :
        session required /lib64/security/pam_limits.so

  • 第三步,修改/etc/sysctl.conf文件,在文件中(清楚文件原始内容)添加如下行(修改网络内核对TCP连接的有关限制):
    1. net.ipv4.ip_local_port_range = 1024 65535
    2. net.core.rmem_max=16777216
    3. net.core.wmem_max=16777216
    4. net.ipv4.tcp_rmem=4096 87380 16777216
    5. net.ipv4.tcp_wmem=4096 65536 16777216
    6. net.ipv4.tcp_fin_timeout = 10
    7. net.ipv4.tcp_tw_recycle = 1
    8. net.ipv4.tcp_timestamps = 0
    9. net.ipv4.tcp_window_scaling = 0
    10. net.ipv4.tcp_sack = 0
    11. net.core.netdev_max_backlog = 30000
    12. net.ipv4.tcp_no_metrics_save=1
    13. net.core.somaxconn = 262144
    14. net.ipv4.tcp_syncookies = 0
    15. net.ipv4.tcp_max_orphans = 262144
    16. net.ipv4.tcp_max_syn_backlog = 262144
    17. net.ipv4.tcp_synack_retries = 2
    18. net.ipv4.tcp_syn_retries = 2

  • 第四步,执行如下命令(使上述设置生效):
    1. /sbin/sysctl -p /etc/sysctl.conf
    2. /sbin/sysctl -w net.ipv4.route.flush=1

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

  1. echo ulimit -HSn 65536 >> /etc/rc.local
  2.  echo ulimit -HSn 65536 >>/root/.bash_profile
  3.  ulimit -HSn 65536
  • 第六步,重启机器。

通过修改,tcp可以达到20000个连接完全没有问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/164620
推荐阅读
相关标签
  

闽ICP备14008679号