2012-11-01 51 views
2

在基於RAW套接字的數據包發送測試中,我發現了非常刺激的症狀。 使用默認的RAW套接字設置(特別是對於SO_SNDBUF大小), 原始套接字可毫無問題地發送100,000個數據包,但發送所有數據包需要大約8秒的時間,並且數據包被接收器進程正確接收。 這意味着通過默認設置可以實現大約10,000pps(每秒數據包)。 (我認爲這是太小了數字出乎我的意料。)RAW套接字發送:數據包丟失

無論如何,增加PPS值,我增加了數據包通過調整在/ proc/SYS /網/核心/ {wmem_max,wmem_default發送緩衝區大小 }。 增加兩個系統參數後,我確定了刺激症狀。 儘快發送100,000個數據包,但只有3,000個數據包由接收器進程(位於遠程節點)接收到 。

在發送的Linux機器上(Centos 5.2),我做了netstat -a -s和ifconfig。 Netstat顯示發出了100,000個請求,但ifconfig顯示 只有3000個數據包被髮送。

我想知道爲什麼發生這種情況,我也想知道 我該如何解決這個問題(當然我不知道它是否真的是一個問題)。

有沒有人可以給我一些建議,例子或對這個問題的引用?

最好的問候, bjlee

回答

1

你沒有說你的包是什麼規模或網絡的網卡,硬件或對遠程計算機接收的數據進行任何的任何特徵。

我懷疑,而不是玩/ proc/sys的東西,你應該使用ethtool來調整環緩衝區的數量,但不一定是這些緩衝區的大小。

另外,this page是一個很好的資源。

+0

感謝您的評論。 我試過ethtool -G rx 4096 tx 4096和 觀察到tx troughput增加了一倍。 但是最顯着的增強是通過/ sbin/ifconfig eth1 txqueuelen 65536實現的 。 使用此設置,tx吞吐量最大化爲 (在0.16秒內發送大約70,000個數據包)。 謝謝! –

+0

只是好奇,但沒有很多吃進內核內存或不能交換的內存。只是想知道什麼是權衡,否則我們都希望Linux內核預先調整到你所做的。 – selbie

+0

我同意。但我不知道權衡。我需要來自內核專家的評論。 –

1

我剛剛一直在處理基本相同的問題。我意外地偶然發現了一個完全違反直覺的答案,這對我來說仍然沒有意義,但它似乎有效。

我正在嘗試越來越大的緩衝區大小,並丟失像瘋了一樣的數據包。通過意外超出我的系統定義的最大值,它將SO_SNDBUF大小設置爲一個非常小的數字,但奇怪的是,我不再有丟包問題。所以我故意將SO_SNDBUF設置爲1,這又導致了一個非常小的數字(不確定,但我認爲它實際上將其設置爲類似於1k),並且令人驚訝的是,仍然沒有丟包。

如果任何人都可以解釋這一點,我會很樂意聽到它。萬一它很重要,我的版本Linux is RHEL 5.11(是的,我知道,我有點落伍了)。