2012-12-18 39 views
1

我正在調試與我的C++程序接收RTP的丟包問題。 當我的程序運行了很長時間後收到大量RTP數據後,它開始丟失數據包。什麼時候Linux網絡堆棧丟棄收到RTP包?

使用Wireshark進行跟蹤顯示丟失的數據包,但我的應用程序永遠不會收到它們。看起來,網絡堆棧在將它們傳遞給應用程序之前將其丟棄。重新啓動我的應用程序後,一切都恢復正常。

爲了生成錯誤條件,我使用RTP重載機器,並在此時發生數據包丟失,並有充分的理由。但即使在我停止過載並以適度的速率開始發送之後,數據包仍會丟失,我必須重新啓動應用程序才能再次接收所有數據。

這是Linux接收緩衝區處理的問題嗎?我可以檢查哪些Linux統計數據以查看丟失數據包的位置?

+3

當你在wireshark中看到它們時,它們到達網絡堆棧。 netstat -s可以顯示相當多的統計信息,通常您可以得出這樣的結論:OS緩衝區已滿,因爲您的應用程序沒有足夠快速地收到(或)類似的數據包。 – PlasmaHH

+0

@PlasmaHH:謝謝!如果我的應用程序讀取速度不夠快,那麼netstat -s中的哪些計數器會增加? –

+0

我不知道RTP是如何工作的,並且可用的統計信息在內核版本中有所不同,但是如果基於UDP的話,那麼Udp:RcvbufErrors將成爲一個強有力的指示器(您可能還想檢查緩衝區是否對您而言太小wokrload) – PlasmaHH

回答

3

你沒有足夠快地消耗你的UDP輸入。下面是一些常用的步驟來減輕:

  • 切換到recvmmsg(2)如果你的內核支持的話,以減少系統調用開銷,
  • 預分配的輸入處理過程中使用的所有內存,
  • 簡介您的應用程序,尋找熱點和優化,
  • 也許農場加工出單獨的線程,但保持鎖定範圍儘可能小,
  • 提高您的插座receive buffersetsockopt(2)),