多路復用其實并不是什么新技術(shù),它的作用是在一個通訊連接的基礎(chǔ)上可以同時進行多個請求響應處理。對于網(wǎng)絡(luò)通訊來其實不存在這一說法,因為網(wǎng)絡(luò)層面只負責數(shù)據(jù)傳輸;由于上層應用協(xié)議的制訂問題,導致了很多傳統(tǒng)服務(wù)并不能支持多路復用;如:http1.1,sqlserver和redis等等,雖然有些服務(wù)提供批量處理,但這些處理都基于一個RPS下。下面通過圖解來了解釋單路和多路復用的區(qū)別。

單路存在的問題
每個請求響應獨占一個連接,并獨占連接網(wǎng)絡(luò)讀寫;這樣導致連接在有大量時間被閑置無法更好地利用網(wǎng)絡(luò)資源。由于是獨占讀寫IO,這樣導致RPS處理量由必須由IO承擔,IO操作起來比較損耗性能,這樣在高RPS處理就出現(xiàn)性能問題。由于不能有效的合并IO也會導致在通訊中的帶寬存在浪費情況,特別對于比較小的請求數(shù)據(jù)包。通訊上的延時當要持大量的RPS那就必須要有更多連接支撐,連接數(shù)增加也對資源的開銷有所增加。
多路復用的優(yōu)點
多路復用可以在一個連接上同時處理多個請求響應,這樣可以大大的減少連接的數(shù)量,并提高了網(wǎng)絡(luò)的處理能力。由于是共享連接不同請求響應數(shù)據(jù)包可以合并到一個IO上處理,這樣可以大大降低IO的處理量,讓性能表現(xiàn)得更出色。
通過多路復用實現(xiàn)百萬級RPS
多路復用是不是真的如此出色呢,以下在.net core上使用多路復用實現(xiàn)單服務(wù)百萬RPS吞吐,并能達到比較低的延時性。以下是測試流程:
由于基礎(chǔ)通訊不具備消息包合并功能,所以在BeetleX的基礎(chǔ)上做集成測試,主要BeetleX會自動合并消息到一個Buffer上,從而降低IO的讀寫。
測試消息結(jié)構(gòu)
本測試使用了Protobuf作為基礎(chǔ)交互消息,畢竟Protobuf已經(jīng)是一個二進制序列化標準了。
請求消息


整個測試開啟了10個連接,在這10個連接的基礎(chǔ)上進行請求響應復用。
測試配置
測試環(huán)境是兩臺服務(wù)器,配置是阿里云上的12核服務(wù)器(對應的物理機應該是6核12線程)
服務(wù)和客戶端的系統(tǒng)都是:Ubuntu 16.04
Dotnet core版本是:2.14
測試結(jié)果
客戶端統(tǒng)計結(jié)果

服務(wù)端統(tǒng)計信息

帶寬統(tǒng)計

測試使用了10個連接進行多路復用,每秒接收響應量在100W,大部分響應延時在1-3毫秒之間。
-
多路復用
+關(guān)注
關(guān)注
0文章
39瀏覽量
26086
發(fā)布評論請先 登錄
16位1MSPS多路復用數(shù)據(jù)采集系統(tǒng)
AD8184-EB是用于視頻路由和多路復用系統(tǒng)的單路4:1模擬多路復用器評估板
用于視頻路由和多路復用系統(tǒng)的單路2:1模擬多路復用器
AD8174緩沖模擬多路復用器
如何在Mx1051的FlexCAN1中配置簡單信號多路復用和擴展信號多路復用?
基于CPLD的非多路復用與多路復用總線轉(zhuǎn)換橋的設(shè)計與實現(xiàn)
非多路復用與多路復用總線轉(zhuǎn)換橋的設(shè)計與實現(xiàn)
非多路復用與多路復用總線轉(zhuǎn)換橋的設(shè)計與實現(xiàn)
多路復用實現(xiàn)單服百萬級別RPS吞吐的辦法
評論