Amazon GameLift
开发人员指南 (版本 )
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

调试队组问题

本主题提供与队组相关问题的指南。对于其他故障排除,您可以远程访问队组实例。请参阅 远程访问队组实例

队组创建问题

队组创建的工作原理

创建新队组时,Amazon GameLift 服务执行一系列任务来根据队组的配置准备单个实例。随着队组创建的每个阶段的完成,发出一系列队组以及队组当前状态的事件。您可以使用 Amazon GameLift 控制台跟踪所有事件,包括用于队组创建的事件(请参阅 Fleet (队组) 详细信息页面上的 Events (事件) 选项卡。

队组创建期间的问题将导致队组状态变为错误状态,包含有意义的错误消息。队组创建失败所在的阶段也可以是一个很好的指标。队组创建阶段有:

  • 新建 – 创建队组记录。为初始实例分配资源。

  • 下载 – 将游戏生成包文件下载到实例并提取。

  • 验证 – 验证下载的游戏生成包文件。

  • 生成 – 使用安装脚本(如果可用)将游戏服务器生成包安装到实例上。

  • 激活 – 根据队组运行时配置,启动服务器进程。必须至少有一个进程与 Amazon GameLift 通信以报告它准备好托管游戏会话。

只要一个服务器进程通知 Amazon GameLift 其已准备好,队组状态就会转至活动

常见问题

下载和验证

在此阶段,如果提取生成包文件存在问题,安装脚本将不会运行,或者如果运行时配置中指定的可执行文件未包含在生成包文件中,队组创建可能失败。Amazon GameLift 提供与每个问题相关的日志。

如果日志未显示问题,则可能问题是由内部服务错误造成的。在这种情况下,请再次尝试创建队组。如果问题仍然存在,请考虑重新上传游戏生成包(如果文件已损坏)。您还可以联系 Amazon GameLift 支持或在论坛上发布问题。

构建

导致生成阶段故障的问题几乎肯定是由于游戏生成包文件和/或安装脚本的问题。验证上传到 Amazon GameLift 时,游戏生成包文件是否可以安装在运行适当操作系统的机器上。确保使用干净的操作系统安装,而不是现有的开发环境。

激活

激活阶段出现的最常见队组创建问题。此阶段测试大量元素,包括游戏服务器的可行性、运行时配置设置以及游戏服务器使用服务器开发工具包与 Amazon GameLift 服务进行交互的能力。队组激活过程中遇到的常见问题包括:

服务器进程无法启动。

首先检查您是否在队组的运行时配置中正确设置了启动路径和可选启动参数。您可以使用 Amazon GameLift 控制台(请参阅 Fleet (队组) 详细信息页面、Capacity allocation (容量分配) 选项卡)或者调用 AWS CLI 命令 describe-runtime-configuration 来查看队组的当前运行时配置。如果运行时配置正确,请检查游戏生成包文件和/或安装脚本是否存在问题。

服务器进程启动但机群无法激活。

如果服务器进程启动并成功运行,但队组不变为活动状态,可能的原因是服务器进程无法通知 Amazon GameLift 已准备好托管游戏会话。检查您的游戏服务器是否正确调用了服务器 API 操作 ProcessReady() (请参阅 准备服务器进程)。

VPC 对等连接请求失败。

对于使用 VPC 对等连接创建的队组(请参阅创建具有 VPC 对等连接的新队组),VPC 对等连接在此激活阶段中完成。如果 VPC 对等连接由于任何原因失败,新队组将无法转入激活状态。通过调用 describe-vpc-peering-connections,您可以跟踪对等请求的成功或失败。请务必检查存在有效的 VPC 对等连接授权 (describe-vpc-peering-authorizations,因为授权仅在 24 小时内有效。

服务器进程问题

服务器进程启动但快速失败或者报告运行状况不佳。

不同于游戏生成包中的问题,同时在实例上尝试运行了过多服务器进程时可能会发生这种情况。并发进程的最佳数目取决于实例类型和您的游戏服务器的资源要求。请尝试减少并发进程数量,该值在队组的运行时配置中设置,以查看性能是否有所改进。您可以使用 Amazon GameLift 控制台(编辑队组的容量分配设置)或者调用 AWS CLI 命令 update-runtime-configuration 来更改队组的运行时配置。

队组删除问题

由于最大实例计数而无法终止队组。

错误消息指示正在删除的队组仍有活动的实例,这种情况是不允许的。您必须首先将队组缩减到零个活动实例。要执行此操作,可以手动将队组所需的实例计数设置为“0”,然后等待缩减生效。请务必关闭自动扩展,否则会抵消手动设置。

VPC 操作未获授权。

此问题仅适用于您已专门为其创建 VPC 对等连接的队组(请参阅Amazon GameLift 的 VPC 对等连接)。出现这种场景是因为删除队组的过程还包括删除队组的 VPC 以及所有 VPC 对等连接。您必须通过调用 GameLift 服务 API CreateVpcPeeringAuthorization() 或使用 AWS CLI 命令 create-vpc-peering-authorization,首先获取授权。获得授权之后,您就可以删除该队组。

Realtime Servers 队组问题

僵尸游戏会话:这些会话启动和运行游戏,但永不结束。

您可能会观察到此问题在以下任意场景中出现:

  • 队组的 Realtime Server 未选取脚本更新

  • 队组快速达到最大容量,但在玩家活动(例如新游戏会话请求)减少时不缩减。

这几乎可以肯定是无法在您的 Realtime 脚本中成功调用 processEnding 的结果。虽然队组进入活动状态并且启动了游戏会话,但没有方法可以停止它们。因此,运行游戏会话的 Realtime Server 永远不会释放资源来启动新会话,而新游戏会话只能在新 Realtime Server 有资源时启动。此外,对 Realtime 脚本的更新不影响已经运行的游戏会话,仅影响新的会话。

为了防止出现这种情况,脚本需要提供一种机制来触发 processEnding 调用。如 Realtime Servers 脚本示例中所示,一种方法是编写空闲会话超时,如果在特定时间长度内没有玩家连接,则脚本将结束当前游戏会话。

但是,如果您出现了这种情况,还有多种解决方法可以让 Realtime Server 摆脱卡顿的状况。这种技巧是触发 Realtime Server 进程(或基础队组实例)重新启动。在这种情况下,GameLift 会自动关闭您的游戏会话。一旦释放 Realtime Server,它们就可以使用 Realtime 脚本的最新版本来启动新游戏会话。

根据问题的普遍性,有几种方法可以做到这一点:

  • 缩减整个队组。此方法执行起来最简单,但具有扩散效应。将队组缩减为零个实例,等待队组完全缩减,然后将其扩展回。这将清除所有现有游戏会话,并让您使用最近更新的 Realtime 脚本来从头开始。

  • 远程访问该实例并重新启动该过程。如果您只有几个进程需要修复,这是一个很好的选项。如果您已登录到该实例,例如用于跟踪日志或调试,则这可能是最快的方法。请参阅 远程访问队组实例

如果您选择不在 Realtime 脚本中包含调用 processEnding 的方法,则可能会出现一些棘手的情况,即使队组进入活动状态并且游戏会话已启动。首先,正在运行的游戏会话不结束。因此,游戏会话永远不会释放正在运行的服务器进程来启动新游戏会话。其次,Realtime Server 不会选取任何脚本更新。