RavenDB - самая быстрая производительность вставки - что такое тест? - PullRequest
5 голосов
/ 03 апреля 2012

Я работаю над прототипом, используя RavenDB, для моей компании, чтобы оценить. У нас будет много потоков, вставляющих тысячи строк каждые несколько секунд, и много потоков, читающих одновременно. Я провел первый простой тест на вставку, и прежде чем идти дальше, я хочу убедиться, что я использую рекомендованный способ получить наилучшую производительность для вставок RavenDB.

Я считаю, что есть опция массовой вставки. Я еще не исследовал это, поскольку я не уверен, что это необходимо. Я использую .NET API, и мой код выглядит следующим образом:

Debug.WriteLine("Number of Marker objects: {0}", markerList.Count);

StopwatchLogger.ExecuteAndLogPerformance(() =>
{
  IDocumentSession ravenSession = GetRavenSession();
  markerList.ForEach(marker => ravenSession.Store(marker));
  ravenSession.SaveChanges();
}, "Save Marker data in RavenDB");

StopwatchLogger просто вызывает действие, помещая вокруг него секундомер:

internal static void ExecuteAndLogPerformance(Action action, string descriptionOfAction)
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    action();

    stopwatch.Stop();

    Debug.WriteLine("{0} -- Processing time: {1} ms", descriptionOfAction, stopwatch.ElapsedMilliseconds);
}

Вот результат нескольких прогонов. Обратите внимание, я пишу в локальный экземпляр RavenDB (сборка 701). Я знаю, что в сети производительность будет хуже, но я сначала тестирую локально.

Один прогон:
Количество объектов Маркер: 671
Сохранение данных маркера в RavenDB - время обработки: 1308 мс

Еще один прогон:
Количество объектов Маркер: 670
Сохранение данных маркера в RavenDB - время обработки: 1266 мс

Еще один прогон:
Количество объектов Маркер: 667
Сохранение данных маркера в RavenDB - время обработки: 625 мс

Еще один прогон:
Количество объектов Маркер: 639
Сохранение данных маркера в RavenDB - время обработки: 639 мс

Ха. 639 объектов за 639 мс. Каковы шансы на это? Во всяком случае, это одна вставка в миллисекунду, что будет 1000 каждую секунду.

Объект / документ Marker не имеет к нему особого отношения. Вот пример того, который уже был сохранен:

{
  "ID": 14740009,
  "SubID": "120403041588",
  "ReadTime": "2012-04-03T13:51:45.0000000",
  "CdsLotOpside": "163325",
  "CdsLotBackside": "163325",
  "CdteLotOpside": "167762",
  "CdteLotBackside": "167762",
  "EquipmentID": "VA_B"
}

Это ожидаемая производительность?

Есть ли лучший способ (лучшая практика) для вставки для увеличения скорости?

Есть ли где-нибудь доступные эталонные тесты, на которые я могу ориентироваться?

1 Ответ

6 голосов
/ 03 апреля 2012

Во-первых, я бы предпочел убедиться, что количество сохраняемых вами элементов в одной партии не слишком велико.Не существует жестких ограничений, однако это снижает производительность и, в конечном итоге, приводит к падению, если размер транзакции становится слишком большим.Использование значения, такого как 1024 элемента, безопасно, но оно действительно зависит от размера ваших документов.

1000 документов в секунду намного меньше, чем число, которое вы фактически можете получить с помощью одного экземпляра RavenDB.Вы должны делать вставки параллельно, и вы можете сделать некоторую настройку с параметром конфигурации.Например, вы можете увеличить значения, определенные настройками, начиная с Raven / Esent /.Также хорошей идеей (как в sql server) является размещение журналов и индексов на разных жестких дисках.В зависимости от конкретного сценария вы также можете временно отключить индексирование во время вставок.

Однако в большинстве случаев вы не хотите об этом беспокоиться.Если вам нужна действительно высокая производительность вставки, вы можете использовать несколько защищенных экземпляров и теоретически получать неограниченное количество вставок в секунду (просто добавьте больше экземпляров).

...