本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
调试亚马逊 GameLift 舰队问题
本主题提供有关 Amazon 托 GameLift 管主机解决方案的机群配置问题的指导。对于其他故障排除,您可以在队组处于活动状态后远程访问队组实例。请参阅远程访问亚马逊 GameLift 舰队实例。
队组创建问题
创建队列后,Amazon GameLift 服务会启动一个工作流程,在舰队的每个位置部署一个新实例,并准备好运行您的游戏服务器。有关详细描述,请参见创建亚马逊 GameLift 舰队是如何运作的。舰队在达到活动状态之前无法托管游戏会话和玩家。本节讨论了阻止舰队进入活跃状态的最常见问题。
下载和验证
在此阶段,如果提取的构建文件存在问题、安装脚本无法运行,或者如果运行时配置中指定的可执行文件未包含在构建文件中,则队列创建可能会失败。亚马逊 GameLift 提供与每个问题相关的日志。
如果日志未显示问题,则可能问题是由内部服务错误造成的。在这种情况下,请再次尝试创建队组。如果问题仍然存在,请考虑重新上传游戏生成包(如果文件已损坏)。您也可以联系亚马逊 GameLift 支持人员或在论坛上发布问题。
构建
导致生成阶段故障的问题几乎肯定是由于游戏生成包文件和/或安装脚本的问题。验证上传到亚马逊 GameLift的游戏编译文件是否可以安装在运行相应操作系统的计算机上。确保使用干净的操作系统安装,而不是现有的开发环境。
激活
激活阶段出现的最常见队组创建问题。在此阶段,正在测试许多元素,包括游戏服务器的可行性、运行时配置设置以及游戏服务器使用 Server SDK 与 Amazon GameLift 服务交互的能力。队组激活过程中遇到的常见问题包括:
- 服务器进程无法启动。
-
首先检查您是否在队组的运行时配置中正确设置了启动路径和可选启动参数。您可以使用舰队详细信息页面,详细信息) 部分或调用Amazon CLI命令来查看舰队的当前运行时配置describe-runtime-configuration。如果运行时配置正确,请检查游戏生成包文件和/或安装脚本是否存在问题。
- 服务器进程启动但机群无法激活。
-
如果服务器进程成功启动并运行,但舰队未进入活动状态,则可能的原因是服务器进程未能通知亚马逊它 GameLift 已准备好托管游戏会话。检查您的游戏服务器是否正确调用了服务器 API 操作
ProcessReady()
(请参阅 初始化服务器进程)。 - VPC 对等连接请求失败。
-
对于使用 VPC 对等连接创建的队组(请参阅使用新队组设置 VPC 对等连接),VPC 对等连接在此激活阶段中完成。如果 VPC 对等连接由于任何原因失败,新队组将无法转入激活状态。您可以通过调用来跟踪对等请求的成功或失败describe-vpc-peering-connections。请务必检查是否存在有效的 VPC 对等授权(describe-vpc-peering-authorizations,因为授权仅在 24 小时内有效。
服务器进程问题
- 服务器进程启动但快速失败或者报告运行状况不佳。
-
不同于游戏生成包中的问题,同时在实例上尝试运行了过多服务器进程时可能会发生这种情况。并发进程的最佳数目取决于实例类型和您的游戏服务器的资源要求。请尝试减少并发进程数量,该值在队组的运行时配置中设置,以查看性能是否有所改进。您可以使用 Amazon GameLift 控制台(编辑队列的容量分配设置)或调用Amazon CLI命令来更改队列的运行时配置update-runtime-configuration。
队组删除问题
- 由于最大实例计数而无法终止队组。
-
错误消息指示正在删除的队组仍有活动的实例,这种情况是不允许的。您必须首先将队组缩减到零个活动实例。要执行此操作,可以手动将队组所需的实例计数设置为“0”,然后等待缩减生效。请务必关闭自动扩展,否则会抵消手动设置。
- VPC 操作未获授权。
-
此问题仅适用于您专门为其创建 VPC 对等连接的队列(参见亚马逊的 VPC 对等连接 GameLift。 之所以出现这种情况,是因为删除队列的过程还包括删除队列的 VPC 和任何 VPC 对等连接。 您必须首先通过调用亚马逊 GameLift 服务 API CreateVpcPeeringAuthorization() 或使用Amazon CLI 命令获得授权
create-vpc-peering-authorization
。获得授权之后,您就可以删除该队组。
实时服务器队列问题
- 僵尸游戏会话:这些会话启动和运行游戏,但永不结束。
-
您可能会观察到此问题在以下任意场景中出现:
-
舰队的实时服务器不会接收脚本更新。
-
队组快速达到最大容量,但在玩家活动(例如新游戏会话请求)减少时不缩减。
几乎可以肯定,这是未能成功调用您的实时脚本
processEnding
的结果。虽然队组进入活动状态并且启动了游戏会话,但没有方法可以停止它们。因此,运行游戏会话的实时服务器永远无法腾出来启动新的会话,新的游戏会话只有在新的实时服务器启动后才能启动。此外,实时脚本的更新不会影响已经运行的游戏会话,只会影响正在运行的游戏会话。为了防止出现这种情况,脚本需要提供一种机制来触发
processEnding
调用。如 实时服务器脚本示例中所示,一种方法是编写空闲会话超时,如果在特定时间长度内没有玩家连接,则脚本将结束当前游戏会话。但是,如果你确实陷入了这种情况,有一些变通办法可以让你的实时服务器摆脱困境。诀窍是触发实时服务器进程(或底层舰队实例)重新启动。在这种情况下, GameLift 会自动为您关闭游戏会话。释放实时服务器后,他们可以使用最新版本的实时脚本开始新的游戏会话。
根据问题的普遍性,有几种方法可以做到这一点:
-
缩减整个队组。此方法执行起来最简单,但具有扩散效应。将队组缩减为零个实例,等待队组完全缩减,然后将其扩展回。这将清除所有现有的游戏会话,让你从最新更新的实时脚本重新开始。
-
远程访问该实例并重新启动该过程。如果您只有几个进程需要修复,这是一个很好的选项。如果您已登录到该实例,例如用于跟踪日志或调试,则这可能是最快的方法。请参阅远程访问亚马逊 GameLift 舰队实例。
-
如果你选择不在实时脚本processEnding
中加入通话方式,那么即使舰队处于活动状态并且游戏会话已开始,也可能会出现一些棘手的情况。首先,正在运行的游戏会话不结束。因此,游戏会话永远不会释放正在运行的服务器进程来启动新游戏会话。其次,实时服务器不接收任何脚本更新。