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

Mar*_*tra 5 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, 其中包含异步建议这个答案:在一个小的azure实例中使用Parallel.Foreach

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

我看到在经过的时间内复制的总大小给了我大约10 MB /秒.

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

Mar*_*tra 2

@breischl 感谢您提出的可扩展性目标。读完那篇文章后,我开始寻找更多可能由微软准备的目标数据,发现了 4 个帖子(太多了,我的“声誉”无法在这里发布,其他 3 个是同系列的第 2、3 和 4 部分):

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 上传操作。结果非常棒:写入 blob 的速度为 61 MB/s,读取速度为 65 MB/s。

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