我在AWS虚拟机(ubuntu)上开发一个java服务器,用于在线安卓游戏。我做了一个测试,显示我最多~4080客户端可以连接到服务器。我得到了#34; SocketException:如果有更多客户想连接,打开的文件太多了#34;我检查了限制的数量:" ulimit -n"给我1024.将它改为4096没有改变。
为任何已接受的套接字创建一个新线程,它们当前没有任何操作,并且在我停止服务器之前一直处于活动状态。
在建立所有4080个连接之后,我观察到使用了大约1gb的ram。我总共有2GB。
我们如何处理更多tcp连接?我的多线程方法是否有用,或者我应该为成千上万的客户采用不同的方法?
答案 0 :(得分:0)
ulimit变量实际上不是系统范围的参数。它们按进程属性设置并由子进程嵌套。请确保从已经提升ulimit的进程运行java服务器。
答案 1 :(得分:0)
UX上的每个子进程都从其父进程继承所有打开的文件描述符。将孩子作为网络客户端产生是有点棘手的,因为你需要明确地关闭孩子中所有不必要的描述符(即,stdin,out和err为0,1,2。)
这也涉及开放套接字(来自旧的“一切都是文件”策略),所以如果你在套接字上有一个监听器并产生一个子,那么它已经打开了这个套接字。您可以复制此套接字,但需要关闭子级中的原始文件等。