我開發了一些基於JBoss + EJB的企業應用程序的一部分。我的模塊需要處理大量的傳入UDP數據包。我已經做了一些負載測試,看起來如果以11ms的間隔發送數據包,一切都很好,但是如果間隔爲10ms,一些數據包將丟失。這在我看來很奇怪,但是我多次進行10/11ms間隔負載測試比較,結果總是相同的(10毫秒 - 一些「丟失」數據包,11毫秒 - 一切正常)。「Lost」UDP數據包(JBoss + DatagramSocket)
如果出現同步問題,我希望在11ms測試(至少丟失一個包或者至少有一個錯誤的計數器值)的情況下也可以看到它。 所以,如果它不是因爲同步,那麼可能DatagramSocket通過我接收數據包不能按預期方式工作。
我發現接收緩衝區大小(SO_RCVBUF)具有默認的57344值(可能是底層IO網絡緩衝區相關)。我懷疑,也許當這個緩衝區滿了,然後新的傳入UDP數據報被拒絕。我試着將這個值設置得更高一些,但是我注意到如果誇大,緩衝區會返回到它的默認大小。如果它依賴於底層,我如何從JBoss級別找出某個OS /網卡的最大緩衝區大小?
它可能是由接收緩衝區大小引起的,或者可能是57344的值足夠大以處理大多數情況?你有這種問題的經驗嗎?
DatagramSocket沒有超時設置。我的UDP數據報包含大約70個字節的數據(沒有包含數據報頭的值)。
[編輯] 我必須使用UDP,因爲我收到Cisco Netflow數據 - 它是網絡設備用來發送一些流量統計信息的協議。另外,我對發送的字節格式沒有影響(例如,我不能爲數據包添加計數器等等)。預計不會處理所有數據包(有些數據報可能會丟失),但我希望我會處理大部分數據包。在10ms間隔測試期間,大約30%的數據包丟失。
緩慢的處理不太可能導致此問題。目前singleton組件在一個循環中持有對DatagramSocket調用接收方法的引用。收到數據包後,它將被傳遞到隊列,並通過從池無狀態組件中挑選出來進行處理。 「Facade」Singleton只負責接收數據包並將其傳遞給處理(它不會等待處理完成事件)。
由於提前, 彼得
爲什麼你需要UDP?我會使用TCP,直到你有一個分析表明一個需要去UDP的飽和層。另外,我使用UDP的經驗是數據通常是重複的。 「這是目前的狀態。」所以不要擔心,如果你錯過了這個數據包,因爲另一個數據包即將推出! – corsiKa 2011-02-23 18:44:49
「緩慢的處理不太可能導致此問題。」 - 我認爲是這樣,因爲10毫秒很小,與螺紋量程相同。 – ChrisW 2011-02-23 19:22:00
10ms在不同的操作系統/處理器上可能會有所不同。你可以發送較少的數據,比如100ms嗎? – 2011-02-23 19:29:00