Мне нужно хранилище ключей на основе диска, которое может поддерживать высокую производительность записи и чтения для больших наборов данных. Высокий заказ, я знаю.
Я пробую библиотеку C BerkeleyDB (5.1.25) из java и вижу серьезные проблемы с производительностью.
В течение короткого времени я получаю твердые 14K документов / с, но как только я достигаю нескольких сотен тысяч документов, производительность падает как скала, затем она восстанавливается на некоторое время, затем снова падает и т. Д. Это происходит чаще и более часто, вплоть до того момента, когда большую часть времени я не могу получить более 60 документов в секунду с несколькими изолированными пиками 12 тысяч документов в секунду после 10 миллионов документов. Мой тип базы данных - HASH, но я также пробовал BTREE, и он такой же.
Я пытался использовать пул из 10 дБ и хэшировать документы между ними, чтобы сгладить падение производительности; это увеличило пропускную способность записи до 50 Кбайт / с, но не помогло с падением производительности: все 10 дБ одновременно замедлились до сканирования.
Я предполагаю, что файлы реорганизуются, и я попытался найти параметр конфигурации, который влияет на то, когда происходит эта реорганизация, поэтому каждая из объединенных баз данных будет реорганизована в разное время, но я не смог найти ничего, что сработало , Я пробовал разные размеры кеша, зарезервировав пространство с помощью опции конфигурации setHashNumElements, чтобы не тратить время на увеличение файла, но каждый твик делал его намного хуже.
Я собираюсь отказаться от berkeleydb и попробовать гораздо более сложные решения, такие как cassandra, но я хочу убедиться, что я не делаю что-то не так в berkeleydb, прежде чем списывать это.
Кто-нибудь здесь с опытом достижения стабильной производительности записи с помощью berkeleydb?
Редактировать 1 :
Я уже пробовал несколько вещей:
- Сокращение записи до 500 / с (меньше, чем в среднем я получил после записи 30 миллионов документов за 15 часов, что указывает на то, что аппаратное обеспечение способно записывать 550 документов / с). Не сработало: после написания определенного количества документов производительность падает независимо от этого.
- Запись входящих элементов в очередь. У этого есть две проблемы: A) Это побеждает цель освобождения барана. Б) Очередь в конечном итоге блокируется, потому что периоды, в течение которых BerkeleyDB останавливается, становятся длиннее и чаще.
Другими словами, даже если я ограничу поступающие данные, чтобы остаться ниже аппаратных возможностей, и использую оперативную память для хранения элементов, в то время как BerkeleyDB требуется некоторое время, чтобы адаптироваться к росту, поскольку это время становится все длиннее, производительность приближается к 0.
Это удивляет меня, потому что я видел утверждения, что он может обрабатывать терабайты данных, но мои тесты показывают иначе. Я все еще надеюсь, что я делаю что-то не так ...
Редактировать 2 :
Поразмыслив над этим, и с учетом слов Питера я понимаю, что по мере увеличения файла пакет записей будет распространяться дальше друг от друга, и вероятность того, что они попадут в один и тот же дисковый цилиндр, пока не достигнет поиск / второе ограничение диска.
Но периодическая реорганизация файлов BerkeleyDB снижает производительность намного раньше, чем это, и гораздо худшим способом: он просто перестает отвечать на запросы все дольше и дольше, в то время как он перемешивает вещи. Использование более быстрых дисков или распространение файлов базы данных между различными дисками не помогает. Мне нужно найти способ обойти эти сквозные дыры.