如何在不增加文件限制的情况下在Java中打开20000个客户端?

时间:2009-04-29 10:59:12

标签: java linux nio

每当我打开一个套接字通道。如果客户端接受,则在内部创建1个文件描述符,这样我就可以在Linux中创建最多1024个客户端 但我想在不增加Linux中的文件描述符限制的情况下创建更多客户端 (ulimit -n 20000) 那么如何在Java中创建更多套接字?

6 个答案:

答案 0 :(得分:2)

如果您的会话限制为1024个文件描述符,则不能使用比单个JVM更多的文件描述符。

但是由于ulimit是一个每个进程的限制,你可以通过启动更多的JVM来解决它(即获得2048个连接,每个使用1024启动两个JVM)。

答案 1 :(得分:2)

如果您使用UDP,您可以在自己的单个本地套接字上复用吗?您将能够按源地址和端口分隔传入的数据包。

如果是TCP,那你运气不好,关闭每个套接字后的TIME_WAIT期间会让事情变得更糟。

答案 2 :(得分:2)

为什么你不能增加ulimit?这似乎是一个人为的限制。 java代码(afaik)无法允许您访问系统以重置ulimit - 它需要在进程启动之前设置 - 在启动脚本或类似的东西中。

JBoss启动脚本在启动Jboss之前执行'ulimit -n $ MAX_FD'...

莱恩

答案 3 :(得分:2)

限制RLIMIT_NOFILE由操作系统强制执行,并限制进程可以创建的最高fd。一个fd用于打开的每个文件,管道和套接字。

有硬性和软性限制。允许任何进程(如shell或jvm)更改软值,但只有特权进程(如root用户运行的shell)才能更改硬值。

a)如果您不允许更改机器的限制,请找一个人。

b)如果由于某种原因你不能打扰输入ulimit,我猜你可以使用JNA调用底层系统调用:man setrlimit(2)。 (.exec()不会这样做,因为它是内置命令)

另见Working With Ulimit

答案 4 :(得分:1)

我们最近提升了我们的ulimit,因为我们的java进程抛出了很多“打开太多文件”的异常。

现在为65536,我们没有任何问题。

答案 5 :(得分:0)

如果你真的在考虑应对大量的连接,那么实现可扩展的麻烦方法就是实现一个轻量级数据服务器进程,除了接受和转发数据到父进程之外没有任何责任。

这样,当每个数据服务器饱和时,您只需生成一个新实例,为自己提供另外1024个连接。如果需要,你甚至可以将它们存在于单独的机器上。