0

背景 - 将使用 .NET 4.0、Azure SDK 1.7、Azure 表存储

问题如何最有效地(=最快的处理时间)读取 N 个条目,其中 N 是一个大的 #(1000 到数百万)个实体,并且每个实体在一组 Azure 表中非常小(<200 字节),其中预先我知道每个实体的 PartitionID 和 RowID,即 [(P1,R1),(P2,R2),...,(PN,RN)]。

“批处理”处理此类请求的最有效方法是什么。自然,在底层将需要异步/并行化获取,而不会通过 IO 锁或同步锁导致线程锁,理想情况下,我应该看到 CPU 达到 >80% 的吞吐量,以便服务器调用 Azure 表存储,因为这样处理应该是 CPU 绑定与 IO 或内存绑定。

4

1 回答 1

4

由于您要求从 Azure 存储读取“最快”的处理时间,因此这里有一些使我的性能提高的一般提示(最重要的是最重要的):

  1. 确保自 2012 年 7 月以来已创建 Azure 存储。这是 Azure 存储的 Gen2,它包括 SSD 驱动器上的存储。

  2. 在您的情况下,表存储增加了 Azure 存储 Gen2 分区的可扩展性目标:http: //blogs.msdn.com/b/windowsazure/archive/2012/11/02/windows-azure-s-flat-network- storage-and-2012-scalability-targets.aspx

    • 10 Gbps 网络与 1 Gbps 网络
    • 单个分区可以处理 20,000 个实体/秒
  3. .NET 默认连接更改了这个数字(我认为这可能会在新的 SDK 中解决,但不确定):http ://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0- 4961-a167-bbe7618beb83

  4. 您可以“加热” Azure 存储,它看到的事务越多,它将使用的控制器/驱动器缓存越多。以这种方式不断访问您的存储可能会很昂贵

  5. 您可以使用多个 Azure 存储帐户。这可以非常有效地分配您的负载(分片):http ://tk.azurewebsites.net/2012/08/26/hacking-azure-for-more-disk-performance/

  6. 您有几种方法可以在表存储中进行架构/设计。您有分区键和行键。但是,您还拥有表本身。请记住,这是 NoSQL,因此您可以拥有 100 个具有相同结构的表来服务不同的数据。这本身可以提高性能,您还可以将这些表存储在不同的 Azure 存储帐户中。RowKey-> PartitionKey -> Table -> Multiple Storage Accounts 都可以认为是“索引”,访问速度更快

  7. 我不知道您的数据,但是由于您将在 PartitionKey 上进行搜索(我假设),也许不是为每个 PartitionKey 存储 1,000,0000 条非常小的记录,而是将其存储在 zip 文件中并快速获取它/解压缩然后并行查询它linq 在本地服务器中时。玩缓存总是有帮助的,因为你确实有很多小对象。您可能可以将整个分区放在内存中。另一种选择可能是存储分区键,其中包含二进制/逗号分隔的列数据等。

  8. 您说您使用的是 Azure 1.7 SDK...我在使用 StorageClient 2.0 库时遇到了问题。我将 1.8 SDK 与 StorageClient 2.0 库一起使用。值得注意的事情(不一定是性能),因为它们可能在过去 2 年多的时间里提高了图书馆的效率

于 2012-12-06T13:14:15.997 回答