并行调用 Azure 存储中的 ListBlob 不会提高性能

Parallel calls to ListBlobs in Azure storage don't result in performance improvement

我有代码(用 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 秒。我想知道为什么。不应该同时执行对 ListBlob 的调用,以便总时间与单个调用时间加上一些开销相当吗?

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

也就是说,您可以查看存储分析以确保所有调用实际上是同时调度的,并且端到端延迟和服务器延迟之间的差异最小。

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