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