Azure CosmosDB我不能超过1500 RU

时间:2017-09-29 18:33:50

标签: azure azure-storage azure-cosmosdb

我有一个需要大型RU的应用程序,但由于某种原因,我无法让客户端应用程序处理超过1000-1500个RU,尽管该集合设置为10000 RU。显然我可以添加更多客户端,但我需要一个客户端给我至少10000个RU然后扩展它。 我的要求很简单

    var query = connection.CreateDocumentQuery<DocumentDBProfile>(
    CollectionUri, //cached
    "SELECT * FROM Col1 WHERE Col1.key = '" + partitionKey + "' AND Col1.id ='" + id + "'",
    new FeedOptions
    {
        MaxItemCount = -1,
        MaxDegreeOfParallelism = 10000000,
        MaxBufferedItemCount = 1000,
    }).AsDocumentQuery();
    var dataset = await query.ExecuteNextAsync().ConfigureAwait(false);

上面的查询达到了150,000个分区,每个分区都在自己的任务中(等待所有结束),并且客户端使用TCP和直接模式进行初始化:

                            var policy = new ConnectionPolicy
                            {
                                EnableEndpointDiscovery = false,
                                ConnectionMode = ConnectionMode.Direct,
                                ConnectionProtocol = Protocol.Tcp,
                            };

客户端上的CPU似乎最大化,主要用于服务调用查询.ExecuteNextAsync()

我做错了吗?任何优化提示?我可以使用更低级别的API吗?有没有办法预解析查询或使Json解析更优化?

更新 通过降低并发请求的数量,我可以在一个客户端上获得高达3000-4000 RU,并将我的反序列化类拆分为具有单个属性(id)的一个,但我仍然是50,000 RU限制的10%性能指南中提到的。 不确定我还能做什么。我可以在.Net SDK中禁用任何安全检查或开销吗?

UPDATE2 我们所有的测试都在Azure的同一区域D11_V2上运行。运行多个客户端可以很好地扩展,因此我们是客户端绑定而不是服 仍然无法达到CosmosDB performance guideline

中列出的10%的性能

2 个答案:

答案 0 :(得分:3)

默认情况下,SDK会使用retry policy来屏蔽限制错误。您是否查看了Azure门户上可用的RU指标,以确认您是否受到限制?有关详细信息,请参阅教程here

不确定为什么REST API的性能优于.NET SDK。您能否详细介绍一下您在此处使用的操作?

您提供的示例查询是查询具有已知分区键和每个请求的ID的单个文档。对于这种点读操作,最好使用DocumentClient.ReadDocumentAsnyc,因为它应该比查询便宜。

答案 1 :(得分:2)

听起来你的唯一目的就是反驳微软的文档。不要高估这个“50.000 RU / S”值,以了解如何扩展客户。

我认为你不能得到更快更好的比使用带TCP和TCP的.NET SDK更低级别的API直接模式。关键部分是使用TCP协议(您是)。只有Java SDK也有直接模式,我怀疑它更快。也许是.NET Core ......

您的要求如何“拥有大型RU / s”?这相当于“应用程序应该要求我们每月为CosmosDB支付X $”。该要求应该是“需要每秒完成X个查询”或类似的东西。然后你从那里继续。另请参阅request unit calculator

请求单位是您的交易成本。这取决于您的文档有多大,如何配置您的收藏以及您正在做什么。插入文档通常比检索数据昂贵得多。在一个查询中跨分区检索数据比仅触摸一个查询更昂贵。根据经验,写入数据的费用比阅读数据贵5倍。 我建议你阅读documentation about request units

微软性能提示的问题在于他们没有提到任何关于哪个请求应该招致这些RU的问题。我不希望它意味着:“如果你仍然低于50.000 RU / s,那么最基本的请求将不会最大化客户端系统上的CPU”。插入数据可以更轻松地获得这些数字。我在我的本地机器上进行了非常快速的测试,并使用TCP + direct将official benchmarking sample提升到大约7-8k RU / s。除了下载代码并从Visual Studio运行代码之外,我没有做任何事情。所以我的猜测是提示也是关于插入的,因为性能测试的例子也是如此。该示例顺便达到100.000RU / s。

Azure中有一些关于“Benchmarking”和“Request Units”的好样本。它们也应该是进一步实验的良好来源。

只有一个关于如何改进查询的实际提示:可能会使用struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class cmp{ public: bool operator()(const ListNode *a,const ListNode *b) const { if(b==nullptr) return false; return a==nullptr || a->val>b->val; } }; class Solution { ListNode* helper(auto& lists) { ListNode *ans=lists.top();lists.pop(); if(ans==nullptr) return nullptr; lists.push(ans->next); ans->next=helper(lists); return ans; } public: ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.empty()) return nullptr; priority_queue<ListNode*,vector<ListNode*>> pq(cmp,std::move(lists)); //compiler says error: 'std::move' is not a type return helper(pq); } }; CreateDocumentQuery(..)对您的班级进行反序列化。可以帮助你的CPU。我的第一个猜测是你的CPU正在做一堆。

希望这会有所帮助。