2017-01-20 15 views
2

の場合、私は多分これをすべて間違っているかもしれません。しかし、私はDocumentDbを使用してWebアプリケーションで奇妙な結果を出した後、簡単なベンチマークを作成しました。"ベンチマーク" documentdb

 var id = "62734c17-e939-43bd-8719-08e4c7b51f75"; 
     var client = new DocumentClient(new Uri(LocalDbConfig.Endpoint),LocalDbConfig.Key); 
     var sw = new Stopwatch(); 
     var collectionLink = UriFactory.CreateDocumentCollectionUri(LocalDbConfig.DatabaseId, 
      LocalDbConfig.CollectionId); 

     var tsResults = new List<long>(); 
     var docResults = new List<long>(); 

     for (int i = 0; i < 10; i++) 
     { 
      sw.Restart(); 
      var result = client.CreateDocumentQuery(collectionLink, $"select c._ts from c where c.id = \"{id}\"").AsEnumerable().FirstOrDefault()._ts; 
      sw.Stop(); 
      tsResults.Add(sw.ElapsedMilliseconds); 
      Console.WriteLine($"TS: {sw.ElapsedMilliseconds}"); 
     } 

     for (int i = 0; i < 10; i++) 
     { 
      sw.Restart(); 
      var doc = client.CreateDocumentQuery(collectionLink).Where(q => q.Id == id).AsEnumerable().FirstOrDefault(); 
      sw.Stop(); 
      docResults.Add(sw.ElapsedMilliseconds); 
      Console.WriteLine($"DOC: {sw.ElapsedMilliseconds}"); 
     } 

     Console.WriteLine($"TS: Average: {tsResults.Average()} - Longest: {tsResults.Max()} - Shortest: {tsResults.Min()}"); 
     Console.WriteLine($"DOC: Average: {docResults.Average()} - Longest: {docResults.Max()} - Shortest: {docResults.Min()}"); 


     Console.ReadLine(); 

これは、C#コンソールアプリのMain()機能です。私が要求しているドキュメントは約5MBのJSONです。

最初のループでは、ドキュメントの1つのプロパティを要求しています。タイムスタンプです。 (私は非常に素朴なキャッシングの開始を実装するためにこれを始めました)そしてもう一つのループは完全なドキュメントを返します。

これが出力されます:

TS: 1450 
TS: 17 
TS: 18 
TS: 22 
TS: 548 
TS: 156 
TS: 532 
TS: 174 
TS: 519 
TS: 182 
DOC: 557 
DOC: 1725 
DOC: 1916 
DOC: 1868 
DOC: 1876 
DOC: 1832 
DOC: 1861 
DOC: 1851 
DOC: 1881 
DOC: 1870 
TS: Average: 361,8 - Longest: 1450 - Shortest: 17 
DOC: Average: 1723,7 - Longest: 1916 - Shortest: 557 

あなたが見ることができるように、タイムスタンプを返すことは、すべての場所にあるが、完全な文書を返すことは最初の要求後に安定の一種である、なぜ最初の要求であります残りの部分よりも400%速く、どちらもわかりません。

このテストはDocumentDbエミュレータで実行されますが、元の問題はAzure DocumentDbサービスにも存在しています。

なぜタイムスタンプを取得するのがいいのでしょうか?そして、なぜドキュメントの最初のフェッチが500msですか、残りはほぼ2000msですか?

+0

エミュレータではなく、DocumentDBと同じデータセンターから実行できますか?私はあなたが問題が存在すると言っていることを知っていますが、あなたのデータが実稼働環境からのものであれば、より多くの人々が手助けをすることになると思います。 –

+0

スロットルをオフにして再試行することをおすすめします。 DocumentClientを初期化するときは、ConnectionPolicy.RetryOptions.MaxRetryAttemptsOnThrottle = 0を設定して、スロットルからの変化を排除します。 –

+0

また、コレクションの内容を[email protected]に共有することができれば、デバッグ/分析して調査結果をSOに返すことができます。 –

答えて

0

提供された情報に基づいて、おそらく収集のスループットに達し、レート制限を実行しています。レート制限が適用されると、SDKは自動的に再試行されるため、小さなペイロード(特にSELECT c._ts)のリクエストでは、これをより長い待ち時間とみなします。

コレクションのプロビジョニングされたスループットを増加させることで、予測可能な1桁のミリ秒の遅延を得ることができます。 [email protected]でエンドポイントの詳細をAzure DocumentDBに電子メールで送信することで、決定的な答えが得られます。