将许多小文件从Azure VM临时磁盘复制到Azure Blob时的性能

时间:2012-10-31 13:17:38

标签: azure azure-storage-blobs

我正在尝试将数千个小Blob写入Azure存储时找出性能最佳的方法。 应用程序场景如下:

  • 不断创建或覆盖数千个文件 运行Windows Azure VM上安装的Windows服务
  • 写入VM可用的临时存储,服务可以达到更多 每秒超过9,000个文件创建
  • 文件大小介于1 KB和60 KB之间
  • 在运行相同sw的其他VM上,正在使用相同的速率和条件创建其他文件
  • 鉴于需要构建并保持更新中央存储库,每个VM上运行的另一个服务将新创建的文件从临时存储复制到Azure Blob
  • 其他服务器应该在更新版本中阅读Azure Blob

请注意,对于许多我没有列出的简短约束,目前无法修改主服务以直接创建Blob而不是临时文件系统上的文件。 ......而且从我目前看到的情况来看,它意味着创作速度较慢,而且不符合原始要求。

这个复制操作,我正在测试10,000个文件的紧密循环,似乎限制在每秒200个blob创建。在调整了此处找到的名为“Windows Azure ImportExportBlob”的示例代码后,我已经能够达到此结果:http://code.msdn.microsoft.com/windowsazure/Windows-Azure-ImportExportB-9d30ddd5包含此答案中的异步建议:Using Parallel.Foreach in a small azure instance

我在具有8个核心的超大型VM上获得了每秒200个blob创建的最大值,并相应地设置了“maxConcurrentThingsToProcess”信号量。测试期间的网络利用率是任务管理器中显示的可用10Gb的最大1%。这意味着大约100 Mb的800 Mb应该可用于该VM大小。

我发现在经过的时间内复制的总大小大约为10 MB /秒。

您可以生成的Azure存储流量是否存在一些限制,或者在编写这么多小文件时是否应该使用不同的方法?

1 个答案:

答案 0 :(得分:1)

@breischl感谢您的可扩展性目标。阅读完这篇文章之后,我开始寻找可能由微软准备的更多目标人物,并发现了4个帖子(我的“声望”太多了,在这里发布,其他3个是同一系列的第2,3和4部分):< / p>

http://blogs.microsoft.co.il/blogs/applisec/archive/2012/01/04/windows-azure-benchmarks-part-1-blobs-read-throughput.aspx

第一篇文章包含一个重要的提示:“您可能需要为多个线程增加 ServicePointManager.DefaultConnectionLimit ,以便与存储建立2个以上的并发连接。”

我已将此设置为300,重新运行测试并看到MB / s的重要增加。正如我之前所写,当“太多”线程正在编写blob时,我正在考虑在底层blob服务中达到限制。这证实了我的担忧。因此,我删除了对代码所做的所有更改以使用信号量,并使用parallel.for再次替换它以启动尽可能多的blob上载操作。 结果非常棒:61 MB / s写入blob和65 MB / s读取。

可伸缩性目标是60 MB / s,我终于对结果感到满意 再次感谢大家的回答。