Linux服務端最大併發數是多少?

開場白

在開始今天的文章以前,先拋一個面試題出來:html

你接觸過的單機最大併發數是多少?
你認爲當前正常配置的服務器物理機最大併發數能夠到多少?
說說你的理解和分析。前端

思考幾分鐘,若是你能夠有理有據地說出答案,那確實就不用再往下看了,關上手機去陪陪家人是個不錯的選擇。程序員

思考幾分鐘,若是你沒有頭緒或者對答案不肯定,那麼你先不用着急關閉頁面去玩耍,你應該繼續往下看,由於這個問題很不錯。面試

對於後端開發人員來講,併發數每每和技術難度是呈正相關的,實際上也確實如此:體量決定架構。編程

服務端根據不一樣業務場景會有不一樣的側重點,單純追求高併發其實並非根本目的,高可用&穩定性更重要。後端

因此最終咱們的目的是:保證高可用高穩定的基礎上追求高併發,降本增效。安全

高可用&高併發是咱們直觀感覺到的,本質上這是個複雜的系統工程,每一個環節都會影響結果,每一塊都值得研究和深刻。服務器

C10K問題和C10M問題

在2000年初的時候,全球互聯網的規模並不大,可是當時就已經提出了C10K問題,所謂C10K就是單機1w併發問題,雖然如今不以爲是個難題了,可是這在當初是頗有遠見和挑戰的問題。網絡

C10K問題最先由Dan Kegel發佈於其我的站點,原文連接以下:架構

http://www.kegel.com/c10k.html

相關資料顯示Dan Kegel目前工做於Google,從1978年起開始接觸計算機編程,是Winetricks和Crosstool的做者。

                    

Dan Kegel這篇文章閱讀難度並不大,大白建議從事服務端開發或者對高性能網絡開發有興趣的讀者嘗試讀一讀。

在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的架構也是這樣的:

服務器最大併發數分析

前面提到的C10K和C10M問題都是圍繞着提高服務器併發能力展開的,可是不免要問:服務器最大的併發上限是多少?

五元組

作過通訊的盆友們必定聽過五元組這個概念,一個五元組能夠惟一標記一個網絡鏈接,因此要理解和分析最大併發數,就必須理解五元組:

端口&IP組合數

那麼對於服務器來講,惟一五元組數最大是多少呢?

有人說是65535,顯然不是,可是之因此會有這類答案是由於當前Linux的端口號是2字節大小的short類型,總計2^16個端口,除去一些系統佔用的端口,可用端口確實只剩下64000多了。

對於服務端自己來講,DestPort數量確實有限,IP地址更不用說了,就算多張網卡,每一個網卡綁定多個IP,服務端的Port端口數和IP數的組合類型都是有限的。

對於客戶端來講,自己的端口和IP也是同樣有限的,雖然這是個組合問題,可是數量仍是有限的:

                 

究竟有多大

看了前面的端口&IP的組合數計算,好像併發數並不會特別大。

錯了,是真的會很大。

分析一下,前面的計算都是針對單個服務器或者客戶端的,可是實際上每一個服務器會應對全網的全部客戶端,那麼從服務端看,源IP和源Port的數量是很是大的。

理論上服務端能夠接受的客戶端IP是2^32(按照IPv4計算),端口數是2^16,目前端口號仍然是16bit的,全部這個理論最大值是2^48,果真是海了去了!

實際狀況

天下沒有免費的午飯。

每一條鏈接都是要消耗系統資源的,因此實際中可能會設置最大併發數來保證服務器的安全和穩定,因此這個理論最大併發數是不可能達到的。

客戶端最大鏈接數

理解了服務器的最大併發數是2^48,那麼客戶端最多能夠鏈接多少服務器呢?

對於客戶端來講,固然能夠藉助於多網卡多IP來增長鏈接能力,咱們仍然假定客戶端只有1張網卡1個IP,因爲端口數的限制到2^16,再去掉系統佔用的端口(好比22/23/80等),剩下可用的差很少64000。

也就是說,客戶端雖然能夠鏈接任意的目的IP和目的端口,可是客戶端自身端口是有限的,因此客戶端的理論最大鏈接數是2^16,這裏算上了系統佔用端口。

NAT環境下的客戶端

解決前面的兩個問題以後,來看另一個問題:

一個公網出口NAT服務設備最多可同時支持多少內網IP併發訪問外網服務?

畢竟公網IP都是有限而且要花錢的,咱們大部分機器都是在局域網中結合NAT來進行外網訪問的,因此這個場景仍是很熟悉的。

因此NAT環境下最多支持65535個併發訪問外網,由於這時的客戶端是NAT設備。

小結

本文經過一道面試題切入,先描述了C10K和C10M問題,進而詳細說明了客戶端的最大訪問數和服務端的最大併發數計算和原理,最後描述了NAT場景下的訪問併發數。

最後感謝各位老鐵的傾情閱讀。

相關文章
相關標籤/搜索