共計 2160 個字符,預計需要花費 6 分鐘才能閱讀完成。
本篇文章為大家展示了 Linux 服務端的最大并發數是多少呢,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
1. 開場白
在開始今天的文章之前,先拋一個面試題出來:
你接觸過的單機最大并發數是多少?
你認為當前正常配置的服務器物理機最大并發數可以到多少?
對于后端開發人員來說,并發數往往和技術難度是呈正相關的,實際上也確實如此:體量決定架構。
服務端根據不同業務場景會有不同的側重點,單純追求高并發其實并不是根本目的,高可用 穩定性更重要。
所以最終我們的目的是:保證高可用高穩定的基礎上追求高并發,降本增效。
高可用 高并發是我們直觀感受到的,本質上這是個復雜的系統工程,每個環節都會影響結果,每一塊都值得研究和深入。
2. C10K 問題和 C10M 問題
在 2000 年初的時候,全球互聯網的規模并不大,但是當時就已經提出了 C10K 問題,所謂 C10K 就是單機 1w 并發問題,雖然現在不覺得是個難題了,但是這在當初是很有遠見和挑戰的問題。
在 APUE 第三版都沒有提到 epoll,所以我們解決 C10K 問題的時間并不長,其中 IO 復用 epoll/kqueue/iocp 等技術對于 C10k 問題的解決起到了非常重要的作用。
開源大神們基于 epoll/kqueue 等開發了諸如 libevent/libuv 等網絡庫,從而大幅提高了高并發網絡的開發效率,對于 C /C++ 程序員來說并不陌生。
這里簡單提一下針對下一個 10 年的展望和挑戰:C10M 問題。
站在浪尖的那一批人早就開始思考讓單機達到 1000w 并發,現在聽起來感覺不可思議,但是要達到這個目標,除了硬件上的提升,更重要的是對系統軟件和協議棧的改造。
Errata Security 的 CEO Robert Graham 在 Shmoocon 2013 大會上的演講,大佬重要的觀點是:
不要讓 OS 內核執行所有繁重的任務:將數據包處理、內存管理、處理器調度等任務從內核轉移到應用程序高效地完成,讓諸如 Linux 這樣的 OS 只處理控制層,數據層完全交給應用程序來處理。
確實也是如此,難道你不覺得 Linux 內核做了太多不該自己做的事情了嗎?
近幾年出現的 DPDK、PFRING、NETMAP 等技術也是類似的思想,現在流行的協處理器 +CPU 的架構也是這樣的:
3. 服務器最大并發數分析
前面提到的 C10K 和 C10M 問題都是圍繞著提升服務器并發能力展開的,但是難免要問:服務器最大的并發上限是多少?
3.1 五元組
做過通信的盆友們一定聽過五元組這個概念,一個五元組可以唯一標記一個網絡連接,所以要理解和分析最大并發數,就必須理解五元組:
這樣的話,就可以基本認為:理論最大并發數 = 服務端唯一五元組數。
3.2 端口 IP 組合數
那么對于服務器來說,服務端唯一五元組數最大是多少呢?
有人說是 65535,顯然不是,但是之所以會有這類答案是因為當前 Linux 的端口號是 2 字節大小的 short 類型,總計 2^16 個端口,除去一些系統占用的端口,可用端口確實只剩下 64000 多了。
對于服務端本身來說,DestPort 數量確實有限,假定有多張網卡,每個網卡綁定多個 IP,服務端的 Port 端口數和 IP 數的組合類型也是有限的。
對于客戶端來說,本身的端口和 IP 也是一樣有限的,雖然這是個組合問題,但是數量還是有限的:
3.3 并發數理論極限
看了前面的端口 IP 的組合數計算,好像并發數并不會特別大。
錯了,是真的會很大。
分析一下,前面的計算都是針對單個服務器或者客戶端的,但是實際上每個服務器會應對全網的所有客戶端,那么從服務端看,源 IP 和源 Port 的數量是非常大的。
理論上服務端可以接受的客戶端 IP 是 2^32(按照 IPv4 計算), 端口數是 2^16,目前端口號仍然是 16bit 的,所有這個理論最大值是 2^48,果然很大!
3.4 實際情況
天下沒有免費的午餐。
每一條連接都是要消耗系統資源的,所以實際中可能會設置最大并發數來保證服務器的安全和穩定,所以這個理論最大并發數是不可能達到的。
實際中并發數和業務是直接相關的,像 Redis 這種內存型的服務端并發十幾萬都是沒問題的,大部分來講幾十 / 幾百 / 幾千 / 幾萬等是存在的。
4. 客戶端最大連接數
理解了服務器的最大并發數是 2^48,那么客戶端最多可以連接多少服務器呢?
對于客戶端來說,當然可以借助于多網卡多 IP 來增加連接能力,我們仍然假定客戶端只有 1 張網卡 1 個 IP,由于端口數的限制到 2^16,再去掉系統占用的端口,剩下可用的差不多 64000。
也就是說,客戶端雖然可以連接任意的目的 IP 和目的端口,但是客戶端自身端口是有限的,所以客戶端的理論最大連接數是 2^16,含系統占用端口。
5. NAT 環境下的客戶端
解決前面的兩個問題之后,來看另外一個問題:
一個公網出口 NAT 服務設備最多可同時支持多少內網 IP 并發訪問外網服務?
畢竟公網 IP 都是有限并且要花錢的,我們大部分機器都是在局域網中結合 NAT 來進行外網訪問的,所以這個場景還是很熟悉的。
來看下內網機器訪問外網時的 IP 端口替換和映射還原的過程,就明白了:
因為這時的客戶端是 NAT 設備,所以 NAT 環境下最多支持 65535 個并發訪問外網。
上述內容就是 Linux 服務端的最大并發數是多少呢,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注丸趣 TV 行業資訊頻道。