2012-02-14 30 views
13

要了解我在處理傳入數據方面的表現如何,我想測量我的TCP和UDP套接字的隊列長度。如何獲得UDP套接字的排隊數據量?

我知道我可以通過SO_RCVBUF套接字選項獲取隊列大小,並且ioctl(<sockfd>, SIOCINQ, &<some_int>)告訴我有關TCP套接字的信息。但對於UDP,ioctl只返回下一個未決數據報的大小。有沒有辦法如何獲得隊列大小的UDP,而不必分析系統表,如/proc/net/udp

+4

恐怕你不能直接獲取這些信息,因爲內核不支持它。 – ldx 2012-02-14 15:51:32

回答

6

由於ldx提到,它不支持通過ioctl或getsockopt。 在我看來,SIOCINQ的當前實現旨在確定需要多少緩衝區來讀取整個等待緩衝區(但我想它並不那麼有用,因爲它可以在讀取它到實際緩衝區讀取)。

還有很多其他的遙測,雖然這樣的系統調用不支持,我想在正常的生產使用中沒有真正的需要。

您可以通過「netstat -su」檢查丟棄/錯誤,如果您只是想監視機器狀態,可以使用SNMP(udpInErrors)更好地檢查丟失/錯誤。

順便說一句:你總是可以選擇在內核代碼中進行破解並添加此值(或其他值)。

6

FWIW,我做了一些實驗來繪製在不同平臺上FIONREAD的行爲。

平臺,其中FIONREAD返回所有的數據在SOCK_DGRAM插座待定:

的Mac OS X,NetBSD的,FreeBSD的,Solaris和HP-UX,AIX,視窗

平臺,其中FIONREAD回報僅用於第一個待處理數據報的字節:

Linux

也可能值得注意的是,某些實現在計數中包含頭文件或其他開銷字節,而其他實例只計算有效負載字節數。 Linux似乎會返回有效負載大小,不包括IP標頭。

+2

恐怕這不起作用,根據[udp(7)](http://www.kernel.org/doc/man-pages/online/pages/man7/udp.7.html):_「FIONREAD (SIOCINQ):返回整數中下一個待處理數據報的大小(以字節爲單位),或者當沒有數據報掛起時返回0。「_ – che 2012-02-16 06:41:09

+2

我的錯誤:我忘記了'FIONREAD'在Linux上的工作方式與* BSD上的不同。 Solaris操作系統。我將編輯我的答案以顯示平臺差異。 – 2012-02-16 19:44:24