我为 Android 创建了一个大型多人在线游戏,名为 The Infinite Black:s://market.android/details?id=theinfiniteblack.client
在我的天真中,我预计每月大约有 1000 名玩家的适度增长率,并且需要管理大约 20 个实时 TCP / IP 客户端。
该游戏在一周内拥有超过 40,000 个新用户,并且平均一次获得约 300 个实时连接,并且呈指数级增长。
服务器架构包括每个连接 2 个线程(阻塞读 / 写),一个 ServerSocket 线程产生新的客户端,一个控制器线程轮询每个客户端的新操作,将其应用到游戏世界,然后刷新数据回来时完成。
服务器是用 Java 构建的,我不是很精通,特别是在这样的高压力情况下。当涉及到内存和线程管理时,C # 真的宠坏了我。
我刚刚订购了两个非常强大的系统作为专用游戏服务器运行,并希望最大限度地利用资源。许多关于 Java 资源配置的信息已被证明是误导性的,不正确的或过时的。
我目前使用-Xss512k 作为我的启动参数,并理解这决定了每个线程的堆栈大小分配,但我不完全理解它可能需要的所有内容。有什么工具或方法可以告诉我,如果我超过了标记,可以缩小它?我应该考虑其他命令行参数?
新服务器具有 16gb 的 RAM 和 i7-2600K Sandy Bridge 3.4 GHz 处理器:配置中有哪些选项可以尽可能多地利用这一点?我的目标是每个服务器一次 1,200 个在线客户端(2,400 个线程)。
我应该关注什么样的意外陷阱和问题?
我读过关于最大线程数的激烈冲突的故事:如果我试图推送 2,400 个活动线程,事情会崩溃吗?
Java 似乎不是为这种类型的任务而设计的。我应该考虑将服务器迁移到另一种语言吗?
我目前在 Eclipse 的调试模式下运行服务器,而它正在开发中(ugh..)
这是我的 Eclipse.ini 配置:
--launcher.XXMaxPermSize 256M
-Xms256m
-Xmx1024m
你还没有弄清楚你的怀疑来自哪里。
Plurk Comet:Handling 100,000+ Concurrent Connections with Netty (2009)1999 年,我部署了一个 Java Web 服务器,每小时处理 40,000 个黄页搜索查询(服务器有 400 MHz CPU),2004 年,我开发了一个 Java 应用程序,每个服务器处理 8000 个并发连接(在双 1.2 GHz Sparc 服务器上)有六个网关服务器和一个主服务器来控制它们并集中事件。
你的个人资料可能是不同的,但我可以说,Java 是支持高容量的 Web 服务器之前,C # 被释放。
我个人不会有超过 10,000 每个服务器的并发连接,但这只是一个经验法则可能不再成立。你可以在一个单一的 JVM 有 32,000 个线程。在 Linux 上它没有太多超越这一点。但是我会在一个单一的服务器上有多个网关 JVM,以尽量减少你的完整的 GC 时间 (减少完整的 GC 时间的最好方法是丢弃更少的垃圾,但这可能需要更多的努力)
新服务器具有 16gb 的 RAM 和 i7-2600K Sandy Bridge 3.4 GHz 处理器:配置中有哪些选项可以尽可能多地利用这一点?我的目标是每个服务器一次 1,200 个在线客户端(2,400 个线程)。
我无法想象为什么这将是一个问题。
我应该关注什么样的意外陷阱和问题?
如果你有 4 个网关 JVM,每个都有 300 个连接,这可以使用所有的内存,你甚至不需要指定-Xmx 设置。
Java 似乎不是为这种类型的任务而设计的。我应该考虑将服务器迁移到另一种语言吗?
你最好问问自己为什么相信这一点。你有一个问题应该很容易解决,或者一个可能没有根据的疑问。
这是我的 Eclipse.ini 配置:
如何配置 eclipse 没有禁止如何设置从 eclipse 运行的任何程序。
BufferedOutputStream 适用于大多数应用程序,并且可能适用于 JVM 中最多 1000 个连接。然而,Java 1.4(2002)添加了 NIO,这是一个更轻的重量,用于将您的系统扩展到 10,000 个连接及以上。
顺便说一句:我在 2003 年开发的服务器是基于 NIO 调度程序,但它相当复杂,除非你使用像 Netty 这样的标准库。
我不相信每个连接需要两个线程,但我不相信这会对你的情况产生影响,因为每个服务器没有足够的连接。
正如 glowcoder 建议你考虑使用 UDP 不太重要的广播信息?
在 Java 中,每个线程将在堆栈上占用与任何其他线程相同的内存量。这意味着您的主线程,假设它的保留大小为 32k(我认为这是默认的)将与您的通信线程相同的保留大小(如果您考虑的话,可能只需要 1k!)这就是 Java 提出 nio 的原因-因此您不需要每个连接一个线程。
让我们举一个 1g RAM 的例子。每个线程 32k,假设我们有一半的堆栈内存和一半的堆内存,我们最终有 512 个堆栈可用。这给了我们 16,384 个线程的空间。这也意味着我们的线程调度程序必须处理 16,384 个线程。这大大增加了其中一个线程挨饿的机会。现在,如果一个人挨饿,那么每个人都会挨饿。如果main
使用 nio,你有...两个线程。主要和通信。(实际上,你甚至可以在没有通信线程的情况下做到这一点...)。现在实际上你可能有更多的东西,因为你有一个游戏循环等等。但是仍然有 10 个线程比 16k 个线程更容易正确调度!
Nio 不一定是直观的学习,但它是值得的。
如果你不打算使用 nio,我会考虑的一件事是每个连接只有 1 个线程,而不是两个。你不需要第二个来写:你可以有一个队列的线程,并让它为所有客户端做所有的写入。
您不能按节点和线程数量来考虑负载。1)如果您的游戏扩展到数百万用户,则需要由注册表负载平衡的服务器群集
2) 每个节点必须是低延迟的,这意味着每个传入的玩家消息和世界更新计算 (1 个滴答) 必须在毫秒内完成。非常可行。每个节点不需要有怪物配置。
3)每秒调用此 30 次
= & gt;您可以在一个节点上同时拥有数千个玩家,并且可以通过区域分割将 10,000 扩展到数百万,这要归功于基础架构前面的注册表,可确保玩家连接到最佳的 ping 延迟游戏服务器。
使用此模式,每个节点在实时游戏中同时加载 10 000 名玩家,在基于回合的游戏中每个节点加载 + 300 000 名玩家。
瓶颈通常是 IO。使用 SSD 进行数据库存储。
Java 不是问题。2400 线程是一个问题。您可以用花费的循环时间解决问题,并且必须考虑在毫秒滴答循环下。
赫特
Nuggeta 管理员-100% Free high load multiplayer java game server
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(82条)