我有代码(用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的调用,这样总的时间可以与单个调用时间加上一些开销相比吗?
答案 0 :(得分:2)
并行查询可能无法获得更高的性能,尤其是对于像ListBlobs这样的扫描操作。此类操作应该受到限制,而不是依赖于延迟敏感操作,因为性能与对象数量成比例,并且当需要的资源多于允许的资源时,以较低的优先级执行。
也就是说,您可以查看存储分析以确保实时调度所有呼叫,并且e2e延迟和服务器延迟之间的差异很小。
请查看以下链接以获取更多有用信息: