1. 程式人生 > >異數OS TCP協議棧測試(三)--長連線篇

異數OS TCP協議棧測試(三)--長連線篇

異數OS TCP協議棧測試(三)--長連線篇

本文來自異數OS社群

 

github:  https://github.com/yds086/HereticOS

異數OS社群QQ群:  652455784

異數OS-織夢師(訊息中介軟體)群: 476260389

 

異數OS TCP長連線技術簡介

說起長連線,則首先要談對C10K的理解與認識,異數OS認為傳統系統中C10K問題主要如下:

1. 傳統OS 執行緒切換代價很大,執行緒資源有限(500以上可用性降低),這使得多執行緒阻塞IO效能達到1W時,執行緒切換將佔滿系統負載,應用併發session數量則被系統執行緒數量約束,但多執行緒阻塞

IO這種模式對應用邏輯設計而言卻是天然簡單友好靠譜的,而異數OS執行緒切換能力為80M, 1億執行緒4G記憶體,也不會降低太多執行緒切換能力以及IO能力, 所以使用這種方案。

2. 為了避免執行緒切換以及執行緒資源不夠帶來的問題,主流作業系統使用佇列技術(iocp epoll)來批量成倍提升IO效能,每次執行緒切換完成10個甚至數百IO操作或者event推送,使用非同步技術來讓單個執行緒管理多個session的能力,所以表面上看提高了併發容量,但這類技術卻大大降低了併發質量反而造成了更嚴重的C10K問題,使用這一技術,每個連結必須要提供中間傳輸快取,連結多了後,IO需求大時,

佇列會很長,延遲會很高,加重了系統負擔,由於這類技術都是非阻塞非同步IO,不能較好的阻塞session應用邏輯,因此無法為每連結做可靠的業務流程控制以及QOS控制,連結多了,就會有餓死的連結,出現大量錯誤IO,相對多執行緒阻塞IO模式,雪崩問題更加嚴重。

3. TCP協議棧沒有為海量連結做優化,其常見的流控擁塞演算法都只針對連結自身的IO效能,並不考慮上層應用實際需求,以及其他連結的IO需求,在這種情況下TCP檢查網路擁塞的演算法將沒有任何意義,實際測試發現如果每連結IO不做控制,1000連結都很難上去,正確的做法是將擁塞控制演算法提高到系統層以及應用層由系統QOS任務排程以及應用需求共同來實現。

4. 協議棧中間快取太多,拷貝動作較多,傳統OS每連結協議棧需要4K以上記憶體,實做一個1000W連結的系統一般要60G記憶體起步,這直接增加了系統負載,降低了系統可用性。

5. 協議棧IO效能不足,由於傳統作業系統IO效能約束,實做的協議棧只能提供10-40WIO效能,並且不能多核擴充,IO過載時會,協議棧會出現無響應丟包現象,丟包後協議棧效能需求會更高,能提供的IO效能會大大降低,如果應用不能適應這種IO效能變化,將會製造更多的中間快取,導致雪崩,在這樣的情況下,做1000W連結的應用可用性會受到極大的限制,比如微信使用這一類技術就只能用於心跳連結活躍檢查。

 

一些號稱實做了C10M的技術方案從本質上沒有解決上述問題,僅僅靠硬體技術堆硬體配置來表面實現,但實際上卻沒有任何可用性。


異數OS TCP長連線技術演變


2015年,異數OS考慮開始使用海量執行緒同步阻塞IO的方案來解決iocp不能做QOS,佇列過長的問題,異數OS使用任務排程來控制每連結的IO提交效能需求,並智慧感知雪崩情況的發生,動態控制IO效能以及應用提交的中間快取規模,從而減少了中間快取開銷,降低了海量併發下iocp佇列深度,降低對宿主作業系統的負載壓力,從而實現了1000W連結12W的訊息推送效能。

 

2017年,由於發現宿主作業系統協議棧的能力約束,異數OS決定拋棄宿主作業系統協議棧,以及IO技術,開始自主研發TCP協議棧,實做0中間快取,1次中間拷貝的技術,從而達到每連結300位元組佔用,併發容量相對異數OS 2015,提高15倍,IO效能提升100倍,且可以多核擴充,大大提高了海量併發環境的系統可用性。

 

 

測試目標

 

TCP 長連結IO效能測試,Client Server都採用單執行緒半雙工模式,建立600W客戶端(本機測試相當於1200W連結),連結服務端後做迴圈ECHO,測試ECHO IO效能,IO延遲,每連結效能穩定性。

 

 

基本測試環境

VMware 12

異數OS宿主作業系統 debian 8 64

CPU : NUC i3 2.6G 雙核

記憶體:5GB

 

相關引數

1. 帶包頭200位元組負載,不帶crc checksum, 無丟包,無硬體延遲情況。

2.  TCP協議棧使用均衡IO排程策略。

測試方案一 (單核)

在同一個CPU核上建立Server,600WClient, 以太層使用異數OS軟體交換機本地核定向轉發。

 

啟動前期:

 

 

啟動後期(2個多小時後):

 

 

總計ECHO IOPS 2.3M ,軟體交換機包交換能力9Mpps,由於Client佔用60%的負載,軟體交換機佔用20%負載,所以預計真實環境中最大可達到6.0M左右的ECHO能力,IO延遲方面,在系統啟動階段由於大量連結的建立,每連結IO需求不穩定,系統QOS IO均衡並沒有顯著的發生作用,平均延遲達到了2秒,一些連結任然有飢餓現象,出現上百秒才響應的情況,在穩定連結後期,每連結IO需求穩定後,IO延遲下降,飢餓現象得到緩解,但還是有10s延遲的連結出現。

 

 

總結

由於只使用了TCP協議棧的任務均衡排程控制方案,因此每連結IO質量在應用負載不均的情況下還是不能得到及早的控制,這個問題後面會由應用系統的QOS來解決,比如mqtt等專業的APP QOS控制,下面是幾種主流系統的海量連結平臺能力效能對比,資料來自官網以及第三方測試,可比性可能不高,但也可做參考估算,讀者如有其他海量併發的技術測試也歡迎提供

 

 

對比專案

異數OS 2018

異數OS 2015+Win7

異數OS 2015+Win10

360push

Whatsapp

CPU佔用數量

1

16

16

24

12

記憶體佔用

4G

64G

64G

256G

128G

實現的連結數

1200W

1000W

300W

100W

300W

使用的技術平臺

寄宿Linux+異數自主協議棧

寄宿win+iocp

寄宿win+iocp

Go+epoll

Erlang+epoll

測試內容

ECHO 推拉

僅推

僅推

僅推

僅推

推送效能

4.5M

12W

40W

2W

12W

折算的IO效能

9M

12W

40W

2W

12W

已知問題

缺乏經費支援

缺乏經費支援

缺乏經費支援

容易宕機,要反覆重啟

特製應用平臺,不同用。