閱讀英文

共用方式為

虚拟机和磁盘性能

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

本文阐述了磁盘性能,以及在将 Azure 虚拟机和 Azure 磁盘组合使用时磁盘性能的工作原理。 此外还介绍了如何诊断磁盘 IO 的瓶颈,以及可以进行哪些更改以优化性能。

磁盘性能工作原理

Azure 虚拟机 (VM) 具有每秒输入/输出操作数 (IOPS) 和吞吐量性能限制,这些限制由虚拟机类型和大小决定。 操作系统磁盘和数据磁盘可以附加到虚拟机。 磁盘具有各自的 IOPS 和吞吐量限制。

磁盘分配和性能

在 Azure 中,带宽和每秒 I/O 操作 (IOPS) 可通过三个路径用于附加到 VM 的磁盘。 下图描述了这些路径的实时分配。

下图描绘了磁盘的每秒带宽和 I/O 操作 (IOPS) 的实时分配,其中 I/O 可以采用三个路径。

显示带宽和 IOPS 分配的三级预配系统的示意图。

第一种 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 示例分配的三级预配系统的关系图。

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

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

磁盘 IO 上限

当应用程序所请求的 IOPS 或吞吐量大于为虚拟机或附加磁盘分配的 IOPS 或吞吐量时,应用程序的性能会达到上限。 达到上限时,应用程序的性能会降低。 这可能会导致负面后果,例如延迟增大。 让我们通过几个示例来阐明此概念。 为了使这些示例更容易理解,我们只看 IOPS。 但是,同样的逻辑也适用于吞吐量。

设置:

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

示意图中显示了磁盘级上限。

在虚拟机上运行的应用程序向虚拟机发出要求 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。

虚拟机 IO 上限

设置:

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

示意图中显示了虚拟机级上限。

在虚拟机上运行的应用程序发出需要 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 的文档:

  • “远程存储”下的“未缓存”磁盘数据是虚拟机可以处理的默认存储最大限制。 显示 Dsv3 远程规范的图表。

  • 启用主机缓存后,“本地存储”选项卡下的“缓存”磁盘数据将受到单独限制。 显示 Dsv3 本地规范的图表。

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

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

屏幕截图显示了主机缓存。

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

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

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

让我们通过几个示例来了解不同的主机缓存设置,看其如何影响数据流和性能。 在这第一个示例中,我们将了解当主机缓存设置设为“只读”时,IO 请求会发生什么

设置:

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

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

示意图中显示了读取主机缓存读取命中。

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

示意图中显示了读取主机缓存读取未命中。

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

示意图中显示了读取主机缓存写入。

接下来,我们将了解当主机缓存设置设为“读取/写入”时,IO 请求会发生什么。

设置:

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

读取的处理方式与只读完全相同。 对于读取/写入缓存,只有写入存在差别。 在主机缓存设置为“读取/写入”的情况下进行写入时,只需要写入主机缓存即可将其视为完成。 随后,在缓存定期刷新时,写入操作会被延迟写入到磁盘。 客户还可以通过发出 f/syncfua 命令来强制刷新。 这意味着当写入到缓存时,该写入计入缓存的 IO。 如果它被延迟写入到磁盘,则会计入未缓存的 IO。

示意图中显示了读取/写入主机缓存写入。

接下来,让我们继续讨论 Standard_D8s_v3 虚拟机。 但是,这次我们会在磁盘上启用主机缓存。 这会将 VM 的 IOPS 限制为 16,000 个IOPS。 附加到 VM 的三个基础 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 虚拟机。 它请求 16,000 IOPS。 在将请求读取或写入缓存后,请求即告完成。 写入操作会延迟写入到所连接的磁盘。

组合的非缓存和缓存限制

虚拟机的缓存限制独立于其非缓存限制。 这意味着,你可以在附加到 VM 的磁盘上启用主机缓存,同时不在其他磁盘上启用主机缓存。 此配置使得虚拟机获得的总存储 IO 为缓存限制外加非缓存限制。

让我们通过一个示例来帮助你了解这些限制如何协同工作。 我们将继续讨论 Standard_D8s_v3 虚拟机和附加了高级磁盘的配置。

设置:

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

示意图中显示了具有远程存储的主机缓存示例。

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

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