• 【 Linux 】单台服务器上并发TCP连接数(转)


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

    1. 文件描述符限制:
        对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的连接到来返回给我们的错误是"Socket/File:Can't open so many files"      

        这时,你需要明白操作系统可以打开最大文件数的限制。

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

                临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录的用户目前使用的环境有效,系统重启或用户退出会就失效。

                永久生效:修改/etc/security/limits.conf 文件:

                    *    soft    nofile    1000000
                    *    hard    nofile    1000000
                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 来调整最后一个值的大小

    2. 端口号范围限制:
        操作系统上端口号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 值不一样,为什么?

            [root@localhost ~]# lsof | wc -l
            710
            [root@localhost ~]# !cat
            cat /proc/sys/fs/file-nr
            416    0    1000000

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

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

        查看句柄数的方法:

            [root@node1 ~]# cat /proc/sys/fs/file-nr
            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)}'  计算出来的值一般和默认最大句柄数近似。

            echo "fs.file-max = 100133" >> /etc/sysctl.conf && sysctl -p
  • 相关阅读:
    Java实现 LeetCode 32 最长有效括号
    Java实现 LeetCode 31下一个排列
    Java实现 LeetCode 31下一个排列
    Java实现 LeetCode 31下一个排列
    Java实现 蓝桥杯 素因子去重
    Java实现 蓝桥杯 素因子去重
    Java实现 蓝桥杯 素因子去重
    Java实现 LeetCode 30 串联所有单词的子串
    Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法
    MFC不使用对话框资源模版创建对话框
  • 原文地址:https://www.cnblogs.com/twodog/p/12135761.html
Copyright © 2020-2023  润新知