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