2013-05-14 109 views
0

我有一個連接到NFS服務器並寫入數據的客戶端。這是一個多進程應用程序,它可以創建與進程一樣多的TCP連接。問題是,如果我嘗試一個進程,套接字塊寫入很少(即poll()不會暫停)。如果我將進程數量增加到8個或更多,我發現自己被大約30%的時間在每個套接字上被poll()阻塞。使用具有獨立發送/接收緩衝區的多個TCP流的目的不是這樣,所以它們不應該像這樣阻塞?爲什麼有多個流互相干擾?鏈接遠未飽和(用iperf測試)。多個TCP流互相干擾

我的想法是,NFS服務器將爲每個TCP連接創建一個套接字,並且它們將擁有自己的接收緩衝區。我知道我爲每個進程分別創建了TCP套接字,所以他們應該有自己的發送緩衝區。如果我沒有使鏈接飽和,爲什麼套接字被阻塞?

+0

您是否設置了輪詢? http://linux.die.net/man/2/poll – Magn3s1um 2013-05-14 16:50:41

+0

是的,我正在調用pollout來查看poll()是否會阻塞,記錄結果,然後用實際的超時值調用poll。這樣做會讓我百分之三十的時間輪詢阻塞,並且性能不是我所期望的。 – wlformyd 2013-05-14 17:00:46

+0

難道不是嗎,NFS服務器只是爲了滿足您的所有應用程序的請求而不願意? – alk 2013-05-14 17:11:47

回答

2

您假定網絡具有無限帶寬,並且服務器具有無限容量來處理您發送的請求。在任何情況下,它都不是。線性增加TCP連接的數量不會線性增加性能。只有一個網絡;只有一臺服務器;它只有很多CPU;它只有這麼多的磁盤。網絡遲早會被填滿,或者服務器會陷入停滯狀態,這會反映回你的寫作檔。