2015-10-12 5 views
3

При выполнении запросов DocumentDB с кода C# на моем локальном компьютере простой запрос DocumentDB занимает примерно 0,5 секунды. Другой пример: получение ссылки на коллекцию документов занимает в среднем около 0,7 секунды. Этого можно ожидать? Ниже мой код для проверки наличия коллекции, это довольно прямолинейно - но есть ли способ улучшить плохую производительность?Проблемы с производительностью DocumentDB

// Create a new instance of the DocumentClient 
var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey); 

// Get the database with the id=FamilyRegistry 
var database = client.CreateDatabaseQuery().Where(db => db.Id == "FamilyRegistry").AsEnumerable().FirstOrDefault(); 

var stopWatch = new Stopwatch(); 
stopWatch.Start(); 

// Get the document collection with the id=FamilyCollection 
var documentCollection = client.CreateDocumentCollectionQuery("dbs/" 
    + database.Id).Where(c => c.Id == "FamilyCollection").AsEnumerable().FirstOrDefault(); 

stopWatch.Stop(); 

// Get the elapsed time as a TimeSpan value. 
var ts = stopWatch.Elapsed; 

// Format and display the TimeSpan value. 
var elapsedTime = String.Format("{0:00} seconds, {1:00} milliseconds", 
    ts.Seconds, 
    ts.Milliseconds); 

Console.WriteLine("Time taken to get a document collection: " + elapsedTime); 
Console.ReadKey(); 

Средний выход на локальном компьютере:

Time taken to get a document collection: 0 seconds, 752 milliseconds 

В другой части моего кода я делаю 20 небольшого обновление документов, которые около 400 байт каждого размера JSON и по-прежнему занимают 12 секунд Всего. Я работаю только из своей среды разработки, но ожидал лучшей производительности.

+1

Вы пытались запустить это в том же центре обработки данных, что и ваш DocumentDB? Я испытал большую задержку (~ 250 мс) при пересечении границы центра обработки данных с операциями DocumentDB. Однако, если я вызываю его из экземпляра, работающего в одном и том же центре данных Azure, я получаю небольшую задержку (~ 10 мс). –

+0

@LarryMaccherone Нет, я этого не делал, я только что запустил свой код из моей локальной среды разработки. –

ответ

7

Короче говоря, это можно сделать от конца до конца в ~ 9 миллисекунд с DocumentDB. Я рассмотрю необходимые изменения и почему/как они влияют на результаты ниже.

Самый первый запрос всегда занимает больше времени в DocumentDB, поскольку он выполняет некоторую работу по настройке (выбор физических адресов разделов DocumentDB). Следующие запросы пары занимают немного больше времени, чтобы согреть пулы соединений. Последующие запросы будут такими же быстрыми, как ваша сеть (латентность чтения в DocumentDB очень низкая из-за хранения SSD).

Например, если вы измените код выше, чтобы измерить, например, 10 чтений, а не только первого, как показано ниже:

using (DocumentClient client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) 
{ 
    long totalRequests = 10; 

    var database = client.CreateDatabaseQuery().Where(db => db.Id == "FamilyRegistry").AsEnumerable().FirstOrDefault(); 

    Stopwatch watch = new Stopwatch(); 
    for (int i = 0; i < totalRequests; i++) 
    { 
     watch.Start(); 
     var documentCollection = client.CreateDocumentCollectionQuery("dbs/"+ database.Id) 
      .Where(c => c.Id == "FamilyCollection").AsEnumerable().FirstOrDefault(); 

     Console.WriteLine("Finished read {0} in {1}ms ", i, watch.ElapsedMilliseconds); 
     watch.Reset(); 
    } 
} 

Console.ReadKey(); 

я получаю следующие результаты работы с моего рабочего стола в Редмонде против Azure West US, то есть около 50 миллисекунд. Эти цифры могут варьироваться в зависимости от подключения к сети и удаленности Вашего клиента от Azure DC хостинг DocumentDB:

Finished read 0 in 217ms 
Finished read 1 in 46ms 
Finished read 2 in 51ms 
Finished read 3 in 47ms 
Finished read 4 in 46ms 
Finished read 5 in 93ms 
Finished read 6 in 48ms 
Finished read 7 in 45ms 
Finished read 8 in 45ms 
Finished read 9 in 51ms 

Далее я переключаюсь Direct/подключения TCP со значением по умолчанию шлюза для улучшения задержки от двух прыжков один, то есть изменить код инициализации:

using (DocumentClient client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey, new ConnectionPolicy { ConnectionMode = ConnectionMode.Direct, ConnectionProtocol = Protocol.Tcp })) 

теперь операции, чтобы найти коллекцию по ID завершается в течение 23 миллисекунд:

Finished read 0 in 197ms 
Finished read 1 in 117ms 
Finished read 2 in 23ms 
Finished read 3 in 23ms 
Finished read 4 in 25ms 
Finished read 5 in 23ms 
Finished read 6 in 31ms 
Finished read 7 in 23ms 
Finished read 8 in 23ms 
Finished read 9 in 23ms 

Как насчет того, когда вы запускаете те же результаты от Azure VM или Worker Role, которые также работают в одном и том же Azure DC? Эта же операция завершается примерно 9 миллисекунд!

Finished read 0 in 140ms 
Finished read 1 in 10ms 
Finished read 2 in 8ms 
Finished read 3 in 9ms 
Finished read 4 in 9ms 
Finished read 5 in 9ms 
Finished read 6 in 9ms 
Finished read 7 in 9ms 
Finished read 8 in 10ms 
Finished read 9 in 8ms 
Finished read 9 in 9ms 

Итак, подведем итоги:

  • Для измерения производительности, пожалуйста, позвольте несколько образцов измерения для учета запуска/инициализации клиента DocumentDB.
  • Пожалуйста, используйте подключение TCP/Direct для минимальной задержки.
  • Если возможно, запустите в пределах той же области Azure.
  • Если вы выполните следующие шаги, вы можете получить отличную производительность, и вы сможете получить лучшие показатели производительности с помощью DocumentDB.
+0

Я получаю 10 раз время, которое вы получаете, но потом снова я звоню в службу DocumentDB из Европы. Тем не менее, я не получаю такую ​​плохую производительность при вызове Лазурного хранилища таблиц по какой-то причине. Я добавил PasteBin с моими результатами здесь http://pastebin.com/3u1VpgRB –

+0

@ Aravind, я не вижу места рядом с вашей производительностью (~ 250 мс против вашего 23 мс) при работе на моей работе даже после инициализации и потепления. Я не попадаю из Северной Каролины в американский центр данных США. Еще одно отличие для меня в том, что я использую node.js, который, как я понимаю, не использует TCP/Direct, но я также задавался вопросом о вашем упоминании о «двух прыжках». Это относится к использованию node.js? Какова цель второго прыжка? CORS? Возможно ли, что в качестве сотрудника Microsoft ваши эксперименты ускорили подключение к вашему центру обработки данных? Опять же, это может быть просто мое плохое подключение к работе –

+0

@IngeHenriksen, можете ли вы отправить мне трассировку WireShark? В каком регионе находится ваша учетная запись DocumentDB и где находится ваш клиент? DocumentDB доступен в регионах Западной Европы и Северной Европы в Лазуре. А для контраста, где находится учетная запись Azure Tables? –

Смежные вопросы