今天太開心了,因為我知道了seastar框架
- 2022 年 1 月 19 日
- 筆記
今天聽說了一個新的C++語言開發的網路框架,叫做seastar。
seastar有何特別之處呢?先看看官網提供的性能數據:
性能
-
cpu # request/sec 2 637,430(相當於單核性能318715/s ) 4 1,303,761 6 1,907,912 8 2,493,690 12 3,495,012 16 4,385,829 20 5,359,786 24 6,291,073 28 6,826,827 32 6,869,199

| CPU | Seastar Memcached with DPDK | Stock Memcached (multi process) | Stock memcached (multi threaded) |
|---|---|---|---|
| 2 | 553,175(單核性能276587/s) | 350,844 | 321,287 |
| 4 | 1,021,918 | 615,270 | 573,149 |
| 6 | 1,703,790 | 857,428 | 709,502 |
| 8 | 2,149,162 | 1,102,417 | 741,356 |
| 10 | 2,629,885 | 1,335,069 | 608,014 |
| 12 | 2,870,919 | 1,528,598 | 608,968 |
| 14 | 3,217,044 | 1,726,642 | 440,658 |
| 16 | 3,460,167 | 1,887,060 | 603,479 |
| 18 | 4,049,397 | 2,167,573 | 902,192 |
| 20 | 4,426,457 | 2,281,064 | 1,128,469 |

網路框架單核的極限性能我做過很多次,我幾年前測試得到的數據大約是:
- http網路服務,單核極限性能7萬~9萬/s
- tcp協議網路服務,單核極限性能21萬~24萬/s
以上的測試是簡單的echo服務,沒有任何業務邏輯。TCP服務更是簡單,每個請求僅50位元組。
在seastar框架中,http協議的單核處理能力上漲了約4.5倍。這雖然讓人欣喜,但並不驚奇。令人驚奇的地方在於,框架的處理性能隨著核數的增加而線性增加!
通常而言,隨著作業系統和業務的複雜性,網路框架的處理性能並不會因為核數線性增加,應該類似於對數曲線的效果:

而從官方測試數據看,幾乎是達到了線性增長的效果。如果是使用現在的上百核的伺服器,單機性能超過千萬每秒是毫無疑問的。
單機網路處理性能超過千萬每秒,這就是我激動的原因。
C10K問題與C10M問題
這時就要談起高性能網路伺服器的兩個經典問題,稱為C10K問題和C10M問題。
- C10K就是指單機網路處理性能達到1萬/每秒的並發處理能力
- C10M指單機網路處理性能達到1000萬/每秒的並發處理能力
The C10K problem 由 Dan Kegel 於2003/11/03 提出。在當時的硬體水平和作業系統能力上,單機支援1萬並發是很有難度的事情。由這個問題開始,催生了epoll為核心網路編程技術的推廣。
The C10M problem 由 Robert Graham 於2013/02提出。十年過去了,硬體、網路、作業系統都有大幅的提升,如何做到單機1000萬並發呢?當時討論的可行方案是多隊列網卡+多核IO+用戶態協議棧。後來,intel放出了DPDK這個網路包處理的神器,陸續開始有團隊基於DPDK挑戰C10M的具體實現。
而今,seastar出現了,這就意味著後台程式設計師可以以很低的門檻輕鬆寫出具備C10M性能的網路服務!!!令人驚嘆。
seastar的牛叉之處
對於其內部理念的介紹,我推薦閱讀這篇:《Seastar:多核機器上編寫高效複雜的伺服器應用程式的 C++ 庫》
通過官方文檔可以了解到這些特性:
-
底層包處理的API不是epoll,而是DPDK
有了DPDK,網卡中的包直接被傳輸到用戶空間的buffer中,免去了內核協議棧的層層處理。當然這裡還需要一個用戶態的協議棧,使得可以以更少的記憶體和更小CPU消耗來處理大量的網路包。
DPDK的使用門檻還是比較高的,而seastar已經把這個神器封裝在了框架之中,實在是皆大歡喜。 -
無共享設計
這也就是網路框架處理性能隨著核數增加而增加的秘訣。
首先,處理上是多核IO的,充分發揮出了伺服器的IO能力;
其次,各個核的處理邏輯獨立,減少了作業系統調度和NUMA結構的影響;
就算各個核之間需要通訊,seastar也提供了很好的通訊機制來避免加鎖。 -
充分利用了C++語言的新特性
高性能的網路框架毫無疑問應該設計成純非同步非阻塞的。但是非同步程式碼難寫難調試,開發周期太長。seastart利用了Futures and promises這樣的C++語言特性,使得程式碼可以同步編寫非同步執行,降低了心智負擔,又不會帶來性能的損失。
seastar會帶來什麼改變
我認為seastar並不僅僅只是又一個網路框架的輪子而已,它的出現將會改變一些領域的玩法:
- 倍數的性能提升,以及可以隨著核數增加而線性增加的性能,使得很多不得不依賴分散式解決的問題可以依賴單機解決,並且獲得更高的吞吐量和更低的成本。特別是純網路服務一類的應用,例如DNS POD分享的經驗,之前做了很多分散式的方案來解決大量域名託管的問題,後來硬體水平上去了就可以簡單粗暴的單機解決。
典型的應用有:NTP服務,DNS服務,cache服務,記憶體資料庫等。seastar能夠讓這類服務的硬體成本縮減數倍。 - 雲上的微服務,其通訊不再使用TCP/IP了,而是有特定的系統調用來專門發給特定的類似seastar寫成的服務進程。讓微服務的開發更簡單,又能充分榨乾網路伺服器的性能。
- 在高頻寬低延遲的場景,seastar能夠讓團隊快速開發出滿足要求的應用。典型的是實時音影片傳輸的場景,流量又大,對延遲又敏感,傳統的nginx一類的網路服務框架,在seastar面前黯然失色。
對這個框架也有一些期待:
- 希望儘快有rust語言的版本,系統編程領域,rust才是未來;
- 希望有支援seastar框架的容器環境;(畢竟DPDK不是作業系統內置的協議棧)
希望這個發現對你也有用,have fun 😃