Azure存储中对ListBlobs的并行调用不会导致性能提升

时间:2015-02-22 14:23:04

标签: asynchronous f# azure-storage-blobs parallel.foreach

我有代码(用F#编写,但我相信语言的选择并不重要),它为Azure blob目录列表中的每个条目调用ListBlobs,总共约50个条目。所有通话的总时间约为20秒。以下是原始代码的外观:

enumerateDirectories container
|> Seq.map (fun x -> listBlobs x)
|> Seq.concat

功能" listBlobs"是Azure blob存储ListBlobs方法的简单包装器。由于blob列表彼此独立,我尝试异步运行它们:

enumerateDirectories container
|> Seq.map (fun x ->
            async {
                 printfn "listBlobs %s" x 
                 return listBlobs x 
            })
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.concat

但执行时间根本没有改善。然后我用pseq模块的并行序列调用改变了F#异步工作流程:

enumerateDirectories container
|> PSeq.map (fun x -> listBlobs x)
|> Seq.concat

这改善了执行时间,因此它只花了过去的一半。仍然,与单个ListBlob调用的不到一秒相比,它需要大约10秒。我想知道为什么。不应该同时执行ListBlobs的调用,这样总的时间可以与单个调用时间加上一些开销相比吗?

1 个答案:

答案 0 :(得分:2)

并行查询可能无法获得更高的性能,尤其是对于像ListBlobs这样的扫描操作。此类操作应该受到限制,而不是依赖于延迟敏感操作,因为性能与对象数量成比例,并且当需要的资源多于允许的资源时,以较低的优先级执行。

也就是说,您可以查看存储分析以确保实时调度所有呼叫,并且e2e延迟和服务器延迟之间的差异很小。

请查看以下链接以获取更多有用信息: