gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:50:06 24 4
gpt4 key购买 nike

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

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

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

谢谢!

最佳答案

对 NIO 的好处应该持保留态度。

在 HTTP 服务器中,大多数连接都是保持连接,它们大部分时间都是空闲的。为每个线程预先分配一个线程会浪费资源。

对于 MMORPG,情况大不相同。我猜连接一直忙于接收用户的指令并向用户发送最新的系统状态。大多数时间都需要一个线程来进行连接。

如果您使用 NIO,您将不得不不断地为连接重新分配线程。与简单的每连接固定线程解决方案相比,这可能是一个较差的解决方案。

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

但是,如果您的游戏确实非常“忙碌”,那么您最需要担心的是您的 CPU。不管 NIO 与否,在一台机器上处理数以千计的超活跃玩家真的很困难。

关于每个连接模型的 Java 线程与 NIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com