UDP是一個完全可行的協議。對於正確的工作來說,正確的工具就是同樣的老案例!
如果你有一個等待UDP數據報的程序,然後在返回等待另一個程序之前處理它們,那麼你的處理時間總是比數據報的最壞情況到達率要快。如果不是,則UDP套接字接收隊列將開始填充。
這可以容忍短爆發。隊列完成它應該做的事 - 排隊數據報,直到你準備好了。但如果平均到達率經常導致隊列積壓,現在是重新設計程序的時候了。這裏有兩個主要的選擇:通過狡猾的編程技術減少處理時間,和/或多線程你的程序。也可以使用跨多個程序實例的負載平衡。
如上所述,在Linux上,您可以檢查proc文件系統以獲取有關UDP的最新狀態。例如,如果我cat
的/proc/net/udp
節點,我得到的是這樣的:
$ cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
40: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 3466 2 ffff88013abc8340 0
67: 00000000:231D 00000000:0000 07 00000000:0001E4C8 00:00000000 00000000 1006 0 16940862 2 ffff88013abc9040 2237
122: 00000000:30D4 00000000:0000 07 00000000:00000000 00:00000000 00000000 1006 0 912865 2 ffff88013abc8d00 0
從這個,我可以看到,通過用戶ID 1006所擁有的插座,正在偵聽端口0x231D(8989)和接收隊列大約在128KB。由於128KB是我係統上的最大容量,這告訴我我的程序在跟上到達的數據報時非常脆弱。到目前爲止,已經有2237個丟包,這意味着UDP層不能將更多的數據報放入套接字隊列,並且必須丟棄它們。
您可以隨時觀看您的節目的行爲,例如,使用:
watch -d 'cat /proc/net/udp|grep 00000000:231D'
還要注意netstat命令做的是同一件事:netstat -c --udp -an
我爲我的威尼程序的解決方案,將是多線程。
乾杯!
感謝rx_queue,剩下的 - 請參閱更新) – 2010-02-19 05:35:49
@Juliano誰說他可以選擇協議來使用?也許他正在實施基於udp的協議來爲現有客戶提供服務。 – steffen 2013-12-11 10:59:08
海報希望瞭解有關監視UDP統計信息的信息,而不是關於使用哪種協議的意見。通過首先確定層損失發生的位置,然後可以進行修復。 – RickS 2015-05-20 23:10:46