宋 克
(中國船舶集團公司第七一五研究所,浙江 杭州 310000)
在數據采集與傳輸系統中,數據發送端將傳感器通過高采樣率采集而來的數據包經10Gb/s的網絡鏈路分發到各處理系統,各處理系統基于通用CPU完成包括原始數據接收、校驗、聚類、編隊在內的初步處理流程。UDP被稱為用戶數據報傳輸協議,是一種無需建立連接便可發送數據包的方式,在阻塞、連接和尋址方面相對于傳輸控制協議(TCP)來講,更適合于本系統。雖然UDP報文存在傳輸過程中數據包可能丟失的問題,但在簡單網絡拓撲結構中,我們可以通過優化實現基于UDP的可靠高速網絡數據通信。在系統構建過程中,我們使用標準Linux系統,將傳感器高采樣率采集而來的數據包通過發送端經傳輸鏈路發送到各接收端,針對傳輸鏈路中出現丟包現象的問題,本文提出了優化發送端和接收端之間數據傳輸的方法,從而實現了高速可靠的UDP網絡傳輸鏈路。
TCP和UDP均旨在提供網絡連接設備之間的端到端通信,根據系統構建需求,我們針對以下幾個方面對TCP和UDP進行了比較:在擁塞方面,任何網絡傳輸鏈路,都有可能存在擁塞的可能,并且在無法處理時可能會丟棄數據包。TCP檢測到擁塞時,將降低其傳輸速率,但是在本系統中,發送端通常會以一個比較高的速率進行數據發送,如果使用TCP協議,接收端的擁塞將會導致發送端降低數據的發送速率,這首先會導致數據在發動端應用程序的發送緩沖區進行累計直到緩沖區滿并且導致最后數據包的丟失。在連接方面,TCP是面向連接的,而UDP是無連接的,這就意味著TCP要求必須先建立連接,然后才能傳輸數據。相反,使用UDP進行數據傳輸不需要考慮連接狀態,接收程序只要準備好就將在指定的UDP端口上進行監聽,并在接收數據到達時進行接收。在尋址方面,UDP數據可以通過IP廣播或IP多播進行傳輸,這就意味著一個發送程序可以將數據傳輸給多個接收程序而無需其他的編程工作,而TCP要實現同樣的功能這將需要處理多個連接,將增加復雜性。所以我們首選使用UDP進行數據傳輸,前提是我們能夠實現高速傳輸的可靠性。
到達接收端的數據包必須遵循幾乎恒定的處理流程,這是由中斷處理、數據校驗、聚類、編隊等操作造成。接收端處理數據包的數量不斷上升時,數據包處理將消耗掉絕大多數的CPU資源,CPU瓶頸問題將導致數據包的丟失。在當前可利用資源下,為了獲得最佳的性能,數據包應盡可能使用巨型幀,使用較大的以太網幀將明顯降低CPU額外開銷。
系統中的數據對于接收端并非都是有意義的,以太網、IP、UDP報文頭始終存在并占用網絡帶寬資源,當通過UDP傳輸18字節用戶數據時,將占用網絡帶寬上的84字節(20字節幀間距、64字節以太幀),額外開銷占用比超過78%,當發送8972字節用戶數據時,將占用網絡上的9038字節(20字節幀間距、9018字節以太幀),額外開銷占用比僅為0.73%。在系統中使用更大的網絡數據包將明顯降低網絡帶寬資源的額外開銷。
一個UDP數據包可能在數據傳輸鏈路中的任一過程中被丟棄掉:發送方,接收方,或者中間系統。但是對于簡單的網絡拓撲結構來說,數據包丟失主要是由以太網接口卡(NIC)傳輸隊列和套接字接收緩沖區引起的,通常這兩個參數都是可以通過人工設置進行優化的。Linux系統控制套接字緩沖區的主要參數是rmem_max和wmem_max,前者是UDP套接字接收緩沖區的大小,而后者是UDP套接字發送緩沖區的大小,修改系統核心參數外,我們也要在應用程序中設置發送和接收緩沖區,我們使用 int setsockopt(int sockfd, int level,int optname,const void *optval, socklen_t optlen) 函 數來進行控制。此外,對系統層級netdev_max_backlog和txqueuelen參數進行了修改。以太網適配器的MTU為9000,允許發送有效包長度在8972字節的報文。
現代CPU嚴重依賴高速緩存來實現性能,這些緩存中有些是指令和數據之間共享,有些是專用的。為了確保發送和接收應用程序始終使用相同的緩存,我們將“鎖定”應用程序到特定的核心。為此,我們使用Linux命令taskset()。這樣可以防止應用程序進程遷移至其他內核,從而導致中斷在數據處理中,但這不能夠阻止其他進程交換到這一核心上。
試驗中,發送端和接收端使用短單模光纖通過10Gb/s的以太交換機進行連接,發送端保持硬件資源允許范圍內的最大數據包發送速率進行400GB數據的UDP傳輸試驗。在試驗測試中,數據發送端和接接收端均修改以太網卡的最大傳輸單元(MTU),允許傳輸UDP巨型幀;發送端和接收端應用程序都使用setsocketopt()來調整發送和接收緩沖區大小;數據發送端應用程序將數據包序列號包含到UDP數據報文中,從而允許接收端檢測數據包丟失計算丟包率;發送端和接收端均使用taskset()函數將應用程序鎖定到特定的CPU核心上。
經過試驗測試,最終的結果涵蓋了用戶數據速率、數據包錯誤率和CPU負載等測量結果,我們得到以下結論:數據速率方面:當使用較小數據包時,因發送端CPU負荷瓶頸問題,數據包率有限,實際數據帶寬小于10Gb/s的理論帶寬,隨著使用較大的數據包,數據帶寬逐漸接近于理論帶寬并達到帶寬上限。數據包錯誤率及CPU負載方面:當使用系統默認發送和接收緩沖區時,數據包的錯誤率較高,當調整發送和接收緩沖區大小后,數據包的錯誤率得到明顯降低;使用較小數據包時,接收端處理數據包的數量不斷上升,足夠多的數據包處理將消耗掉絕大多數的CPU資源,CPU瓶頸問題將導致數據包的丟失,隨著使用較大的數據包時,接收端CPU負載降低,數據包錯誤率下降。