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