2016-09-14 115 views
0

我在以太網上運行客戶端服務器配置,並測量兩端的數據包延遲。客戶端(windows)每隔5毫秒發送一次數據包(用線鯊魚確認)。然而,服務器(嵌入式linux)僅以5毫秒的間隔接收數據包幾秒鐘,此時停止300毫秒。休息之後,延遲只有20美分。再過幾秒鐘後,又需要300毫秒的時間。這無限重複(300ms中斷,20us數據包延遲突發)。看起來好像服務器程序正在優化中,以更短的突發讀取IO。這是爲什麼發生?爲什麼UDP數據包接收似乎優化中執行?

免責聲明:我還沒有發佈的代碼,爲客戶端和服務器的更復雜的應用小的子集,但是,我願意因素出來,如果一個顯而易見的答案並不存在本身。

+0

是否收到所有的數據包? – EJP

+0

我相信如此。我明天可以驗證這一點。 – Ralph

+0

你如何測量20 us的延遲?是否有任何請求響應?你有原子鐘嗎?數據報的大小是多少? – rodolk

回答

0

我昏昏沉沉地測量到1每1000個數據包,現在它表現自己。我每5ms使用printf,它必須最終完全填充printf tx隊列。然後這延遲了300ms的執行。一旦printf喘不過氣來,程序就有一個隊列充滿了傳入的數據包,因此似乎每20個美國人就接收一次數據包。

1

這是UDP所以沒有握手或任何流控制機制。這300毫秒必須是因爲服務器在處理收到的UDP消息時所做的工作。在這300毫秒的時間內,服務器肯定會丟失大約60條未從客戶端讀取的消息。

你也許可能要檢查服務器是否使用一個線程來處理並不需要超過5毫秒處理每個消息。如果服務器使用多線程來處理消息,並且處理需要一些時間,即使花費1毫秒,也可能處於以下情況:在某些時候,所有線程都在競爭資源,並且他們沒有及時完成閱讀下一條消息。對於你描述的問題,我敢打賭,服務器是多線程的,你有這個問題。雖然我不能保證100%的信息不足。但無論如何,您都希望檢查處理消息所需的時間,因爲您可能正在處理實時需求。

+0

對於不提供更多信息,我表示歉意。程序中只有兩個線程,另一個線程(另一個udp服務器)沒有被提供任何數據。另外,當測量結果被採納時,我感興趣的線程所處理的「處理」被註釋掉了。 – Ralph