Azure Blob 存储中的网络文件系统 (NFS) 3.0 性能注意事项

Blob 存储现在支持网络文件系统 (NFS) 3.0 协议。 本文包含有助于优化存储请求性能的建议。 若要详细了解 Azure Blob 存储支持的 NFS 3.0,请参阅 Azure Blob 存储支持网络文件系统 (NFS) 3.0 协议

添加客户端以增加吞吐量

Azure Blob 存储可线性扩展,直至达到最大存储帐户流出量和流入量限制。 因此,应用程序可以通过使用更多客户端实现更高的吞吐量。 若要查看存储帐户流出量和流入量限制,请参阅标准存储帐户的可伸缩性和性能目标

下图显示了添加更多客户端时带宽的增长情况。 在此图表中,客户端是虚拟机 (VM),使用标准的常规用途 v2 存储帐户。

Standard performance

以下图表显示了应用于高级块 Blob 存储帐户时的相同效果。

Premium performance

对小规模应用程序使用高级块 Blob 存储帐户

并非所有应用程序都可以通过添加更多客户端实现扩展。 对于这些应用程序,Azure 高级块 blob 存储帐户提供一致的低延迟和高事务率。 高级块 blob 存储帐户可以用更少的线程和客户端达到最大带宽。 例如,使用单个客户端时,与使用标准性能常规用途 v2 存储帐户的相同设置相比,高级块 blob 存储帐户可以实现 2.3 倍带宽。

下图中的每个条形图显示了高级和标准性能存储帐户在实现带宽方面的差异。 随着客户端数量的增加,这一差异会降低。

Relative performance

提高预读大小以提高大型文件读取吞吐量

read_ahead_kb 内核参数表示满足给定读取请求后应读取的其他数据量。 可以将此参数增大到 16 MiB,以提高大型文件读取吞吐量。

export AZMNT=/your/container/mountpoint

echo 16384 > /sys/class/bdi/0:$(stat -c "%d" $AZMNT)/read_ahead_kb

避免频繁执行日期覆盖操作

完成覆盖操作比完成新的写入操作需要更长的时间。 这是因为 NFS 覆盖操作(特别是部分就地文件编辑)是多个基础 blob 操作的组合:读取、修改和写入操作。 因此,需要频繁进行就地编辑的应用程序并不适合启用了 NFS 的 blob 存储帐户。

为延迟敏感型应用程序部署 Azure HPC 缓存

除了高吞吐量之外,某些应用程序可能还需要低延迟。 可以部署 Azure HPC 缓存来显著改善延迟。 详细了解 Blob 存储中的延迟

增加 TCP 连接数量

可使用 nconnect 装载选项从单个 VM 获取更高的聚合读写性能,但前提是 Linux 内核支持 Azure nconnect。

nconnect 是一个客户端 Linux 装载选项,允许在客户端与 BLOB 服务终结点之间使用多个 TCP 连接。 可在 mount 命令中使用 nconnect 选项指定要创建的 TCP 连接数(例如 mount -t aznfs -o nconnect=16,sec=sys,vers=3,nolock,proto=tcp <storage-account-name>.blob.core.chinacloudapi.cn:/<storage-account-name>/<container-name> /nfsdatain)。

重要

虽然最新的 Linux 发行版完全支持 nconnect,但只有当你的内核支持 Azure nconnect 时,才应使用此选项。 如果在没有 Azure nconnect 支持的情况下使用 nconnect 装载选项,将降低吞吐量,导致多次超时,并导致 READDIRREADIRPLUS 等命令无法正常工作。

可用于 Azure 虚拟机的大多数最新 Ubuntu 内核都提供 Azure nconnect 支持。 若要了解 Azure nconnect 支持是否可用于你的内核,请运行以下命令。

[ -e /sys/module/sunrpc/parameters/enable_azure_nconnect ] && echo "Yes" || echo "No"

如果 Azure nconnect 支持可用于你的内核,会在控制台中输出 Yes。 否则,会在控制台中输出 'No

如果 Azure nconnect 支持可用,请运行以下命令来启用它。

echo Y > /sys/module/sunrpc/parameters/enable_azure_nconnect

其他最佳做法建议

  • 使用网络带宽充足的 VM。

  • 在工作负载允许的情况下使用多个装入点。

  • 使用尽可能多的线程。

  • 使用较大的块大小。

  • 从与存储帐户位于同一区域的客户端发出存储请求。 这可以改善网络延迟。

后续步骤