gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:32:27 25 4
gpt4 key购买 nike

我正在尝试将大约 2500 万行从 Azure SQL 表批量加载到 Azure 表存储中的三个不同表中。我目前设法处理大约 50-100 行/秒,这意味着以当前速度,我需要大约 70-140 小时才能完成加载。时间太长了,看来应该可以加快速度。

这就是我正在做的事情:

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

一些注意事项:

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

我能想到的唯一一个明显的想法是我之前尝试过的,即在 SQL select 语句中执行 order by 分区键,这样我们就可以获得完美的分区批量插入的密度。由于各种原因,这已被证明是困难的,因为表的索引没有完全为此设置。虽然我希望使用这种方法在 ATS 端能加快一些速度,但考虑到我已经按分区键对 10K 记录进行了分组,但我不希望获得那么多额外的性能改进。

还有其他加快速度的建议吗?或者这是否是其他人能够达到的最快速度?

最佳答案

仍愿意接受其他建议,但我发现此页面非常有帮助:

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 毫秒减少到约 2 毫秒。好多了。

但正如我所说,仍然愿意接受其他建议。我读到其他人在 ATS 上每秒执行超过 20,000 次操作,而我仍然停留在 500 次左右。

关于azure - 提高 Azure 表存储批量加载的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25839147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com