今天太開心了,因為我知道了seastar框架

  • 2022 年 1 月 19 日
  • 筆記

今天聽說了一個新的C++語言開發的網路框架,叫做seastar。
seastar有何特別之處呢?先看看官網提供的性能數據:

性能

  • HTTPD benchmark:

    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++ 庫》

通過官方文檔可以了解到這些特性:

  1. 底層包處理的API不是epoll,而是DPDK
    有了DPDK,網卡中的包直接被傳輸到用戶空間的buffer中,免去了內核協議棧的層層處理。當然這裡還需要一個用戶態的協議棧,使得可以以更少的記憶體和更小CPU消耗來處理大量的網路包。
    DPDK的使用門檻還是比較高的,而seastar已經把這個神器封裝在了框架之中,實在是皆大歡喜。

  2. 無共享設計
    這也就是網路框架處理性能隨著核數增加而增加的秘訣。
    首先,處理上是多核IO的,充分發揮出了伺服器的IO能力;
    其次,各個核的處理邏輯獨立,減少了作業系統調度和NUMA結構的影響;
    就算各個核之間需要通訊,seastar也提供了很好的通訊機制來避免加鎖。

  3. 充分利用了C++語言的新特性
    高性能的網路框架毫無疑問應該設計成純非同步非阻塞的。但是非同步程式碼難寫難調試,開發周期太長。seastart利用了Futures and promises這樣的C++語言特性,使得程式碼可以同步編寫非同步執行,降低了心智負擔,又不會帶來性能的損失。

seastar會帶來什麼改變

我認為seastar並不僅僅只是又一個網路框架的輪子而已,它的出現將會改變一些領域的玩法:

  1. 倍數的性能提升,以及可以隨著核數增加而線性增加的性能,使得很多不得不依賴分散式解決的問題可以依賴單機解決,並且獲得更高的吞吐量和更低的成本。特別是純網路服務一類的應用,例如DNS POD分享的經驗,之前做了很多分散式的方案來解決大量域名託管的問題,後來硬體水平上去了就可以簡單粗暴的單機解決。
    典型的應用有:NTP服務,DNS服務,cache服務,記憶體資料庫等。seastar能夠讓這類服務的硬體成本縮減數倍。
  2. 雲上的微服務,其通訊不再使用TCP/IP了,而是有特定的系統調用來專門發給特定的類似seastar寫成的服務進程。讓微服務的開發更簡單,又能充分榨乾網路伺服器的性能。
  3. 在高頻寬低延遲的場景,seastar能夠讓團隊快速開發出滿足要求的應用。典型的是實時音影片傳輸的場景,流量又大,對延遲又敏感,傳統的nginx一類的網路服務框架,在seastar面前黯然失色。

對這個框架也有一些期待:

  1. 希望儘快有rust語言的版本,系統編程領域,rust才是未來;
  2. 希望有支援seastar框架的容器環境;(畢竟DPDK不是作業系統內置的協議棧)

希望這個發現對你也有用,have fun 😃

Tags: