CPU 窃取时间在 GNU top 命令中被定义为“hypervisor 从 [客户] VM 窃取的时间”。当 hypervisor 进程和客户实例试图同时使用同一个 hypervisor 物理核心 (pCPU) 时,就会发生 CPU 窃取时间。这导致客户虚拟 CPU (vCPU) 可用的处理器时间减少,并导致客户性能下降。
在当今的虚拟化环境(随着公有云和私有云的普及,虚拟化环境已变得几乎普遍),客户实例在以下几种情况下可能会遇到 CPU 窃取性能问题
- hypervisor 超额订阅以及多个客户 VM 的 vCPU 在同一 pCPU 上以高 CPU 利用率运行。
- 客户 vCPU 及其模拟器线程被绑定到同一个 pCPU,导致 vhost 进程在处理 I/O 时从客户 vCPU 窃取 CPU 时间。
- hypervisor 进程(如监控、日志记录和 I/O 进程)同时使用也正在被客户 VM vCPU 使用的 pCPU。
通常,被请来调查应用程序或系统性能问题的系统工程师会发现,系统性能下降是由于从客户窃取的 CPU 时间造成的。客户的性能问题通常以磁盘或网络 I/O 性能低下、网络数据包丢失和其他应用程序性能异常的形式变得明显。
即使系统管理员正在观察客户机和 hypervisor,也很难缩小客户实例性能下降的原因,因为 CPU 窃取时间。造成这种困难的原因有几个。首先,CPU 窃取时间不会被任何常用的监控日志文件记录。被观察的 hypervisor 可能预计会处于重负载之下,但窃取时间可能发生在正常负载下的 hypervisor 上。最后,管理员可能不知道可以使用 GNU top 从客户 VM 实例内部观察 hypervisor CPU 争用。
幸运的是,GNU top 确实可以很容易地检测客户 VM 实例上的 CPU 窃取时间。窃取时间显示在 top 输出的第 3 行末尾,该行以 %Cpu(s) 开头,如下面的屏幕截图所示(它是末尾的值,标记为 st。)第一个示例显示了窃取时间很少的客户机

此屏幕截图显示了客户机正在经历严重的 CPU 窃取时间

来自客户机的 top 命令输出,该客户机正在经历 9.0 st 的严重 CPU 窃取时间。
在这两个示例中,压力测试工具都使用了四个进程执行,这些进程消耗了客户实例的所有四个 vCPU。在第一个示例中,hypervisor 相对空闲,因此客户机的窃取时间仅为 0.2。但在第二个示例中,压力测试工具同时在 hypervisor 上执行,使用了八个进程,这些进程消耗了 hypervisor 的所有八个 pCPU,从而产生了 9.0 的高 CPU 窃取时间。
第二个示例中还有另一个窃取时间的迹象:压力测试实用程序进程无法消耗客户机 vCPU 的 ~100%;它只能分别消耗 99.3%、99.3%、86.4% 和 74.4%。总计,这相当于客户 vCPU 的 40.3% 被窃取。这是因为 hypervisor 正在消耗与客户 vCPU 进程正在使用的相同 pCPU 上的周期。
使用 top 缓解不良性能
此示例展示了 hypervisor 上客户 VM 实例和其他进程的过度订阅如何与客户机竞争,以及如何使用 GNU top 基于客户 VM 上的 CPU 窃取时间百分比来检测它。
检测客户 VM 中这种类型的性能下降非常重要,这样您就可以缓解系统和应用程序性能不佳的原因。在公有云中,唯一的解决方案可能是迁移实例或更改为具有保证 pCPU 服务级别协议 (SLA) 的实例类型。在私有云中,有更多选择,但同样,最简单的方法可能是将实例迁移到利用率较低的 hypervisor。但是,如果许多客户实例遇到高 CPU 窃取时间,您将需要更改管理客户机和 hypervisor 进程的方式,以达到客户实例的性能 SLA。
评论已关闭。