【问题标题】:Azure VHD performance vs BLOBAzure VHD 性能与 BLOB
【发布时间】:2017-03-29 17:16:52
【问题描述】:

我在同一个 blob 服务中有 2 个容器。一个包含一个 VHD,另一个包含一个测试 PDF。

在附加了 VHD 的 VM 中运行进程,我得到以下数字。

VHD 读取:

// VHD = e: drive, copy files
using (FileStream fs = new FileStream(@"e:\various\14681.pdf", FileMode.Open))
using (var mstream = new MemoryStream())
{
    byte[] buffer = new byte[32 * 1024];
    int bytesRead;
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
    {
        mstream.Write(buffer, 0, bytesRead);
    }
}
// 20MB file = 250ms, 250k file = <1ms

blockBlob.DownloadToStream:

//read blob 
//CloudBlockBlob blockBlob = container.GetBlockBlobReference("14681.pdf");

using (var mstream = new MemoryStream())
{
    blockBlob.DownloadToStream(mstream);
}

// 20MB file = 700-800ms, 250k file = 40ms

为什么这两个进程的性能会有这么大的差别

【问题讨论】:

  • 什么是E: 驱动器:VM 上的临时磁盘?附盘?如果附加磁盘:常规存储?高级存储?
  • e:\ 是 VHD,常规(标准)存储。 Blob 位于同一个存储帐户中,但在不同的容器中。
  • 不确定为什么您会看到差异,但可能是文件 I/O 的实现方式以及附加磁盘的读取/缓存方式。使用 blob 下载,您可能会受到逐块访问的限制(相对于以并行流下载内容的工具)。注意:如果e: 驱动器是临时驱动器,它很容易解释,因为它是临时的机箱内 SSD,而不是网络连接。

标签: azure blob vhd


【解决方案1】:

嗯,当您访问存储 blob 时,您是通过公共互联网(甚至不是内部),因此会增加延迟,而当您访问 VHD 时,您会通过 Azure 主干(虚拟机管理程序会为您执行此操作)。 我推测这是主要原因。

【讨论】:

  • 您是如何确定的? OP 说代码在虚拟机上运行。
  • 确定什么? Azure VM 无法直接与 Azure 存储通信,因此它们总是使用公共 Internet @DavidMakogon 进行通信
  • 这不是真的。对 Azure 存储(在同一区域内)的调用不通过 Internet 路由。使用来自 VM 的 blob 也不会产生任何出口费用。
  • 那么在这种情况下,如果您想从 Azure VM 与 Azure 存储通信,为什么需要将 Azure 数据中心 IP 列入白名单? @DavidMakogon
  • 我不知道你指的是什么。 Azure 存储上没有防火墙。 SQL 数据库上有防火墙,没错,但这不是一回事。而且您可以将虚拟机上的端口列入 IP 白名单,但同样,这不是一回事。