一、一臺服務器最大能打開的文件數
1、限制參數
我們知道在Linux中一切皆文件,那么一臺服務器最大能打開多少個文件呢?Linux上能打開的最大文件數量受三個參數影響,分別是:
●?fs.file-max (系統級別參數):該參數描述了整個系統可以打開的最大文件數量。但是root用戶不會受該參數限制(比如:現在整個系統打開的文件描述符數量已達到fs.file-max ,此時root用戶仍然可以使用ps、kill等命令或打開其他文件描述符)
●?soft nofile(進程級別參數):限制單個進程上可以打開的最大文件數。只能在Linux上配置一次,不能針對不同用戶配置不同的值
●?fs.nr_open(進程級別參數):限制單個進程上可以打開的最大文件數。可以針對不同用戶配置不同的值
這三個參數之間還有耦合關系,所以配置值的時候還需要注意以下三點:
1.?如果想加大soft nofile,那么hard nofile參數值也需要一起調整。如果因為hard nofile參數值設置的低,那么soft nofile參數的值設置的再高也沒有用,實際生效的值會按照二者最低的來。
2.?如果增大了hard nofile,那么fs.nr_open也都需要跟著一起調整(fs.nr_open參數值一定要大于hard nofile參數值)。如果不小心把hard nofile的值設置的比fs.nr_open還大,那么后果比較嚴重。會導致該用戶無法登錄,如果設置的是*,那么所有用戶都無法登錄
3.?如果加大了fs.nr_open,但是是用的echo "xxx" > ../fs/nr_open命令來修改的fs.nr_open的值,那么剛改完可能不會有問題,但是只要機器一重啟,那么之前通過echo命令設置的fs.nr_open值便會失效,用戶還是無法登錄。所以非常不建議使用echo的方式修改內核參數!!!
2、調整服務器能打開的最大文件數示例
假設想讓進程可以打開100萬個文件描述符,這里用修改conf文件的方式給出一個建議。如果日后工作里有類似的需求可以作為參考。
●?vim /etc/sysctl.conf
●?fs.file-max=1100000 // 系統級別設置成110萬,多留點buffer fs.nr_open=1100000 // 進程級別也設置成110萬,因為要保證比 hard nofile大 復制代碼使上面的配置生效sysctl -p
●?vim /etc/security/limits.conf
// 用戶進程級別都設置成100完 soft nofile 1000000 hard nofile 1000000 復制代碼二、一臺服務器最大能支持多少連接
我們知道TCP連接,從根本上看其實就是client和server端在內存中維護的一組【socket內核對象】(這里也對應著TCP四元組:源IP、源端口、目標IP、目標端口),他們只要能夠找到對方,那么就算是一條連接。那么一臺服務器最大能建立多少條連接呢?
●?由于TCP連接本質上可以理解為是client-server端的一對socket內核對象,那么從理論上將應該是【2^32 (ip數) * 2^16 (端口數)】條連接(約等于兩百多萬億)
●?但是實際上由于受其他軟硬件的影響,我們一臺服務器不可能能建立這么多連接(主要是受CPU和內存限制)。
如果只以ESTABLISH狀態的連接來算(這些連接只是建立,但是不收發數據也不處理相關的業務邏輯)那么一臺服務器最大能建立多少連接呢?以一臺4GB內存的服務器為例!
●?這種情況下,那么能建立的連接數量主要取決于【內存的大小】(因為如果是)ESTABLISH狀態的空閑連接,不會消耗CPU(雖然有TCP保活包傳輸,但這個影響非常小,可以忽略不計)
●?我們知道一條ESTABLISH狀態的連接大約消耗【3.3KB內存】,那么通過計算得知一臺4GB內存的服務器,【可以建立100w+的TCP連接】(當然這里只是計算所有的連接都只建立連接但不發送和處理數據的情況,如果真實場景中有數據往來和處理(數據接收和發送都需要申請內存,數據處理便需要CPU),那便會消耗更高的內存以及占用更多的CPU,并發不可能達到100w+)
上面討論的都是進建立連接的理想情況,在現實中如果有頻繁的數據收發和處理(比如:壓縮、加密等),那么一臺服務器能支撐1000連接都算好的了,所以一臺服務器能支撐多少連接還要結合具體的場景去分析,不能光靠理論值去算。拋開業務邏輯單純的談并發沒有太大的實際意義。
服務器的開銷大頭往往并不是連接本身,而是每條連接上的數據收發,以及請求業務邏輯處理!!!
三、一臺客戶端機器最多能發起多少條連接
我們知道客戶端每和服務端建立一個連接便會消耗掉client端一個端口。一臺機器的端口范圍是【0 ~ 65535】,那么是不是說一臺client機器最多和一臺服務端機器建立65535個連接呢(這65535個端口里還有很多保留端口,可用端口可能只有64000個左右)?
由TCP連接的四元組特性可知,只要四元組里某一個元素不同,那么就認為這是不同的TCP連接。所以需要分情況討論:
●?【情況一】、如果一臺client僅有一個IP,server端也僅有一個IP并且僅啟動一個程序,監聽一個端口的情況下,client端和這臺server端最大可建立的連接條數就是 65535 個。 因為源IP固定,目標IP和端口固定,四元組中唯一可變化的就是【源端口】,【源端口】的可用范圍又是【0 ~ 65535】,所以一臺client機器最大能建立65535個連接