每个连接的Java线程模型与NIO

非阻塞JavaNIO是否仍然比标准的每连接线程异步套接字慢

此外,如果要在每个连接中使用线程,您会创建新线程还是使用非常大的线程池

我正在用Java编写一个MMORPG服务器,如果有足够强大的硬件,它应该能够轻松地扩展10000个客户端,尽管客户端的最大数量是24000个(我认为对于每个连接的线程模型来说,这是不可能的,因为Java中有15000个线程限制)。
从一篇三年前的文章中,我听说使用每个连接一个线程的模式阻止IO仍然比NIO(即本文档)快25%http://www.mailinator.com/tymaPaulMultithreaded.pdf),但这一天是否仍能实现同样的目标?从那时起,Java发生了很大的变化,我听说在比较真实场景时,结果是有问题的,因为使用的虚拟机不是Sun Java。
此外,由于它是一个MMORPG服务器,有许多并发用户相互交互,因此使用同步和线程安全实践是否会降低性能,使服务于10000个客户端的单线程NIO选择器速度更快?(所有的工作不必通过选择器在线程上处理,它可以在工作线程上处理,就像MINA/Netty的工作方式一样)

谢谢

NIO的好处应该是有保留的

在HTTP服务器中,大多数连接都是保持活动的连接,它们大多数时间处于空闲状态。为每个线程预先分配一个线程将是一种资源浪费

对于MMORPG来说,情况非常不同。我猜连接总是忙于接收用户的指令并向用户发送最新的系统状态。连接大部分时间都需要线程

如果使用NIO,则必须不断地为连接重新分配线程。它可能是一个次于简单的固定螺纹每个连接解决方案的解决方案

默认线程堆栈大小相当大(1/4MB?),这是线程数量有限的主要原因。试着减少它,看看你的系统是否能支持更多

然而,如果你的游戏真的很“忙”,你最需要担心的是你的CPU。不管你是不是NIO,在一台机器上处理成千上万的超级活跃玩家真的很难

发表评论