2009-04-29 48 views
1

每當我打開套接字通道。如果客戶端接受,則在內部創建1個文件描述符,因此我可以在Linux中創建最多1024個客戶端。
但我想沒有Linux的 增加文件描述符限制,以創造更多的客戶(的ulimit -n 20000) 所以,我怎麼能在Java中創建更多的套接字?如何在不增加文件限制的情況下在Java中打開20000個客戶端?

+0

您確定這些文件是必要的嗎?它們包含什麼? – 2009-04-29 11:09:31

+1

@Adam:我認爲他的意思是「文件描述符」,一個打開的套接字將佔用一個fd,儘管沒有涉及物理文件。 – unwind 2009-04-29 11:16:53

+0

@unwind:哦,是的。感謝那! :) – 2009-04-29 11:21:52

回答

2

如果您的會話限制爲1024個文件描述符,那麼您不能使用比單個JVM更多的文件描述符。

但由於是的ulimit每個進程的限制,你也許可以避過它通過啓動更多JVM(即獲得2048個連接開始使用每1024 2級的JVM)。

2

如果您使用的是UDP,您可以在一個本地套接字上自行復用嗎?您將能夠通過其源地址和端口分隔傳入的數據包。

如果它是TCP你的運氣了,和關閉每個插槽會使事情變得更糟後TIME_WAIT時期。

0

如果你真的在考慮應對大量的連接,那麼可擴展的方法就是實現一個輕量級的dataserver進程,除了接受和轉發數據到父進程之外,它沒有任何責任。

爲每個數據服務器被飽和您只需生成一個新的實例來給自己另一個1024個連接的方式。如果需要,你甚至可以讓它們存在於單獨的機器上。

2

爲什麼不能增加ulimit?這似乎是一個人爲的限制。 java代碼(afaik)沒有辦法讓你訪問系統來重置ulimit - 它需要在進程啓動之前設置 - 在啓動腳本或類似的東西中。

JBoss的啓動腳本一個[執行「的ulimit -n $ MAX_FD」他們啓動JBoss之前...

萊恩

2

極限RLIMIT_NOFILE由手術系統執行,限制了最高FD的進程可以創建。一個fd用於打開的每個文件,管道和套接字。

有硬性和軟性限制。任何進程(如shell或jvm)都可以更改軟值,但只有特權進程(如root用戶運行的shell)才能更改硬值。

a)如果您不允許更改限制在機器上,找人是。 b)如果由於某種原因不能打擾ulimit,我想你可以使用JNA調用底層系統調用:man setrlimit(2)。 (.exec()不會做,因爲它是一個內置的命令)

參見Working With Ulimit

1

我們最近調升我們的ulimit,因爲我們的java程序被扔大量的「打開的文件太多」的例外。

現在是65536,我們沒有任何問題。

相關問題