天天看點

多少并發量算高并發_Linux 服務端最大并發數是多少?

(給Linux愛好者加星标,提升Linux技能)

轉自:後端技術指南針

1. 開場白

在開始今天的文章之前,先抛一個面試題出來:

你接觸過的單機最大并發數是多少?

你認為目前正常配置的伺服器實體機最大并發數可以到多少?

說說你的了解和分析。

思考幾分鐘,如果你可以有理有據地說出答案,那确實就不用再往下看了,關上手機去陪陪家人是個不錯的選擇。

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

多少并發量算高并發_Linux 服務端最大并發數是多少?

對于後端開發人員來說,并發數往往和技術難度是呈正相關的,實際上也确實如此:體量決定架構。

服務端根據不同業務場景會有不同的側重點,單純追求高并發其實并不是根本目的,高可用&穩定性更重要。

是以最終我們的目的是:保證高可用高穩定的基礎上追求高并發,降本增效。

高可用&高并發是我們直覺感受到的,本質上這是個複雜的系統工程,每個環節都會影響結果,每一塊都值得研究和深入。

多少并發量算高并發_Linux 服務端最大并發數是多少?

2. C10K問題和C10M問題

在2000年初的時候,全球網際網路的規模并不大,但是當時就已經提出了C10K問題,所謂C10K就是單機1w并發問題,雖然現在不覺得是個難題了,但是這在當初是很有遠見和挑戰的問題。

多少并發量算高并發_Linux 服務端最大并發數是多少?

C10K問題最早由Dan Kegel釋出于其個人站點,原文連結如下:

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

相關資料顯示Dan Kegel目前工作于Google,從1978年起開始接觸計算機程式設計,是Winetricks和Crosstool的作者,大佬年輕時的照片:

多少并發量算高并發_Linux 服務端最大并發數是多少?

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

在APUE第三版都沒有提到epoll,是以我們解決C10K問題的時間并不長,其中IO複用epoll/kqueue/iocp等技術對于C10k問題的解決起到了非常重要的作用。

開源大神們基于epoll/kqueue等開發了諸如libevent/libuv等網絡庫,進而大幅提高了高并發網絡的開發效率,對于C/C++程式員來說并不陌生。

多少并發量算高并發_Linux 服務端最大并發數是多少?

這裡簡單提一下針對下一個10年的展望和挑戰:C10M問題。

站在浪尖的那一批人早就開始思考讓單機達到1000w并發,現在聽起來感覺不可思議,但是要達到這個目标,除了硬體上的提升,更重要的是對系統軟體和協定棧的改造。

多少并發量算高并發_Linux 服務端最大并發數是多少?

Errata Security的CEO Robert Graham在Shmoocon 2013大會上的演講,大佬重要的觀點是:

不要讓OS核心執行所有繁重的任務:将資料包處理、記憶體管理、處理器排程等任務從核心轉移到應用程式高效地完成,讓諸如Linux這樣的OS隻處理控制層,資料層完全交給應用程式來處理。

确實也是如此,難道你不覺得Linux核心做了太多不該自己做的事情了嗎?

近幾年出現的DPDK、PFRING、NETMAP等技術也是類似的思想,現在流行的協處理器+CPU的架構也是這樣的:

多少并發量算高并發_Linux 服務端最大并發數是多少?

3. 伺服器最大并發數分析

前面提到的C10K和C10M問題都是圍繞着提升伺服器并發能力展開的,但是難免要問:伺服器最大的并發上限是多少?

多少并發量算高并發_Linux 服務端最大并發數是多少?

3.1 五元組

做過通信的盆友們一定聽過五元組這個概念,一個五元組可以唯一标記一個網絡連接配接,是以要了解和分析最大并發數,就必須了解五元組:

多少并發量算高并發_Linux 服務端最大并發數是多少?

這樣的話,就可以基本認為:理論最大并發數 = 服務端唯一五元組數。

3.2 端口&IP組合數

那麼對于伺服器來說,服務端唯一五元組數最大是多少呢?

有人說是65535,顯然不是,但是之是以會有這類答案是因為目前Linux的端口号是2位元組大小的short類型,總計2^16個端口,除去一些系統占用的端口,可用端口确實隻剩下64000多了。

對于服務端本身來說,DestPort數量确實有限,假定有多張網卡,每個網卡綁定多個IP,服務端的Port端口數和IP數的組合類型也是有限的。

對于用戶端來說,本身的端口和IP也是一樣有限的,雖然這是個組合問題,但是數量還是有限的:

多少并發量算高并發_Linux 服務端最大并發數是多少?

3.3 并發數理論極限

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

錯了,是真的會很大。

分析一下,前面的計算都是針對單個伺服器或者用戶端的,但是實際上每個伺服器會應對全網的所有用戶端,那麼從服務端看,源IP和源Port的數量是非常大的。

理論上服務端可以接受的用戶端IP是2^32(按照IPv4計算),端口數是2^16,目前端口号仍然是16bit的,所有這個理論最大值是2^48,果然很大!

多少并發量算高并發_Linux 服務端最大并發數是多少?

3.4 實際情況

天下沒有免費的午餐。

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

實際中并發數和業務是直接相關的,像Redis這種記憶體型的服務端并發十幾萬都是沒問題的,大部分來講幾十/幾百/幾千/幾萬等是存在的。

4. 用戶端最大連接配接數

了解了伺服器的最大并發數是2^48,那麼用戶端最多可以連接配接多少伺服器呢?

多少并發量算高并發_Linux 服務端最大并發數是多少?

對于用戶端來說,當然可以借助于多網卡多IP來增加連接配接能力,我們仍然假定用戶端隻有1張網卡1個IP,由于端口數的限制到2^16,再去掉系統占用的端口,剩下可用的差不多64000。

多少并發量算高并發_Linux 服務端最大并發數是多少?

也就是說,用戶端雖然可以連接配接任意的目的IP和目的端口,但是用戶端自身端口是有限的,是以用戶端的理論最大連接配接數是2^16,含系統占用端口。

5. NAT環境下的用戶端

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

一個公網出口NAT服務裝置最多可同時支援多少内網IP并發通路外網服務?

畢竟公網IP都是有限并且要花錢的,我們大部分機器都是在區域網路中結合NAT來進行外網通路的,是以這個場景還是很熟悉的。

來看下内網機器通路外網時的IP&端口替換和映射還原的過程,就明白了:

多少并發量算高并發_Linux 服務端最大并發數是多少?

因為這時的用戶端是NAT裝置,是以NAT環境下最多支援65535個并發通路外網。

6.小結

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

雖然理論服務端并發數非常大,但是我們也沒有必要覺得并發數高就厲害,服務複雜程度不一樣,切忌唯并發數來判斷業務和開發者水準。

試想echo服務和訂單交易服務顯然是不一樣的,我們應該做的是在服務穩定和高可用的前提下去從緩存/網絡/資料庫等多個角度來優化提高性能。

- EOF -

多少并發量算高并發_Linux 服務端最大并發數是多少?

推薦閱讀   點選标題可跳轉

1、Linux Mint 20 要來了,有啥新特性呢?

2、5 種拆分 Linux 終端的方法

3、在 Linux 上分析二進制檔案的 10 種方法

看完本文有收獲?請分享給更多人

關注「Linux 愛好者」加星标,提升Linux技能

多少并發量算高并發_Linux 服務端最大并發數是多少?

好文章,我在看❤️