我正在尝试将数千个小Blob写入Azure存储时找出性能最佳的方法。 应用程序场景如下:
请注意,对于许多我没有列出的简短约束,目前无法修改主服务以直接创建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存储流量是否存在一些限制,或者在编写这么多小文件时是否应该使用不同的方法?
答案 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,我终于对结果感到满意 再次感谢大家的回答。