7

我正在针对 ATS 运行性能测试,当对同一个表/存储帐户使用多个虚拟机时,它的行为有点奇怪。

整个管道是非阻塞的(等待/异步)并使用 TPL 进行并发和并行执行。

首先,非常奇怪的是,通过这种设置,我只能获得大约 1200 次插入。这是在 L VM 机器上运行的,即 4 核 + 800mbps。

我正在插入 100.000 行具有唯一 PK 和唯一 RK 的行,这应该利用最终分布。

以下是更具确定性的行为。

当我运行 1 个 VM 时,我每秒获得大约 1200 次插入。当我运行 3 个 VM 时,我每秒每次插入大约 730 个。

阅读他们指定目标的博客文章非常幽默。 https://azure.microsoft.com/en-gb/blog/windows-azures-flat-network-storage-and-2012-scalability-targets/

单表分区——表分区是表中具有相同分区键值的所有实体,通常表有很多分区。单个表分区的吞吐量目标是:

每秒最多 2,000 个实体

请注意,这是针对单个分区,而不是单个表。因此,具有良好分区的表最多可以处理 20,000 个实体/秒,这就是上面描述的整体帐户目标。

我应该怎么做才能利用每秒 20k 的速度,如何才能在每个 VM 上执行超过 1,2k 的速度?

--

更新:

我现在还尝试为每个单独的节点使用 3 个存储帐户,并且仍然获得性能/节流行为。我找不到合乎逻辑的理由。

--

更新 2:

我已经进一步优化了代码,现在我可以执行大约 1550。

--

更新 3:

我现在也在美国西部尝试过。那里的表现更差。降低约 33%。

--

更新 4:

我尝试从 XL 机器上执行代码。这是 8 个核心而不是 4 个核心,内存和带宽增加了一倍,性能提高了 2%,所以很明显这个问题不在我这边。

4

4 回答 4

4

几点评论:

  1. 您提到您正在使用独特的 PK/RK 来获得最终分布,但您必须记住,PK 平衡不是立即的。首次创建表时,整个表将由 1 个分区服务器提供服务。因此,如果您要跨多个不同的 PK 进行插入,它们仍将转到一个分区服务器,并且会受到单个分区的可伸缩性目标的瓶颈。分区主服务器只有在识别出热分区服务器后才会开始在多个分区服务器之间拆分您的分区。在您的 <2 分钟测试中,您不会看到多个分区服务器或 PK 的好处。文章中的吞吐量针对的是分布良好的 PK 方案,数据访问频繁,导致数据在多个分区服务器之间划分。

  2. 您的 VM 大小不是问题,因为您不会在 CPU、内存或带宽上被阻止。您可以从较小的 VM 大小获得完整的存储性能。

  3. 查看 http://research.microsoft.com/en-us/downloads/5c8189b9-53aa-4d6a-a086-013d927e15a7/default.aspx。我刚刚在与我的存储帐户在同一数据中心的 WebRole VM 中使用该工具进行了快速测试,并且我从单个 VM 上的单个工具实例中实现了每秒上传约 2800 个项目和每秒约 7300 个项目下载。这是使用 1024 字节实体、10 个线程和 100 个批量大小。我不知道这个工具的效率如何,或者它是否禁用了 Nagles 算法,因为我无法使用 1 的批量大小获得很好的结果(我得到了 ~1000/秒),但至少在 100 批量大小的情况下它表明你可以达到高项目/秒。这是在美国西部完成的。

  4. 您使用的是存储客户端库 1.7 (Microsoft.Azure.StorageClient.dll) 还是 2.0 (Microsoft.Azure.Storage.dll)?2.0 库有一些性能改进,应该会产生更好的结果。

于 2013-02-01T21:54:51.017 回答
0

我倾向于相信最大吞吐量是为了优化负载。例如,我敢打赌,使用批处理请求可以获得比现在执行的单个请求更高的性能。当然,如果您在 PK 中使用 GUID,则无法在当前测试中进行批处理。

那么,如果您将测试更改为以 100 个为一组(每批最多)批量插入实体,仍然使用 GUID,但其中 100 个实体将具有相同的 PK,该怎么办?

于 2013-01-25T12:57:08.233 回答
0

计算实例和存储帐户是否在同一个关联组中?亲和组确保服务之间的网络接近度是最佳的,并且应该导致网络级别的延迟更低。

您可以在网络选项卡下找到关联组配置。

于 2013-01-24T12:22:09.233 回答
0

我怀疑这可能与 TCP Nagle 有关。请参阅此 MSDN 文章此博客文章

从本质上讲,TCP Nagle 是一种协议级别的优化,可以批量处理小请求。由于您发送大量小请求,这可能会对您的性能产​​生负面影响。

您可以通过在启动应用程序时执行此代码来禁用 TCP Nagle

ServicePointManager.UseNagleAlgorithm = false;
于 2013-01-24T21:23:59.953 回答