2011-11-17 78 views
1

我剛接觸網絡並詢問一個簡單的問題,這讓我很困惑。我希望有很多網絡知識的人可以提供幫助。位於一臺機器上或兩臺機器上的兩個進程的Java nio套接字通信

我始終將消息從進程A發送到進程B.如果A和B位於同一臺機器上,則平均端到端延遲爲〜6毫秒;如果A和B位於本地網絡中的兩臺機器上(由非常簡單的路由器連接),則平均端到端延遲爲〜176 ms。進程A和進程B使用java非阻塞套接字進行通信。每條消息都是10 KB,一條消息的消息副本將發送給不同的接收方。

另一個測試是改變消息副本的數量。在此測試中,有三個進程(A,B和C),其中進程A發送給進程B,進程B發送給進程C.如果發送一個消息副本,End2End延遲約爲10毫秒;如果連續發送兩個消息副本(20 KB),則end2end延遲爲147 ms;如果逐個發送四個消息副本(40 KB),則end2end延遲爲〜800 ms。 每1000毫秒發送一條新消息。

消息副本之間沒有延遲。當要發送的郵件副本數量增加時,爲什麼成本增長如此之快?這與我的網絡配置或我的編碼問題有關嗎?造成這種差異的原因是什麼?代碼

部分是在此鏈接:How to let selector that socketchannel key change in java nio

在開始的時候,我覺得它是緩慢的監守TCP緩衝區已滿,該過程必須等待當有新的空間來寫。在某些參考中,tcp的等待時間可能是200 ms。這對我的問題是否正確以及如何驗證?

+1

這將有助於,如果你可以發佈一些代碼。 – r0ast3d

+0

這聽起來像代碼是不完全正確的,所以它表現不如它可能。 –

+0

我的代碼發佈在http://stackoverflow.com/questions/8107828/how-to-let-selector-that-socketchannel-key-change-in-java-nio。它可以工作,但表現不好。 – susan

回答

0

它通過網絡的速度總是比給定的CPU慢。

1

本地計算機和整個網絡的時間對於該數據量看起來有點慢。當然,這也取決於對數據執行什麼處理,以及它是同步還是異步完成。例如,當一行中發送多個請求時,速度減慢可以通過異步處理數據來解釋。如果數據從請求中拉出並放入隊列中進行「處理」並立即發送響應,則可能相對較快。如果在返回之前處理隊列時需要阻塞後續請求,那可能會導致速度下降。但我只是在猜測這一點。

整個網絡的請求速度顯然取決於物理距離,跳數等,但數字似乎表明它總體上比應該慢。最可能的原因是代碼中的邏輯不正確......但沒有更多信息,不容易猜測原因(至少對我而言)。

出於好奇,我只是運行了一些快速測試,通過本地機器上的套接字發送消息,每個請求都是10K(響應數據包要小得多)。平均往返時間僅爲0.22毫秒。對於網絡上距離服務器兩跳的類似測試,平均每次往返1.9毫秒。這是使用TCP/IP。使用UDP到服務器兩跳,平均時間爲1.7毫秒。

所以你看到的速度看起來很慢(但是我的測試的硬件和網絡速度可能與你的設置沒有什麼共同之處......所以這些數字對你來說只是微乎其微)。

但是,您可以使用ping獲得更多的價值,以獲得您應該期待花費多長時間的基準。您可以指定ping的數據包大小(-s選項或可能取決於您使用的版本的-l)。Ping同樣的兩臺機器,我運行了另一個測試,證明時代是有道理的。

+0

我正在使用tcp套接字。 ping命令是一個IP級命令。所以來自ping的響應時間可能不代表tcp的響應時間。對? – susan

+0

@susan:時間應該具有代表性。 TCP/IP構建在UDP之上,增加了一些開銷,但不是很多。在我上面描述的測試中,我使用了TCP/IP。我現在剛剛使用UDP與服務器跑了兩跳,平均時間爲1.7ms(而TCP爲1.9ms)。所以他們非常相似。 –

+0

謝謝。我很困惑我的代碼有什麼問題。我使用nio java套接字並在Windows XP上運行。因此,一臺機器和兩臺機器上兩個進程之間的巨大差異非常奇怪,可能的原因是什麼? – susan

相關問題