虚拟机和磁盘性能

适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集 ✔️ 统一规模集

本文介绍如何Azure 虚拟机(VM)和托管磁盘性能限制进行交互。 它还介绍如何诊断磁盘 I/O 瓶颈并优化存储性能。

AZURE VM 和托管磁盘性能限制如何交互

Azure VM 的输入/输出操作数(IOPS)和吞吐量限制取决于 VM 类型和大小。 托管 OS 磁盘和数据磁盘有自己的 IOPS 和吞吐量限制。

磁盘分配和性能

附加到Azure VM 的磁盘使用三个 I/O 路径。 下图显示了 Azure 如何实时在这些路径之间分配带宽和每秒输入/输出操作数(IOPS)。

受磁盘和 VM 网络限制约束的非缓存托管磁盘 I/O 示意图。缓存 I/O 同样受 SSD 限制约束,而缓存命中和临时磁盘 I/O 使用服务器 SSD。

第一种 I/O 路径是未缓存的托管磁盘路径。 I/O操作在使用托管磁盘并将主机缓存设置为 none 时会使用此路径。 使用此路径的 I/O 操作首先基于磁盘级预配运行,然后根据 IOPS 和吞吐量进行 VM 网络级别预配。

第二种 I/O 路径是已缓存的托管磁盘路径。 缓存的托管磁盘 I/O 使用靠近 VM 的 SSD。 此 SSD 已预配自己的 IOPS 和吞吐量,并在关系图中显示为“SSD 级预配”。

已缓存的托管磁盘启动读取时,请求会首先查看数据是否已存在于服务器 SSD 中。 如果数据不存在,会导致缓存未命中。 然后,I/O 基于 SSD 级别的预配、磁盘级预配,以及针对 IOPS 和吞吐量的 VM 网络级预配运行。

当服务器 SSD 启动对缓存的 I/O 的读取时,如果这些 I/O 已存在于服务器 SSD 上,就会发生缓存命中。 然后,I/O 会根据 SSD 级别的预配运行。 缓存的托管磁盘发起的写入操作始终遵循缓存未命中的路径。 它们经过 SSD 层级、磁盘层级和虚拟机网络层级的资源配置。

第三个路径是 临时磁盘。 它仅适用于支持临时磁盘的 VM。 使用此路径的 I/O 操作会基于 SSD 级别的 IOPS 和吞吐量预配运行。

下图描述了这些限制的示例。 由于 SSD 和网络级别的限制,无论是否缓存,系统都无法让 Standard_D2s_v3 虚拟机实现 P30 磁盘的 5,000 IOPS 潜能。

Standard_D2s_v3 VM 将 P30 磁盘性能限制为:未缓存 I/O 为 3,200 IOPS 和 32 MBps,缓存 I/O 为 4,000 IOPS 和 32 MBps 的示意图。

Azure 对磁盘流量使用优先网络通道。 磁盘流量优先于低优先级网络流量。 如果存在网络争用,此优先级有助于磁盘保持预期性能。

类似地,Azure 存储在后台使用自动负载均衡来处理资源争用和其他问题。 Azure 存储在你创建磁盘时分配所需资源,并应用主动和被动资源均衡来处理流量级别。 此行为会进一步确保磁盘保持其预期的 IOPS 和吞吐量目标。 使用 VM 级和磁盘级 指标 跟踪性能并根据需要设置警报。

磁盘 I/O 上限

当应用程序所请求的 IOPS 或吞吐量大于为虚拟机或附加磁盘分配的 IOPS 或吞吐量时,应用程序的性能会达到上限。 达到上限时,应用程序的性能会降低。 这种情况可能会导致负面影响,例如延迟增加。 以下示例使用 IOPS,但相同的逻辑适用于吞吐量。

磁盘级上限示例设置:

  • Standard_D8s_v3
    • 非缓存 IOPS:12,800
  • E30 OS 磁盘
    • IOPS:500
  • 两个 E30 数据磁盘 × 2
    • IOPS:500

将一个 10,000 IOPS 请求拆分到三个 E30 磁盘上的示意图,每个磁盘的上限均为 500 IOPS,因此最终得到 1,500 IOPS 的响应。

在虚拟机上运行的应用程序向虚拟机发出要求 10,000 个 IOPS 的请求。 VM 允许所有这些请求,因为 Standard_D8s_v3 虚拟机最多可以执行 12,800 个 IOPS。

10,000 IOPS 的请求随后会被分解为对不同磁盘的三个不同请求:

  • 向操作系统磁盘请求 1,000 IOPS。
  • 向每个数据磁盘请求 4,500 IOPS。

所有附加的磁盘都是 E30 磁盘,只能处理 500 IOPS。 因此,它们每个都以 500 IOPS 返回响应。 应用程序的性能会受到附加磁盘的限制,只能处理 1,500 IOPS。 如果使用性能更好的磁盘(例如,高级 SSD P30 磁盘),则应用程序的峰值性能可以达到 10,000 IOPS。

虚拟机 I/O 上限

VM 级上限示例设置:

  • Standard_D8s_v3
    • 非缓存 IOPS:12,800
  • P30 OS 磁盘
    • IOPS:5,000
  • 两个 P30 数据磁盘 × 2
    • IOPS:5,000

发往三个 P30 磁盘的 15,000 IOPS 请求示意图,这些磁盘的 IOPS 受 Standard_D8s_v3 VM 限制为 12,800。

在虚拟机上运行的应用程序发出需要 15,000 IOPS 的请求。 遗憾的是,Standard_D8s_v3 虚拟机仅预配为处理 12,800 IOPS。 应用程序受限于虚拟机限制,必须对分配给它的 12,800 IOPS 进行分配。

请求的这 12,800 IOPS 随后会被分解为对不同磁盘的三个不同请求:

  • 向操作系统磁盘请求 4,267 IOPS。
  • 向每个数据磁盘请求 4,266 IOPS。

所有附加的磁盘都是可处理 5,000 IOPS 的 P30 磁盘。 因此,它们将以所请求的数量返回响应。

虚拟机缓存和未缓存的限制

同时启用了高级存储和高级存储缓存的虚拟机有两种不同的存储带宽限制。 让我们以 Standard_D8s_v3 虚拟机为例。 下面是有关 Dsv3 系列和 Standard_D8s_v3 的文档:

  • “远程存储”下的“未缓存”磁盘数据是虚拟机可以处理的默认存储最大限制。 Standard_D8s_v3远程存储限制的屏幕截图,其中显示了 16 个磁盘、12,800 个未缓存的 IOPS、192 MBps 吞吐量和 16,000 IOPS 和 400 MBps 的突发限制。

  • 启用主机缓存后,“本地存储”选项卡下的“缓存”磁盘数据将受到单独限制。 Standard_D8s_v3本地存储限制的屏幕截图,其中显示了一个 64-GiB 临时磁盘、200-GiB 缓存、16,000 个缓存 IOPS 和 128 MBps 缓存吞吐量。

配置主机缓存

主机缓存的工作原理是,使存储更接近可以快速写入或读取的 VM。 文档中介绍了可供 VM 用于主机缓存的存储量。 例如,可以看到 Standard_D8s_v3 带有 200 GiB 的缓存存储。

你可以在创建虚拟机并附加磁盘时启用主机缓存。 还可以在现有 VM 的磁盘上打开和关闭主机缓存。 默认情况下,支持缓存的数据磁盘不启用缓存。 支持缓存的 OS 磁盘将启用读/写缓存。

Azure门户磁盘设置的屏幕截图,其中显示了 OS 磁盘的读/写缓存、一个数据磁盘的只读缓存,以及另一个数据磁盘的读/写缓存。

你可以调整主机缓存来满足每个磁盘的工作负荷要求。 可以将主机缓存设置为:

  • 只读:适用于仅执行读取操作的工作负荷
  • 读取/写入:适用于执行均衡的读取和写入操作的工作负荷

如果你的工作负载不符合上述任一模式,建议不要使用主机缓存。

只读主机缓存

以下示例演示将主机缓存设置为 只读时 I/O 请求如何流动。

只读主机缓存示例设置:

  • Standard_D8s_v3
    • 缓存的 IOPS:16,000
    • 非缓存 IOPS:12,800
  • P30 数据磁盘
    • IOPS:5,000
    • 主机缓存:只读

当执行读取操作且所需数据在缓存上可用时,缓存会返回所请求的数据。 不需要从磁盘读取数据。 此读取会计入 VM 的缓存限制。

由主机缓存处理且无需访问 P30 数据磁盘的 Standard_D8s_v3 读取请求示意图。

当执行读取操作且所需数据在缓存上不可用时,读取请求会被中继到磁盘。 然后,磁盘将数据提供给缓存和 VM。 此读取操作会同时计入 VM 的非缓存限制和 VM 的缓存限制。

缓存未命中读取操作的示意图:从 Standard_D8s_v3 VM 经由主机缓存到 P30 数据磁盘,响应则通过缓存返回。

执行写入操作时,必须同时写入缓存和磁盘,然后才能将其视为已完成。 此写入操作会同时计入 VM 的非缓存限制和 VM 的缓存限制。

写入图,其中只读主机缓存从Standard_D8s_v3 VM 流经主机缓存到 P30 数据磁盘,然后完成。

读取/写入主机缓存

以下示例演示将主机缓存设置为 读/写时 I/O 请求如何流动。

读取/写入主机缓存示例设置:

  • Standard_D8s_v3
    • 缓存的 IOPS:16,000
    • 非缓存 IOPS:12,800
  • P30 数据磁盘
    • IOPS:5,000
    • 主机缓存:读取/写入

使用读/写主机缓存时,缓存命中读取数计入 VM 的缓存限制。 缓存未命中的读取会同时计入 VM 的缓存上限和非缓存上限。 写入的处理方式有所不同:一次写入只需到达主机缓存,即可视为完成。 随后,在缓存定期刷新时,写入操作会被延迟写入到磁盘。 你还可以通过发送 f/sync 或 fua 命令来强制刷新。 一次写入在写入缓存时计入缓存 I/O,在延迟写入磁盘时计入非缓存 I/O。

启用读/写主机缓存的写入操作在主机缓存处完成并随后延迟写入 P30 数据磁盘的示意图。

缓存限制示例

以下示例使用启用了主机缓存的 Standard_D8s_v3 VM 和三个附加的 P30 磁盘。 VM 的缓存限制为 16,000 IOPS,每个 P30 磁盘可以处理 5,000 IOPS。

缓存限制设置示例:

  • Standard_D8s_v3
    • 缓存的 IOPS:16,000
    • 非缓存 IOPS:12,800
  • P30 OS 磁盘
    • IOPS:5,000
    • 主机缓存:读取/写入
  • 两个 P30 数据磁盘 × 2
    • IOPS:5,000
    • 主机缓存:读取/写入

Standard_D8s_v3 VM 通过主机缓存完成 16,000-IOPS 请求的示意图,该请求延迟写入一个 P30 OS 磁盘和两个 P30 数据磁盘。

应用程序使用了已启用缓存的 Standard_D8s_v3 虚拟机。 它请求 16,000 IOPS。 在将请求读取或写入缓存后,请求即告完成。 写入操作会延迟写入到所连接的磁盘。

组合的非缓存和缓存限制

虚拟机的缓存限制独立于其非缓存限制。 这种分离意味着可以在附加到 VM 的某些磁盘上启用主机缓存,同时在其他磁盘上不启用主机缓存。 此配置允许虚拟机获得相当于缓存限制与未缓存限制之和的总存储 I/O。

以下示例说明了在附加了高级 SSD 的 Standard_D8s_v3 VM 上,缓存和未缓存限制如何共同发挥作用。

组合缓存和未缓存的限制示例设置:

  • Standard_D8s_v3
    • 缓存的 IOPS:16,000
    • 非缓存 IOPS:12,800
  • P30 OS 磁盘
    • IOPS:5,000
    • 主机缓存:读取/写入
  • 两个 P30 数据磁盘 × 2
    • IOPS:5,000
    • 主机缓存:读取/写入
  • 两个 P30 数据磁盘 × 2
    • IOPS:5,000
    • 主机缓存:已禁用

通过向三个 P30 磁盘发送 15,000 个缓存 IOPS 并将 10,000 个未缓存的 IOPS 发送到两个 P30 数据磁盘,实现 25,000 IOPS 的 Standard_D8s_v3 vm 的示意图。

在此示例中,在 Standard_D8s_v3 虚拟机上运行的应用程序发出了 25,000 IOPS 的请求。 该请求将分解为每个附加的磁盘 5,000 IOPS。 三个磁盘使用主机缓存,两个磁盘未使用主机缓存。

  • 由于使用主机缓存的三个磁盘在缓存限制 (16,000) 内,因此这些请求会成功完成。 不会达到存储性能上限。
  • 由于未使用主机缓存的两个磁盘在非缓存限制 (12,800) 内,因此这些请求也会成功完成。 不会达到上限。