面试官给我挖坑:单台服务器并发TCP连接数到底可以有多少 ?
點擊上方“朱小廝的博客”,選擇“設為星標”
后臺回復"k8s"領取阿里云《深入淺出k8s.pdf》
歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/how-many-concurrent-tcp-connections-can-a-single-server-have/
曾幾何時我們還在尋求網絡編程中 C10K 問題的解決方案,但是現在從硬件和操作系統支持來看單臺服務器支持上萬并發連接已經沒有多少挑戰性了。有關 C10K(即單機1萬個并發連接問題)的信息可以參考《上一個10年,著名的C10K并發連接問題[1]》和《The C10K problem[2]》這兩篇文章。
我們先假設單臺服務器最多只能支持萬級并發連接,其實對絕大多數應用來說已經遠遠足夠了,但是對于一些擁有很大用戶基數的互聯網公司,往往面臨的并發連接數是百萬、千萬、甚至上億。雖然現在的集群,分布式技術可以為我們將并發負載分擔在多臺服務器上,那我們只需要擴展出數十臺電腦就可以解決問題,但是我們更希望能更大的挖掘單臺服務器的資源,先努力垂直擴展,再進行水平擴展,這樣可以有效的節省服務器相關的開支(硬件資源、機房、運維人力、電力其實也是一筆不小的開支)。
那么到底一臺服務器能夠支持多少TCP并發連接呢?
首先需要考慮文件句柄的限制。在linux下編寫網絡服務器程序的朋友肯定都知道每一個tcp連接都要占一個文件描述符,一旦這個文件描述符使用完了,新的連接到來返回給我們的錯誤是“Socket/File:Can't open so many files”。這時你需要明白操作系統對可以打開的最大文件數的限制。我們可以通過 ulimit -n命令、/etc/security/limits.conf 文件 以及 /etc/sysctl.conf 文件等來修改文件句柄數。更多細節可以參閱 「朱小廝的博客」里的這篇文章《文件句柄?文件描述符?傻傻分不清楚》。
其次要考慮的是端口范圍的限制。操作系統上端口號1024以下是系統保留的,從1024-65535是用戶使用的。由于每個TCP連接都要占一個端口號,所以我們最多可以有60000多個并發連接。我想有這種錯誤思路朋友不在少數吧?面試官也比較喜歡在這里引導挖坑,類似的問題還有:一個UDP連接可以復用已經被TCP連接占用的端口嘛?(可以在下方留言區留下你的答案。)
如何標識一個TCP連接? 系統使用一個4四元組來唯一標識一個TCP連接:本地端口號 local port、本地IP地址 local ip、遠端端口號 remote port、遠端IP地址 remote ip。server通常固定在某個本地端口上監聽,等待client的連接請求。不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監聽端口也是獨占的,因此server端tcp連接4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的,因此最大tcp連接為客戶端ip數×客戶端port數,對IPV4,不考慮ip地址分類等因素,最大tcp連接數約為2的32次方(ip數)×2的16次方(port數),也就是server端單機最大tcp連接數約為2的48次方。
上面給出的結論都是理論上的單機TCP并發連接數,實際上單機并發連接數肯定要受硬件資源(內存)、網絡資源(帶寬)的限制,至少對我們的需求現在可以做到數十萬級的并發了。
參考資料
[1]
上一個10年,著名的C10K并發連接問題: http://www.52im.net/thread-566-1-1.html
[2]The C10K problem: http://www.kegel.com/c10k.html
歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/how-many-concurrent-tcp-connections-can-a-single-server-have/
想知道更多?掃描下面的二維碼關注我
后臺回復”加群“獲取公眾號專屬群聊入口
當當優惠碼福利來一波!當當全場自營圖書5折,用優惠碼:TASEMU(長按復制),滿200(原價400)再減30,相當于170=400,四折多一點。使用渠道:當當小程序或當當APP。使用時間:4/10-4/23。目前優惠碼只有少量了,且不會再增加。
【原創系列 | 精彩推薦】
-
Paxos、Raft不是一致性算法嘛?
-
越說越迷糊的CAP
-
面試官居然問我Raft為什么會叫做Raft!
-
面試官給我挖坑:URI中的//有什么用
-
網關Zuul科普
-
網關Spring Cloud?Gateway科普
-
分布式事務科普——初識篇
-
分布式事務科普——終結篇
-
面試官給我挖坑:a[i][j]和a[j][i]有什么區別?
-
Nginx架構原理科普
朕已閱?
總結
以上是生活随笔為你收集整理的面试官给我挖坑:单台服务器并发TCP连接数到底可以有多少 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果世界上只有一种数据结构,那么我选择
- 下一篇: 面试官:为什么SpringBoot的 j