2012-04-30 50 views
1

我試圖在兩臺PC之間建立一個帶寬測試,只需在它們之間進行切換。所有網絡硬件都是千兆位。一臺機器中,我安裝了一個程序來打開套接字,監聽連接,接受,然後循環讀取數據並測量收到的與「性能計數器」相關的字節數。在另一臺機器上,程序打開一個連接到第一臺機器的套接字,然後進入一個緊密的循環,以儘可能快的速度將數據傳輸到連接中,每次發送()1K數據塊。只有這樣的設置,事情似乎可以接受的速度很快;我可以通過網絡獲得約30至40 兆字節 /秒 - 明顯快於100BaseT的,合理性的千兆H/W領域內。如何解釋這個令人難以置信的慢套接字連接?

這裏是開始的樂趣:我試着用setsockopt()來設置每一端的緩衝區大小(SO_SNDBUF,SO_RCVBUF)爲1K。突然,接收端報告每秒鐘只有4,000或5,000個字節。插裝的東西在發射側,看來在send()調用取0.2〜0.3秒每個,只是發送1K塊。從接收端刪除setsockopt()似乎沒有改變。

現在顯然,試圖操縱緩衝區的大小是一個壞主意。我曾想過,可能會強制緩衝區大小爲1K,send()調用爲1K,這將強制操作系統在每次發送呼叫時將一個數據包放在線路上,並且理解這會阻止網絡堆棧有效地組合數據進行傳輸 - 但我不希望吞吐量下降到4-5K /秒!

我沒有時間上的資源,以追逐下來,並真正瞭解它,我想的方式,但真的想知道什麼可以做一個發送()取0.2秒。即使它正在等待對方的反擊,0.2秒也是令人難以置信的。是什麼賦予了?

+0

我是新來的插座自己,我也尋找到了類似的性能問題。操作系統不會爲錯誤檢查,路由,尋址消息增加一些開銷嗎?當你製作1K緩衝區時,TCP堆棧中的哪一個是1K?如果在最後(就在連線之前),它可能是TCP還是IP會給數據包增加開銷,這可能會使操作系統發送並確認更多的數據包?另一方面,如果該緩衝區就在您的應用程序附近,那麼發送的數據包將大於1K。我對套接字尚不瞭解還不夠了解,但這是值得思考的。 –

回答

3

解釋是簡單地說,一個1k緩衝區是一個令人難以置信的小緩衝區大小,並且您的發送機器可能一次發送一個數據包。在清空緩衝區並接受從應用程序發送的下一個塊(因爲TCP層可能需要稍後重發數據)之前,發送方必須等待接收方的確認。

一個更有趣的運動將改變其默認的緩衝區大小爲您的系統(查詢它找出那是什麼)都下降到1K的方式,查看每個緩衝區的大小如何影響你的吞吐量。

+0

是的,它幾乎肯定涉及到acks - 但現代硬件上的0.2秒是一個地質年代。正如你所說,我或許可以證明明天需要一些時間來擺弄緩衝區大小。這很有趣。 – JustJeff

+0

@JustJeff,請張貼你的發現。我有興趣瞭解這種行爲。 – Raam

+0

+1 1K幾乎不值得在這樣的網絡上發送。我確信,網絡堆棧至少要等待它是否能夠組裝1.5K以太網MTU。有些系統可能MTU較大 - 有'Jumbo'9K幀。 –

相關問題