深深潜入冲突崩溃

你好!我的名字是Tomasz Mozolewski,我是我们竞争团队的高级软件工程师。我的团队负责冠军掌握和排名的项目。我在这里谈论一个引发了大量讨论的事件联盟技术,并恰好是所有时间所要求的技术博客主题之一 - 冲突。

我一直在发生冲突,这是在开发的3年里,我从幕后见证了这一切。发射的兴奋,崩溃期间的恐慌,以及最终建立信心 - 我们在我们的球员都感到非常强烈地感受到这一切。

在本文中,我将概述导致我们取消冲突的技术过载障碍。我希望我能够回答来自玩家和同胞的一些长期问题 - 究竟是什么发生了?为什么?

对于那些不熟悉游戏模式的人来说,我将从对那些不熟悉游戏模式的人开始的解释,然后带您完成事件和原因的时间表,并描述我们最终解决的终极解决方案,以便最终成功地对玩家进行冲突。

什么是冲突?

冲突联盟承担了可访问的锦标赛模式,使玩家的团队成为竞争奖品的球队。虽然它意味着与LCS这样的专业电子电脑相似,但冲突是一种凝聚的体验,旨在更简单的设置所有不管技能水平如何排名。而不是花几个月来通过支架,整个冲突锦标赛在一个周末举行一个周末,游戏数量有限。亚博论坛为了确保经验感觉尽可能像Pro游戏,我们保持着许多相同的系统 - 括号,侦察,起草和(当然)闪亮的奖励。

有一些特别的竞争性游戏 - 练习练习5,侦查敌人,选择选秀和禁令,在大型游戏之前感受到压力,并让它与奖杯一起回报。亚博论坛冲突是我们团队从一开始的优先事项,因为我们知道玩家会喜欢从他们家中欣赏锦标赛的兴奋。

现在需要几次迭代才能在稳定的,可玩的状态下发生冲突。让我们来看看它是如何下来的。

大崩溃

到目前为止,大多数人都在联盟社区熟悉不幸的崩溃,这些崩溃使第一个大型冲突周末感到困扰。那是什么造成的?现在,我们对当前的冲突状态充满信心,我期待着对锦标赛模式系统可以是多么洞察。

首先要注意的是,我们希望尽快推出冲突的初始迭代 - 我们的目标原本于6个月内。这意味着采取捷径。优先级工作负载对于任何类型的工程都是标准的标准,但我们必须产生大量技术债务的捷径。因为我们在旧单的整形系统中工作,所以需要保持冲突的大部分工作是手动。我们的初始计划是为了确保我们尽早收集来自玩家的反馈,因为我们认为一旦我们确认我们正朝着正确的方向,我们就可以汇总更多的开发资源和时间进入完善和抛光它。

事件时间表

我们2017年9月在越南的第一个测试版真的很好。我们很激动,看看玩家的玩家有多少钱,我们发现了一些小型修复和调整,以提高经验。在这些改进之后,我们决定在2017年12月在欧洲推出。此发布不太成功。欧盟西方几乎遇到了容量问题,这是我们的第一个可扩展性问题的迹象。

我们决定在较小的地区进行受控测试,并将我们从中学到的东西应用于我们的更大区域。这使我们成为我们的第一组过载修复。

第一个修复

我们对切向系统进行了小调整,但潜在的过载问题仍然是一个一致的问题,让我们在晚上保持清醒。当锦标赛开始时,我们中的一些人仍然无法睡觉,并找到自己检查以确保一切都很好。

为了解决过载,我们开始使用一款琐碎的解决方案 - 限制游戏开始达到可持续利率。

We determined safe rates for each shard’s Champ Select service via load testing, extending scouting periods until a match could start, and were confident enough to run another beta in May 2018. With this beta, we saw that this solution worked great for game launches, but having all the games running at once caused everything from high latency to games just shutting down mid-match.

我们从一个瓶颈移动到下一个瓶颈。我们认为限制了可能扮演冲突的玩家数量,这将是一个简单的修复中等锦标赛,但我们迅速抛弃了这一点。这么多玩家保留时间播放冲突并为它做好准备 - 不适合解决一个解决方案,这意味着一些球员会错过。

在2018年5月,由于我们在亚洲看到的所有超载问题,我们不得不提出术语,即没有快速修复,我们必须重新设计从头上的所有冲突。由于游戏服务器过载问题,我们不得不取消欧洲和美洲的冲突。

我们绝对毁坏

经过几天的挖掘该冲突周末的事件,我们发现了崩溃的主要来源 - 所有游戏都在开始发生的同时会过载像冠军选择这样的系统。我们已经完成了有限的负载测试,但要创建一个充分捕捉我们的球员基地的热情所需要的负载测试将需要构建我们最大的碎片的复制品 - 这是非常昂贵的 - 然后再次服用3个月才能正确开发测试。即便如此,我们也知道我们依靠关于不一定准确的玩家行为的假设。在工作的晚上和周末,推动一大吨修复和改进,我们不得不接受它。

当前设计中的冲突永远不会成功。

看到碰撞时的热情和兴奋 - 以及挫折,愤怒和粉碎时的失望 - 让我们为解决方案而工作的日夜。即使它意味着重做核心,我们也不想放弃冲突联盟系统。放弃不是一个选择。

冲突解决方案

经过短暂的休息后,我们完全重置了我们的思想,我们已经准备好解决充满想法的新鲜心灵的问题。

我们已经知道负载测试从两次和成本的角度来看都是太贵。它需要我们在每个锦标赛之前运行负载测试,以解释系统和播放器号的所有更改。我们需要使用任何更改自动计算的东西。

初步步骤

最终,我们需要有2个主要资源来保护 - 游戏开始和游戏服务器。我们决定首先减轻游戏的数量,通过添加更多对同时发生的混淆来开始。然后,我们可以追踪一次开始发生的游戏数量,以确保这些数字在安全范围内停留。为此,我们必须弄清楚最大的安全游戏数量,考虑到从游戏服务器的角度来看发生冲突匹配(及其CPU要求)的生命周期。

缓解游戏开始

首先,我们建立了一个系统,通过将播放器群体分成较小的组,将更多的系统提供更多对游戏数量的控制。我们分布在更长的时间内从30分钟间隔锁定的时间开始,并且在找到具有类似评级的团队的团队时,立即将玩家放入括号,这进一步分布式可能的同时游戏开始。要成功实现这一目标,我们需要记住CPU使用率如何影响我们如何捕获游戏数据。

考虑延误

当Clash提交游戏开始时,启动Champ Select需要几秒钟,冠军选择本身平均持续7分钟大约7分钟。游戏然后前往游戏服务器,然后在大约10-15分钟后(早期游戏,这不需要太大电源),我们开始看到Teamfights,这是最多的CPU。我们需要优化此大型CPU使用量,只会在25分钟内发生在游戏中,因此对冲突系统的任何更改保护从过载保护基础架构需要大量才能传播和充分效果。这意味着我们提出的任何解决方案都需要考虑到这一延迟,以避免强调超出其能力的下游组件。

计算游戏的限制开始

在后端有几个系统,游戏开始通过,每个系统都有限制,冠军选择是最严格的。全部的共同线程联盟游戏模式是系统处理游戏的启动方式。这意味着我们可以使用我们通常的交通号码联盟亚博论坛游戏估计最大游戏的合理和安全数量。

为了确定安全限制,我们跟踪了每天每分钟开始多少游戏,并计算出游戏数量的第99百分位数。亚博论坛We used this 99th percentile value as a starting point for calculating an accurate number of typical game starts that could safely happen - but running Clash at peak would mean we’d only be able to start games as quickly as the peak, which was too slow. So we pushed it higher and higher until we settled on 1.5x the 99th percentile value of our typical peak. This could be safely sustained while maintaining a reasonable game start rate so players wouldn’t have to wait too long for games to start.

我们还添加了一些最小/最大夹具,以确保发生冲突游戏在小碎片中不会降低,或者在大碎片中升起太高。在大多数情况下,这种方法很好地工作。例如,在Covid-19爆发期间,我们已经看到了一个显着增加的球员人口,并增加了几个服务器,这些服务器已经很好地进行了很好的调整。

示例:1/15/20。峰值是一层开始时间。

计算游戏服务器CPU

游戏服务器的主要限制因素是CPU - 当CPU接近85%时,玩家将开始查看导致倾斜和挫折的延迟,错过的请求和其他不幸的问题。为确保高质量的游戏体验,我们需要在安全级别保持游戏服务器CPU负载。

为此,我们从游戏使用的平均CPU%划分目标CPU%的简单方法开始。我们根据硬件应用此号码到所有游戏服务器,并总结为获取我们可以在所有服务器上运行的冲突游戏总数。亚博论坛我们划分了平均游戏长度,voilà - 我们有初始安全游戏开始速率每分钟。

但是这种方式计算的能力是低估了真实能力,因为aram和tft游戏被计算好像他们需要相同数量的CPU作为召唤者裂缝的游戏(那里持有冲突),即使他们显着降低了电力。亚博论坛换句话说,我们可以其实安全地处理比此计算最初指出的游戏。亚博论坛这种额外的10-20%缓冲区意味着峰值的冲突游戏开始速率很大降低比我们实际处理,意思是玩家必须等待比轮到的要长得多。通过手动覆盖计算值,我们能够挤出所有可用容量。

这就是我们最初计算我们的能力。正如您从这个图形所看到的那样,每个游戏都使用此模型占用相同的CPU。后来,我们将看看与更现实的CPU使用情况看起来比较。

使用手动覆盖调整解决方案

我们创建了一款手动覆盖,以帮助我们调整数字,以确保我们有效地收集数据。到目前为止,我们将我们的游戏开始和CPU限制到位。使用手动覆盖,如果这些限制失败,我们可以使用我们必须手动设置限制的数据,这将允许锦标赛继续(尽管它需要大量的监控和调整)。

最初,我们使用这个功能非常有点。我们在提出了不同的游戏模式,同时提出了我们的极限计算,而是因为我们正在运行各个时间点而不是不断的计算,我们的估计保持短暂。通过在特定时间点检查容量,我们将在匹配生命周期的不同点捕获游戏,这对于不同的游戏模式需要不同的CPU。亚博论坛这导致我们创建自动数据解决方案,它将不断收集不同游戏模式和CPU使用情况,以更准确地捕获游戏服务器容量,并相应地动态调整游戏开始限制。

上面的例子:euw于3/15/20平红线是手动覆盖。

示例:3/14/20的NA。红线是自动计算的限制。

自动化数据集合

为帮助我们的估计,我们开始实时收集数据,这意味着我们正在动态预测能力。

第一个计算收集了数据的数据平均播放了多少游戏,如果每场比赛都是召唤者的裂缝赛。亚博论坛我们计算了这些比赛中的许多匹配可以同时发生而不进行我们的目标(70%的CPU使用率),并提出了一系列可以安全地开始每秒的匹配。

然后,我们考虑到我们第一次计算中的许多游戏的事实实际上是其他游戏模式,如TFT或ARAM,采用不同量的CPU亚博论坛。我们的自动化数据收集允许我们一分钟查询每次游戏服务器,以便询问每种类型的游戏运行有多少,以及总CPU使用率。亚博论坛通过从我们的目标70%CPU中减去,我们能够计算CPU剩余多少,并错开了更多的冲突游戏可以启动。亚博论坛

该公式最终是简单的 -目前的游戏数量正在运行亚博论坛除以平均游戏长度备用CPU容量除以CLASH游戏的CPU成本亚博论坛除以平均冲突游戏长度。经验结果表明,该度量在低CPU负载下具有较高的误差,但在高CPU负载下变得非常精确 - 这是让事情正确的关键时间。换句话说,我们越来越越来越危险,我们的数字就越舒服。

在我们的自动数据收集系统生效后,我们的模型看起来更像是这样的。

示例:3/15/20 kr

冲突成功推出!

我们终于做到了!现在我们有一种动态的方法来节气门的游戏开始被证明是非常有效的冲突。每当我们打开锦标赛门时,我仍然会在我的胃中获得蝴蝶 - 我发现自己检查日志和指标,以确保一切顺利运行。我的手机上有一个应用程序,当事情出错时,我会通知我,最近一直保持安静。

在过去的3年里反映出,我记得最多的东西 - 不仅仅是挫折或技术挑战,甚至是成功发射的最终庆祝活动 - 是把他们的心灵和灵魂(和时间!)的骚乱者数量为玩家带来冲突体验的问题。

让我们穿过深夜和错误消息?

玩家们。当然!他们在努力工作时,他们的喜悦,以及他们在整个开发中表达兴奋和挫折的评论会使我们推动。我们致力于为所有球员带来冲突经验,并且播放器基地的压倒性反应给了我们勇气继续战斗,直到我们得到对。

谢谢阅读!如果您有任何疑问或意见,请在下面发布。

发表于Tomasz Mozolewski