Linux单台服务器上并发TCP连接数优化

问题:一台服务器到底能够支持多少TCP并发连接呢?

文件描述符限制:


    对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的连接到来返回给我们的错误是"Socket/File:Can't open so many files"     这时,你需要明白操作系统可以打开最大文件数的限制。
        进程限制(用户限制):

  • 第一步,查看当前值
  1. ulimit -n # 最大文件数,一般默认为1024个  
  2. ulimit -u # 最大进程数,一般为默认60000+  

            执行 ulimit -n 输出1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。

永久生效:

  1. # vi /etc/security/limits.conf  
  1. *       soft    nofile  1000000  
  2. *       hard    nofile  1000000  
  3. *       soft    nproc  65535  
  4. *       hard    nproc  65535  
  • 第二步,修改vi /etc/pam.d/login文件,在文件中添加如下行:
  1. session required /lib/security/pam_limits.so  

如果是64bit系统(运行命令ls / 可以看到根目录下有lib64则为64位),则为 :

  1. session required /lib64/security/pam_limits.so  
  • 第三步,修改vi /etc/sysctl.conf文件,在文件中(清除文件原始内容)添加如下行(修改网络内核对TCP连接的有关限制):

设置Sysctl.conf用以提高Linux的性能 点击访问

  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 1000000 >> /etc/rc.local    
  2. echo ulimit -HSn 1000000 >>/root/.bash_profile    
  3. ulimit -SHu 6000 >> /etc/rc.local    
  4. ulimit -SHn 1000000 >> /etc/rc.local     

全局限制:
            执行 cat /proc/sys/fs/file-nr  
                1216    0    187612
                (1) 1216:已经分配的文件描述符数
                (2) 0:已经分配但没有使用的文件描述符数,这里的意思是内核分配了1216,然后1216个都用光了,所以“分配了但没有使用的 句柄数目” 为 0 
                (3) 187612:最大文件句柄数
                注意:在kernel2.6 版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经
                被使用。

                可以通过在/etc/sysctl.conf里定义fs.file-max = 1000000 来调整最后一个值的大小

端口号范围限制:


    操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的,由于没有tcp连接都要占用一个端口号,所以我们最多可以使用
    60000多个并发连接,这是对客户端的理解。
    分析一下:
        (1) 如何标识一个TCP连接? 系统用一个4元组来标识一个TCP连接:(local ip,local port,remote ip, remote port) 对于accept来说,accept的sock不占新的端口 第一个local ip , local port 代表客户端的ip地址和端口号。
        而我们作为服务器实际只是使用了bind这一个端口
        说明端口65535并不是并发量的限制。
        (2) server最大tcp连接数:server通常固定在某一个本地端口上监听,等待client的连接请求。不考虑地址重用的情况下,即使多个ip
        本地监听端口也是独占的。因此server端tcp连接4元组中只有remote ip 和 remote port 是可变的,因此最大tcp连接为
        客户端ip数 * 客户端port数。 对于ipv4,不考虑ip地址等因素,最大tcp连接约为2的32次方(ip数) * 2的16次方(port数)
        也就是  server端:单机最大tcp连接数约为:2的48次方。


问题1:查看文件描述符使用 lsof查看到的句柄数和/proc/sys/fs/file-nr 值不一样,为什么?

  1. [root@localhost ~]# lsof | wc -l
  2. 710

[root@localhost ~]

# !cat cat /proc/sys/fs/file-nr 416 0 1000000

    答案:一个文件可以被多个进程打开,lsof所列出来的是每个进程所打开的文件,所以lsof的数值比file-nr要大很正常。

问题2:关于文件句柄到底设置多大合适?

    查看句柄数的方法:

  1. [root@node1 ~]# cat /proc/sys/fs/file-nr
  2. 832 0 97321

[root@node1 ~]

# cat /proc/sys/fs/file-max 97321 默认最大句柄数为97321

        这个值在kernel的文档里意思是file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算:
        grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'  计算出来的值一般和默认最大句柄数近似。

  1. echo "fs.file-max = 100133" >> /etc/sysctl.conf && sysctl -p  
版权说明: 本文为转载文章,源自互联网,由本站整编
文章分类: 技术教程
字数统计:本文共有 5488 个字
原文地址:

标签:

精彩评论

发表评论: