Xbox多人游戏服务器连接已阻止:Java大规模多人游戏服务器可扩展性

我为 Android 创建了一个大型多人在线游戏,名为 The Infinite Black:https://market.android.com/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

8

你还没有弄清楚你的怀疑来自哪里。

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 不太重要的广播信息?

4

在 Java 中,每个线程将在堆栈上占用与任何其他线程相同的内存量。这意味着您的主线程,假设它的保留大小为 32k(我认为这是默认的)将与您的通信线程相同的保留大小(如果您考虑的话,可能只需要 1k!)这就是 Java 提出 nio 的原因-因此您不需要每个连接一个线程。

让我们举一个 1g RAM 的例子。每个线程 32k,假设我们有一半的堆栈内存和一半的堆内存,我们最终有 512 个堆栈可用。这给了我们 16,384 个线程的空间。这也意味着我们的线程调度程序必须处理 16,384 个线程。这大大增加了其中一个线程挨饿的机会。现在,如果一个人挨饿,那么每个人都会挨饿。如果main

使用 nio,你有...两个线程。主要和通信。(实际上,你甚至可以在没有通信线程的情况下做到这一点...)。现在实际上你可能有更多的东西,因为你有一个游戏循环等等。但是仍然有 10 个线程比 16k 个线程更容易正确调度!

Nio 不一定是直观的学习,但它是值得的。

如果你不打算使用 nio,我会考虑的一件事是每个连接只有 1 个线程,而不是两个。你不需要第二个来写:你可以有一个队列的线程,并让它为所有客户端做所有的写入。

-3

您不能按节点和线程数量来考虑负载。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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(493)
Cpu的作用和功能:扫描二进制文件中的 CPU功能使用情况
上一篇
Warming:什么是预热缓存 (cache warming strategies)
下一篇

相关推荐

  • java脚手架搭建:如何使用Java脚手架来构建应用程序

    Java脚手架搭建的步骤:创建Maven项目:使用maven--webapp创建一个Maven项目,并在pom.xml中添加所需的依赖。…

    2023-06-08 07:09:20
    0 16 37
  • java api接口文档使用说明

    Java API接口文档是指用于Java编程的应用程序编程接口(API)的文档。它们包含有关Java类、接口、方法和属性的详细信息,以及如何使用它们来开发Java应用程序的指导。…

    2023-02-12 13:09:39
    0 27 22
  • java中间价都有哪些深入研究实施最佳实践

    示例示例Java中间件主要包括:企业应用服务器( Server):主要用于构建企业级应用,如、、JBoss等。…

    2023-06-30 04:42:00
    0 57 90
  • java反射性能的如何优化:优化Java反射性能的方法

    示例示例Java反射性能优化的技术有以下几种:使用静态变量或常量:在使用反射时,应该尽量使用静态变量或常量,而不是每次都使用字符串来指定反射的对象。…

    2023-01-22 03:09:39
    0 67 35
  • java在线题库:Java中如何使用多线程实现并发操作?

    Java在线题库是一种提供Java语言编程练习的网站,它可以帮助用户更好地理解和掌握Java编程语言。它提供了大量的Java编程练习题,用户可以通过完成这些练习来提高自己的Java编程技能。Java在线题库可以帮助用户更好地理解和掌握Java编程语言,因为它提供了大量的Java编程练习题,用户可以通过完成这些练习来提高自己的Java编程技能。此外,Java在线题库还可以帮助用户更好地了解Java编程语言的基本原理,以及如何使用它来解决实际问题。…

    2023-04-02 05:32:09
    0 28 87
  • java测试工程师面试题:Java 测试工程师如何准备面试?

    示例示例请描述你对Java测试的理解Java测试是一种用于验证和验证Java代码的过程,以确保代码正确地实现其设计目标。它包括单元测试,集成测试,功能测试,性能测试,回归测试等,以及其他类型的测试,以确保软件系统的正确性。你有什么测试工具经验我有使用JUnit,TestNG,和JMeter等测试工具的经验。我还有使用Mockito。Spring Boot Test。等框架的经验。…

    2023-08-18 06:40:05
    0 36 19
  • java培训机构哪个好:如何选择最好的Java培训机构?

    由于每个人的学习需求不同,因此不能给出一个明确的答案,但是可以提供一些建议,帮助您选择最适合您的java培训机构。先确定自己的学习目标,比如想学习java编程、web开发、android应用开发等,然后根据自己的学习目标,选择有相关课程的培训机构。…

    2023-04-17 12:29:01
    0 33 85
  • java商城系统shopxx:shopxx实现安全、便捷的网上购物体验

    ShopXX是一款基于Java的开源商城系统,用于构建具有购物车功能的在线商店。它是一个可扩展的、可自定义的、可定制的商城系统,可以帮助用户快速构建一个完整的在线商店。…

    2023-10-03 05:26:07
    0 25 98

发表评论

登录 后才能评论

评论列表(46条)