提高Azure表存储批量加载的性能

时间:2014-09-14 23:52:02

标签: azure azure-table-storage

我尝试将Azure SQL表中的大约2500万行批量加载到Azure表存储中的三个不同表中。我目前正在设法处理大约50-100行/秒,这意味着在当前速度下,我需要大约70-140小时来完成负载。那是很长一段时间,似乎应该有可能加快速度。

这就是我正在做的事情:

  • 启动10个单独的任务
  • 对于每个任务,从SQL DB
  • 中读取下一个10,000个未处理的记录
  • 对于三个目标ATS表中的每一个,按该表的分区键对10,000条记录进行分组
  • 并行(最多10个同时),对于每个分区键,将分区划分为(最多)100行段
  • 并行(最多10个同时),对于每个细分,请创建一个新的TableBatchOperation
  • 对于块中的每一行,执行batch.InsertOrReplace()语句(因为某些数据已经加载,我不知道哪些)
  • 异步执行批处理
  • 冲洗并重复(使用大量流量控制,错误检查等)

一些注意事项:

  • 我已经尝试了几种不同的方式,上面各种数字都有很多不同的参数,而且我还没有把它降到10-20毫秒以下/事件。
  • 它似乎不受CPU限制,因为负载的VM平均占CPU的10-20%。
  • 它似乎不受SQL约束,因为SQL select语句是操作中最快的部分至少两个数量级。
  • 它可能不受网络限制,因为执行批处理的VM位于同一数据中心(美国西部)。
  • 我获得了合理的分区密度,即每个10K的记录集被分解为每个表的几百个分区。
  • 凭借完美的分区密度,我可以同时运行多达3000个任务(10个主任务* 3个表* 10个分区* 10个段)。但是它们是异步执行的,并且几乎所有I / O都受到限制(通过ATS),所以我不认为我们在执行该过程的VM上遇到任何线程限制。

我能想出的唯一另一个明显的想法是我之前尝试过的,即在SQL select语句中执行order by分区键,以便我们可以为批处理获得完美的分区密度插入。由于各种原因已被证明是困难的,因为表的索引并没有为此设置。虽然我希望某些使用这种方法在ATS端加速,但鉴于我已经通过他们的分区键对10K记录进行分组,我不希望得到它更多的性能提升。

有什么其他建议可以加快速度吗?或者这是否和其他任何人一样快?

2 个答案:

答案 0 :(得分:1)

仍然接受其他建议,但我发现此页面非常有用:

http://blogs.msmvps.com/nunogodinho/2013/11/20/windows-azure-storage-performance-best-practices/

具体来说,这些:

ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.DefaultConnectionLimit = 100;

通过这些,我能够将平均处理时间从~10-20 ms /事件下降到~2 ms。 好多了。

但正如我所说,仍然接受其他建议。我已经读过其他人在ATS上每秒超过20,000次操作,而且我仍然被困在500左右。

答案 1 :(得分:0)

你的分区键怎么样?如果它们是增量数字,则Azure会将它们优化为一个存储节点。所以你应该使用完全不同的分区键" A1"," B2"而不是" 1"," 2"等等 在这种情况下,所有分区都将由不同的存储节点处理,性能将被多重化。