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


今天聽說了一個新的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 😃

原文鏈接
我的公眾號:😃


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM