【问题标题】:Azure Table Storage Performance from Massively Parallel Threaded Reading来自大规模并行线程读取的 Azure 表存储性能
【发布时间】:2010-10-07 02:31:21
【问题描述】:

短版:我们能否以多线程的方式从数十个或数百个表分区中读取,从而将性能提升几个数量级?

长版: 我们正在开发一个在 Azure 表存储中存储数百万行的系统。我们将数据分成小分区,每个分区包含大约 500 条记录,代表一个单元一天的数据量。

由于 Azure 没有“求和”功能,要提取一年的数据,我们要么必须使用一些预缓存,要么自己在 Azure 网络或辅助角色中对数据进行求和。

假设如下: - 读取一个分区不会影响另一个分区的性能 - 读取分区有基于网络速度和服务器检索的瓶颈

然后我们可以猜测,如果我们想快速汇总大量数据(1 年,365 个分区),我们可以使用大规模并行算法,它几乎可以完美地扩展到线程数。例如,我们可以使用具有 50 多个线程的 .NET 并行扩展并获得巨大的性能提升。

我们正在努力进行一些实验,但我想看看以前是否做过。由于 .NET 端基本上是空闲等待高延迟操作,这对于多线程来说似乎是完美的。

【问题讨论】:

  • 6年后你对此有何评论?
  • 是的,这完全是一个好主意,尤其是随着时间的推移,可扩展性目标一直在提高。查看此页面以了解限制:docs.microsoft.com/en-us/azure/storage/…

标签: .net azure parallel-extensions


【解决方案1】:

在给定时间段内(大约 500 个请求/秒)可以对存储帐户和特定分区或存储服务器执行的事务数量存在限制。因此,从这个意义上说,您可以并行执行的请求数量有一个合理的限制(在它开始看起来像 DoS 攻击之前)。

另外,在实现中,我会警惕对客户端施加的并发连接限制,例如System.Net.ServicePointManager。我不确定 Azure 存储客户端是否受到这些限制;他们可能需要调整。

【讨论】:

  • 500 req/s 的限制是针对每个分区的。一个帐户的限制是每秒“几千”。在使用小型 VM 时,我注意到使用 20 多个线程时性能几乎没有提升。
  • 到目前为止的更新 - 在我的测试中,我能够使用 365 个线程读取 365,000 行,平均大约 7 秒就可以获取数据。对于使用 30 个线程分布在 30 个分区上的 30,000 行,我平均需要 1.4 秒。巨大的胜利!
猜你喜欢
  • 1970-01-01
  • 2016-05-31
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2015-03-16
相关资源
最近更新 更多