每当我打开一个套接字通道。如果客户端接受,则在内部创建1个文件描述符,这样我就可以在Linux中创建最多1024个客户端 但我想在不增加Linux中的文件描述符限制的情况下创建更多客户端 (ulimit -n 20000) 那么如何在Java中创建更多套接字?
答案 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()不会这样做,因为它是内置命令)
答案 4 :(得分:1)
我们最近提升了我们的ulimit,因为我们的java进程抛出了很多“打开太多文件”的异常。
现在为65536,我们没有任何问题。
答案 5 :(得分:0)
如果你真的在考虑应对大量的连接,那么实现可扩展的麻烦方法就是实现一个轻量级数据服务器进程,除了接受和转发数据到父进程之外没有任何责任。
这样,当每个数据服务器饱和时,您只需生成一个新实例,为自己提供另外1024个连接。如果需要,你甚至可以将它们存在于单独的机器上。