2011-05-26 56 views
6

我目前正在使用模擬大量用戶的自動測試客戶端測試服務器。服務器和客戶端都是用Java編寫的。客戶端爲每個用戶打開一個tcp/ip連接。服務器和客戶端都在Ubuntu linux上運行,客戶端在11.04上運行,服務器在10.04上運行。運行到java.net.bindexception中的問題無法分配請求的地址

測試進行得很順利,直到27000個同時打開的連接,之後我決定跳到36000(服務器和客戶端資源並不都是27000用完的,所以我決定做一個稍微大一點的跳轉)。 當我試圖運行測試36K我得到了在客戶端以下異常:

  • java.net.BindException:不能分配請求的地址

據我所知,在36k我應該仍然有空閒的端口,因爲其他機器上運行的其他端口並且tcp限制在2^16這是65536的端口號。現在,因爲它是Linux,我還設置用戶的打開文件數爲100k ulimit -n 100000. 但我仍然得到相同的異常。

我想知道還有什麼可能是所提到的異常的可能原因,或者在某些其他方式的Linux限制傳出連接的數量?

由於提前,

海倫芬

回答

5

默認情況下,Linux的選秀權從動態範圍32768..61000分配的端口。其他可用於靜態分配,如果你綁定到一個特定的端口號。如果您希望有更多的端口可用於動態分配,則範圍可以更改,但請注意不要包含用於您需要的特定服務的端口(例如X11爲6000)。您也不應允許端口< 1024被動態分配,因爲它們有特權。要檢查或更改範圍:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
32768 61000 

# echo "16384 65535" > /proc/sys/net/ipv4/ip_local_port_range 
+0

感謝mark4o的解釋和解決方案,你是現貨。 – Zapkhiel 2011-05-27 11:15:44

相關問題