Azure表存储事务限制



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

整个管道是非阻塞的(await/async),并使用TPL进行并发和并行执行。

首先非常奇怪的是,在这个设置下,我只得到大约1200个插入。这是在L VM机器上运行的,即4核+ 800mbps。

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

更具确定性的行为如下:

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

阅读他们指定目标的博客文章非常幽默。https://azure.microsoft.com/en - gb/blog/windows azure平-网络-存储-和- 2012可伸缩性——targets/

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

每秒多达2,000个实体

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

我应该做些什么才能利用每秒20k,如何才能使每个VM执行超过12,000 ?

,

更新:

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

,

更新2:

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

,

更新3:

我现在也在美国西部尝试过。那里的表现更差。

,

更新4:

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

几个评论:

  1. 你提到你使用独特的PK/RK来获得终极分配,但你必须记住PK平衡是不直接。当您第一次创建表时,整个表都会创建由一个分区服务器提供服务。如果你在做插入几个不同的pk,它们仍然会进入一个分区服务器和被瓶颈所限制的可伸缩性目标为单一分区。分区主程序只会开始分割您的多个分区服务器之间的分区识别后就热了分区的服务器。在你的2分钟测试中,你不会看到多分区服务器或pk的好处。的吞吐量本文的目标是一个分布式的PK方案频繁访问的数据,导致数据被分割多个分区服务器。

  2. 虚拟机的大小不是问题您没有被CPU、内存或带宽阻塞。你可以实现在较小的虚拟机规模下实现完整的存储性能。

  3. 查看http://research.microsoft.com/en - us/downloads/5c8189b9 - 53 - aa - 4 - d6a a086 - 013 d927e15a7/default.aspx。我刚刚做了一个快速测试使用该工具从WebRole 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库有一些性能改进,应该会产生更好的结果。

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

本质上,TCP Nagle是一种协议级优化,用于批量处理小请求。由于您正在发送许多小请求,这可能会对您的性能产生负面影响。

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

ServicePointManager.UseNagleAlgorithm = false;

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

您可以在network选项卡下找到亲和性组配置。

我倾向于认为最大吞吐量是针对优化负载的。例如,我敢打赌,使用批处理请求可以比使用单个请求获得更高的性能。当然,如果你在PK中使用guid,你就不能在当前的测试中Batch。

那么,如果您将测试更改为以100个为组(每批最多)批量插入实体,仍然使用guid,但是哪100个实体具有相同的PK会怎么样?

相关内容

  • 没有找到相关文章

最新更新