我无法理解是什么服务器资源导致我的 Java 游戏服务器出现延迟。在我的游戏服务器的最后一个补丁中,我更新了我的 EC2 lamp 服务器Apache2.2、php5.3、mysql5.5到Apache2.4、php7.0、mysql5.6。我还更新了我的游戏本身,包括更多在每个游戏循环中循环的怪物实例 - 除其他外。
正如您在图像中看到的那样,在最后一个屏幕截图中,我的 Java 进程的 CPU 使用率稳定在 80% 左右,但平均负载却达到了 1.20。今天早上我什至看到它高达 2.7。 CPU 积分会影响我的服务器的实际 CPU 利用率,因此当我的积分余额减少时,百分比会上升,这是有道理的,但为什么在 80% 时我的服务器会滞后?
在我的 Amazon EC2 指标中,我看到 cpu 为 10%(这让我更加困惑):
当我启动我的服务器时,我的大型多人在线角色扮演游戏根本没有滞后。然后,一旦我的CPU积分耗尽,它就开始滞后。这让我感觉它是基于 cpu 的,但是当我看到 10% 和 80% 时我不明白为什么。任何帮助将不胜感激。我使用的是 T2.micro 实例,因此它有 1 个 vCPU。如果我升级到下一个实例,它的价格几乎翻倍,并保持相同的 vCPU 1,但具有更多积分。
长话短说,我想完全了解我正在发生的事情,因为 80% 的数字让我感到困惑。我不只是想砸钱来解决这个问题。
答案1
您注意到 ? 的值很大吗st
?这些是“被盗”的 CPU 周期——您无法使用的周期,因为您几乎或完全耗尽了您的 CPU 积分余额。
10% 的使用率是某个时间窗口(可能是 5 分钟)内的平均使用率。如果您观察 的输出top
,您应该会看到随着时间的推移,100% 减去被盗再减去闲置大约为 10%。
此时您基本上没有可用的 CPU 空间。在这些条件下,时间关键型工作负载预计会表现出不一致的响应能力。
您的工作负载对于 t2.micro 来说太大了。如果不是这种情况,您将始终拥有多余的 CPU 积分……本质上,根据定义。除非您可以采取一些措施来减少工作量或提高代码效率,否则当前的症状表明需要更大的实例类。
答案2
当您的 CPU 信用余额为空时,主机(管理程序、底层硬件)不会为您的虚拟 ec2 提供任何处理器时间(除非非常小)。这个非常小的量足以用于 ssh,但不足以运行一个名为 java 的饥饿怪物。因此,实例将会滞后,只是因为它休眠了一定的时间,而现实世界(包括玩家)却没有。
唯一的解决方案是增加 CPU 平衡:要么增加实例大小,要么以您喜欢的任何方式减少负载。实例将无法工作出色地当信用用完时,期间。