![寻找高使用率服务器上的性能降低问题](https://linux22.com/image/691007/%E5%AF%BB%E6%89%BE%E9%AB%98%E4%BD%BF%E7%94%A8%E7%8E%87%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84%E6%80%A7%E8%83%BD%E9%99%8D%E4%BD%8E%E9%97%AE%E9%A2%98.png)
我通过 Google Compute Engine 托管了一台服务器,用于各种目的,其中最主要的是 Minecraft 服务器,它接收大量流量和使用量。我们说的是相当稳定的 CPU 使用率,为 150%,每秒 50 次读取/10 次写入磁盘,每秒 600 次下载/1700 次上传网络数据包,因此,使用量相当大。
我遇到的问题是,尽管服务器完全有能力处理如此多的使用量,但仍然存在延迟和/或处理问题。在很多情况下,一个原本只需十分之一秒就能完成的过程,却突然需要 40 秒甚至更长时间。
以下是我们已经考虑过的可能出现的问题以及已经实施的解决方案:
- CPU使用率
- 我们始终使用 100-250% 的 CPU,配备 4 个 vCPU(因此我们不应该有任何形式的性能限制)。
- 磁盘输入输出
- 我们的最大读取速度为每秒 80 次,写入速度为每秒 30 次,但使用的 SSD 的持续随机 IOPS 限制为 1.5k,所以这也不成问题。
- 我们的最大读取速度为每秒 1.6 MB,写入速度为每秒 0.75 MB,但使用的 SSD 的持续吞吐量限制为 24 MB/s。
- 网络
- 我们每秒最多接收 600 个数据包(平均 400 个),发送 1700 个数据包(平均 800 个)。我不确定如何改进这一点,但当网络提供商是 Google 时,我看不出这会成为问题。
- 我们的最大接收速度为每秒 28 KB,发送速度为每秒 280 KB。我们的网络速度测试表明我们能够处理该值的数千倍。
- 这最不可能与此相关,因为遇到的大多数问题都涉及服务器端问题。
- 我们无法通过分割用户连接来实现任何形式的负载平衡,因为它们都必须连接回托管 Minecraft 世界的一台服务器。
- 内存
- 我们有 5 GB 的 RAM 专门用于有问题的进程。这让我怀疑它是否与此有关,因为我们很少使用超过一半的 RAM。
- Java
- 我们的 Minecraft 服务器 jar 是 Minecraft,是用 Java 编写的。我们使用以下 Java 版本:
java version "1.7.0_111" OpenJDK Runtime Environment (IcedTea 2.6.7) (7u111-2.6.7-1~deb8u1) OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)
- 我们使用以下参数来执行 jar:
-server -Xmx5G -Xms5G -Xmn2500M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=4 -XX:+AggressiveOpts
- 我们已经考虑过 Java(特别是 Minecraft)的内存管理能力较差的可能性,但不知道如何解决这个问题,或者根本不知道该如何解决。
- 我们的 Minecraft 服务器 jar 是 Minecraft,是用 Java 编写的。我们使用以下 Java 版本:
如您所见,我们已采取各种措施来减少延迟和流程限制,但我们实在是束手无策。我们是否错过了其他限制流程的方式,或者这是我们托管的软件固有的问题?
答案1
需要考虑的几件事:
a) GCE VM 具有网络出口吞吐量上限,如前所述这里。PD 写入 I/O 和网络流量计入此上限。对于具有 4 个核心的 VM,上限为 8 Gbps。
b) 记录 GCE 磁盘的最大持续 IOPS在本文中。使用本地 SSD 可能会提高性能,但这些磁盘上的信息并不持久。换句话说,本地 SSD 仍然存在直到您停止或删除虚拟机为止。
C)Stackdriver可以帮助您监控项目中的资源并消除瓶颈。