2011-11-30 62 views
0

我寫了一個定製的C#程序,可以接收約1MByte /秒的UDP組播數據。它運行在千兆網卡上,連接到專用服務器。在千兆位UDP連接上收到數據丟失的可能原因?

在一天中的某些時間,當網絡流量很高時,會丟失UDP數據包。

  • 如果我有程序運行的副本,他們都收到UDP數據包的100%,在8小時內。
  • 如果我有程序運行的副本,他們都開始失去偶爾UDP數據包在相同的8小時內。

在這兩種情況下,CPU使用率僅約爲15%峯值。

這怎麼可能?

+3

你知道UDP不保證傳遞權嗎? ...預計丟包 - 特別是在負載下 – jtm001

+0

@ jtm001。是的,我知道這一點。然而,在這種情況下,它無關緊要,因爲程序的所有副本都在監視相同的UDP流。在這種情況下,數據包進入NIC後發生數據包丟失*。 – Contango

回答

1

實際上有兩個緩衝區,在這裏工作:硬件緩衝區(上網卡)和窗口端緩衝區(在.NET中設置)。我們將網卡上的硬件緩衝區重新配置爲1024KB而不是256KB,希望能夠解決這個問題。

1

如果您需要使用TCP代替保證數據包傳輸,UDP連接不保證數據包的傳輸。

有丟包各種原因使用UDP時,要列出幾個:

  • 網絡擁塞,
  • 數據包損壞,
  • 硬件故障。

儘管您可能只使用服務器(或客戶端)上CPU的15%,但這並不意味着您不會耗盡其他資源(即網絡吞吐量,路由器緩衝區)。對我來說,這聽起來像是你正在遭受網絡擁塞的困擾(正如你自己所說的那樣,這隻會在網絡流量高的時候出現)。

+1

看起來解決方案是增加網卡上硬件緩衝區的大小。 – Contango

0

如果當你運行三份拷貝時,它們不會丟棄相同的數據包,這不是網絡問題。你可能會填充套接字接收緩衝區。

我不是非常熟悉如何調整這個在Windows,但檢查了這一點:

How can I set the buffer size for the underneath Socket UDP?

+0

你是什麼意思'放*相同*數據包'?和什麼一樣?爲什麼這意味着它不是一個網絡問題? – EJP

+0

這是我們嘗試過的解決方案之一。我們在接收緩衝區中獲得高達15MB的峯值,所以我們將Windows端接收緩衝區設置爲250MB。 – Contango

+0

@EJP我只能推斷,因爲流量是多播。我認爲偵聽該流的進程數量不會改變機器正在接收的實際數據包的數量。所以每個進程都在接收相同數據包的副本。 – cpugeniusmv