【 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM