通常,我们现场安装的基于 debian-stable 的应用程序在虚拟机中运行 - 通常在 VMware ESXi 中。在一般情况下,我们无法查看或影响他们的虚拟化环境,也无法访问例如 VMware vCenter 客户端或同等产品。我在这里专注于 VMware,因为这是迄今为止我们看到的最常见的。
我们想:
- 告诉客户的 VMware 管理员:您可以在例如您的 VMware ESX 环境中运行我们的应用程序,只要它满足性能标准 X、Y 和 Z。
- 能够确定标准 X、Y 和 Z 实际上是否连续满足(例如现在也是),即使在正在运行的系统上(我们不能停止我们的应用程序并运行基准测试,并且初始基准测试是不够的,因为性能虚拟环境随时间变化)。
- 有信心,如果满足标准 X、Y 和 Z,我们将有足够的虚拟硬件资源来运行我们的应用程序并具有令人满意的性能。
现在什么是 X、Y 和 Z?
我们一次又一次地看到,当出现性能问题时,问题不在于我们的应用程序,而在于虚拟化环境。例如,另一台虚拟机使用大量 CPU、内存或实际存储磁盘的 SAN 被我们的应用程序以外的其他东西大量使用。我们目前无法证明或反驳这一点。
从理论上讲,有时我们的应用程序也可能很慢...... ;-)
如何确定我们的性能问题的根本原因:虚拟环境还是我们的应用程序?
性能问题通常有 3 个区域 CPU、内存和磁盘 I/O。
中央处理器
例如,在 VMware 中,管理员可以指定预留和限制,以 MHz 表示,但例如,一台 ESX 主机上的 512MHz 与另一台 ESX 主机上的 512MHz 完全相同,可能在完全不同的 ESX 集群中?
以及如何衡量我们是否真的得到了这一点?当我们的应用程序运行时,我们可能会看到我们在 4 个 CPU 上的 CPU 利用率为 212%。这是因为我们的应用程序正在做很多事情,还是因为同一主机上的另一个 VM 正在运行 CPU 密集型任务并使用所有 CPU?
记忆(气球?)
如果我们要求例如 16GB 的 RAM,这通常是配置的,但由于膨胀,我们实际上只得到 4GB,而且令人惊讶的是,我们的应用程序性能很差。
可以向 VMware 工具询问当前的膨胀,但我们发现它经常是谎言(或者至少是不准确的)。我们已经看到操作系统认为总 RAM 为 16GB 的示例,所有进程的驻留内存 (RSS) 总和为 4GB RAM,但只有 2GB 可用 RAM,即使 VMware 工具告诉我们有 0 个气球: -(
此外,仅将 RSS 相加是无效的,因为可能很容易共享 RAM,例如写时复制内存,因此 512MB + 512MB 不一定意味着 1GB,但可能意味着更少。因此,不能简单地从所有进程中减去 RSS 来衡量应该有多少 RAM 可用,从而可靠地检测膨胀。人们可以检测到一些气球的情况,但在其他情况下气球是有效的,但这种方法无法检测到。
磁盘 I/O
我想我们可以随时间绘制磁盘读写次数、读写字节数以及 IO 等待百分比。但这会给我们提供磁盘 I/O 的准确图景吗?我想如果有一个比特币矿工在另一个使用所有 CPU 的 VM 中运行,我们的 IO 等待百分比会上升,即使底层 SAN 提供完全相同的性能,仅仅是因为我们的 CPU 资源下降,因此 IO 等待(以 % 衡量)上升。
总而言之,我们可以使用什么语言来描述例如 VMware 管理员,我们需要什么样的性能,以可移植和可测量的方式?
说真的,大多数 VMware 管理员并不擅长这一点:对资源管理了解不足,通常没有 Linux 知识(这很有帮助),并且缺乏时间带宽。我发现大多数内部管理员很难保持深入的虚拟化知识。
幸运的是,有一本书你可以读!
大多数 VMware 环境都不是很好:糟糕的集群设计、糟糕的资源规划、不合标准的存储(即 Synology NAS)、错误配置的 HA、没有监控或修补。
VMware 作为一个组织让我们失望:他们在传播最新信息和推广最佳实践方面特别糟糕。尽管流程和设计随着时间的推移发生了变化,但对常见问题的基本搜索会从 2009 年及更早的 VMware 版本中生成结果。
所有这些事情都会对你不利。
您应该确定解决方案的真正要求。能够准确地说明您的设备需要:2 个 vCPU、8GB RAM 和 500 IOPS 存储性能对于像我这样的人来说会有很长的路要走。
另一种方法是观察健康或理想的环境并从那里推断出指标。
您已经描述了某些部署的问题。有哪些问题和瓶颈?
大小合适的 VM 示例:
用于 300 个用户的组织的 Exchange 服务器。
虚拟机资源监控示例。
Good-ish: - 虚拟机大小合适。- CPU 在整个集群中被过度使用,但我们没有遇到争用。
坏的: