千萬併發的秘密 核心是問題的根本

2021-06-21 01:50:30 字數 2595 閱讀 1441

在的系統可以支援千萬級的併發連線,只不過所使用的那些激進的技術,並不為人所熟悉。

要了解這是如何做到的,我們得求助於errata security的ceo 

robert graham

,看一下他在 

shmoocon 2013

的絕對奇思妙想的演講,題目是 

c10m defending the internet at scale。

robert以一種我以前從來沒有聽說過的才華橫溢的方式來搭建處理這個問題的架構。他的開場是一些歷史,關於unix最初為什麼不是設計成乙個通用的伺服器的os,而是為**網路的控制系統設計的。真正傳輸資料的是**網路,因而控制層和資料層有非常清晰的區分。問題是,我們現在用的unix伺服器還是資料層的一部分,雖然並不應當是這樣的。如果一台伺服器只有乙個應用程式,為這樣的系統設計核心,與設計乙個多使用者系統的核心的區別是非常大的。

這也是為什麼他說重要的是要理解:

這意味著:

結果就是成為乙個用200個時鐘週期處理資料報,14萬個時鐘週期來處理應用程式邏輯,可以處理1000萬併發連線的系統。而作為重要的記憶體訪問花費300個時鐘週期,這是盡可能減少編碼和快取的設計方法的關鍵。

用乙個面向資料層的系統你可以每秒處理1000萬個資料報。用乙個面向控制層的系統每秒你只能獲得1百萬個資料報。

如果這貌似有點極端,記住一句老話:可擴充套件性是專業化。要做些牛x的事兒,你不能侷限於操作系的效能。你必須自己去做。

現在,讓我們學習robert是怎樣創作乙個能處理1000萬併發連線的系統……

十年前,工程師在處理c10k可擴充套件性問題時,都盡可能的避免伺服器處理超過10,000個的併發連線。通過修正作業系統核心以及用事件驅動型伺服器(如nginx和node)替代線程式的伺服器(如apache)這個問題已經解決。從apache轉移到可擴充套件的伺服器上,人們用了十年的時間。在過去的幾年中,(我們看到)可擴充套件伺服器的採用率在大幅增長。

解決方法:修正核心在規定的時間內進行查詢

由於執行緒排程依然沒有被擴充套件,因此伺服器對sockt大規模的採用epoll,導致需要使用非同步程式設計模式,然而這正是node和nginx所採用的方式。這種軟體遷移會得到(和原來)不一樣的表現(指從apache遷移到ngix等)。即使在一台很慢(配置較低)的伺服器上增加連線數效能也不會陡降。介於此,在開啟10k併發連線時,一台膝上型電腦(執行ngix)的速度甚至超越了一台16核的伺服器(執行apache)。

在不久的將來,伺服器將需要處理數百萬的併發連線。由於ipv6普及,連線到每乙個伺服器的潛在可能連線數目將達到數百萬,所以我們需要進入下乙個可擴張性階段。

通常人們認為網際網路規模問題是個人計算機而不是伺服器,因為他們銷售的是硬體+軟體。你買的裝置連線到你的資料中心。這些裝置可能包含英特爾主機板或網路處理器和用於加密的晶元、資料報檢測,等等。

2023年2月40gpbs、32核、256gigs ram x86在新蛋的售價為$5000。這種配置的伺服器能夠處理10k以上的連線。如果不能,這不是底層的硬體問題,那是因為你選錯了軟體。這樣的硬體能夠輕而易舉的支援千萬的併發連線。

1. 10,000,000個併發連線

2. 每秒1,000,000個連線——每個連線大約持續10秒

3. 10千兆位元/每秒——快速連線到網際網路。

4. 10,000,000包/每秒——預期當前伺服器處理50,000包/每秒,這將導致更高的級別。伺服器能夠用來處理每秒100,000個中斷和每個包引發的中斷。

5. 10微秒延遲——可擴張的伺服器也許能夠處理這樣的增長,但是延遲將會很突出。

6. 10微秒上下跳動——限制最大延遲

7. 10個一致的cpu核心——軟體應該擴張到更多核心。典型的軟體只是簡單的擴張到四個核心。伺服器能夠擴張到更多的核心,所以軟體需要被重寫以支援在擁有更多核心的機器上執行。

你怎麼改變你的軟體使其可伸縮?有大量的經驗規則都是假設硬體能處理多少。我們需要真實的執行效能。

要進入下乙個等級,我們需要解決的問題是:

包的可擴充套件性

多核的可擴充套件性

記憶體的可擴充套件性

多核的可擴充套件性和多執行緒可擴充套件性是不一樣的。 我們熟知的idea處理器不在漸漸變快,但是我們卻擁有越來越多的idea處理器。

大多數**並不能擴充套件到4核。當我們新增更多的核心時並不是效能不變,而是我們新增更多的核心時越來越慢。因為我們編寫的**不好。我們期望軟體和核心成線性的關係。我們想要的是新增更多的核心就更快。

多執行緒程式設計不是多核程式設計

多核:

我們的問題是如何讓乙個程式能擴充套件到多個核心。

unix中的鎖是在核心中實現的。在4核心上使用鎖會發生什麼?大多數軟體會等待其他執行緒釋放乙個鎖。這樣的以來你有更多的cpu核心核心就會耗掉更多的效能。

我們需要的是乙個像高速公路的架構而不是乙個像靠紅綠燈控制的十字路口的架構。我們想用盡可能少的小的開銷來讓每個人在自己的節奏上而沒有等待。

解決方案:

分頁記憶體池

超執行緒大記憶體頁

cpu記憶體

(僅)把控制層留給linux,與資料層毫無瓜葛。由應用程式管理資料層。應用程式與核心間沒有互動。沒有執行緒排程,沒有系統呼叫,沒有中斷,什麼都沒有。

然而,你擁有的是在linux上執行的**,並且可以正常除錯,它並不是某些需要特殊定製的怪異的硬體系統。你得到了定製硬體的效能,就像你期待的那樣,只是需要用你熟悉的程式設計(語言)和開發環境。

基礎是好作品的根本

毛竹是一種生長在亞洲境內的植物。在種下的前五年,高度變化幾乎看不出來。一旦過了這五年,毛竹就會急速狂長,6個星期內長到27公尺高。原因就在於毛竹用前五年的時間去發展自己的根部,拼命的將自己的根部系統擴大,盡可能的使根部得到足夠的空間。做任何事,都要向毛竹一樣,先打好基礎,因為打好基礎最重要。比方說建...

王通 初創公司Perdate年賺千萬的秘密

初創公司如何避免跟風燒錢?初創公司如何避開競爭找準定位?初創公司如何快速的發展並且賺錢?初創公司如何賺錢後快速把規模做大?一 perdate是做什麼的?perdate是做什麼的呢?剩女經濟,現在國內的剩女越來越多,高不成低不就,自己能看上的男人早已經有主了,沒主的要麼比自己小,要麼自己看不上。於是造...

布魯斯的秘密 序章 我是布魯斯

布魯斯是湯口鎮有名的私家偵探,不僅如此,旁邊的樹苑鎮 明基鎮的村民無人不知曉布魯斯的英雄事蹟。不知從何時起,也許正是布魯斯來到湯口之時,這幾個小鎮鮮有盜賊出沒。尤其是半年前布魯斯協助 破獲一起西城區縱火案之後,幾乎好幾個月沒有聽說過有犯罪的事,布魯斯也因此名聲大噪。湯口人每天都在一片歡樂中度過。歲的...