BerkeleyDB Concurrency

  • Какой оптимальный уровень параллелизма может разумно поддерживать реализация C++ BerkeleyDB?
  • Сколько потоков я могу отбросить на БД, прежде чем пропускная способность начнет страдать из-за конфликта ресурсов?

Я прочитал руководство и знаю, как установить количество блокировок, блокировок, размер страницы базы данных и т. Д., Но мне просто хотелось бы получить совет от кого-то, кто имеет реальный опыт работы с параллелизмом BDB.

Мое приложение довольно простое, я буду делать записи о размерах около 1 КБ каждая. Нет курсоров, нет удаления.

5 ответов

Это зависит от того, какое приложение вы создаете. Создайте репрезентативный сценарий тестирования и начните отбивать. Тогда вы будете знать окончательный ответ.

Помимо вашего варианта использования, это также зависит от процессора, памяти, внешней шины, операционной системы, настроек кэша и так далее.

Серьезно, просто проверь свой сценарий.

Если вам нужны цифры (это может на самом деле ничего не значить в вашем сценарии):

Я полностью согласен с точкой зрения Даана: создайте тестовую программу и убедитесь, что способ, которым она обращается к данным, максимально точно имитирует шаблоны, которые вы ожидаете от своего приложения. Это очень важно для BDB, потому что разные шаблоны доступа дают очень разную пропускную способность.

Помимо этого, это общие факторы, которые, как я обнаружил, имеют большое влияние на пропускную способность:

  1. Метод доступа (который в вашем случае, я думаю, BTREE).

  2. Уровень постоянства, с которым вы настроили DBD (например, в моем случае флаг среды 'DB_TXN_WRITE_NOSYNC' улучшил производительность записи на порядок, но это ухудшает постоянство)

  3. Рабочий набор помещается в кеш?

  4. Количество операций чтения против Пишет.

  5. Насколько распространен ваш доступ (помните, что BTREE имеет блокировку на уровне страниц - поэтому доступ к различным страницам с разными потоками является большим преимуществом).

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

  7. Аппаратное обеспечение (диск и память для кеша).

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

Разве это не зависит от аппаратного обеспечения, а также от количества потоков и прочего?

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

Как я понимаю, Samba создала tdb, чтобы разрешить "несколько одновременных записей" для любого конкретного файла базы данных. Поэтому, если в вашей рабочей нагрузке есть несколько авторов, ваша производительность может быть плохой (например, проект Samba решил написать свою собственную систему, очевидно, потому что он не был доволен производительностью Berkeley DB в этом случае).

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

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

Были скользящие средние и все виды метрик, но урок на вынос был: просто адаптируйтесь к тому, как все работает в данный момент. Вы никогда не знаете, когда администраторы базы данных улучшат производительность, или оборудование будет обновлено, или, возможно, появится другой процесс для загрузки системы во время работы. Так что адаптируйся.

Да, и еще одна вещь: избегайте переключений процессов, если можете - группируйте вещи.


О, я должен прояснить это: все это произошло во время выполнения, а не во время разработки.

Другие вопросы по тегам