2010-09-29 3 views
6

Я только начал играть с Berkeley DB несколько дней назад, поэтому я пытаюсь выяснить, есть ли что-то, чего я не хватал, когда дело доходит до хранения данных как можно быстрее.Оптимизация производительности в Berkeley DB

Вот некоторая информация о данных: - он приходит в 512 байт куски - ломти приходят, чтобы - ломти будут удалены в порядке их поступления - если я потерять некоторые данные от конца из-за сбоя питания, это нормально до тех пор, пока весь db не сломался.

После прочтения кучки документации, похоже, что Queue db было именно тем, что я хотел.

Однако, попробовав некоторый тестовый код, мои самые быстрые результаты были примерно 1 Мбайт в секунду, просто перебирая DB-> put с установленным DB_APPEND. Я также пытался использовать транзакции и навальные вкладыши, но оба эти замедлились, поэтому я не проводил их много времени. Я вставлял новый db, созданный на чипе NANDFlash на моем доске объявлений Freescale i.MX35.

Поскольку мы стремимся получить скорость записи не менее 2 Мбайт в секунду, мне было интересно, есть ли что-то, что я пропустил, что может улучшить мои скорости, поскольку я знаю, что мое оборудование может писать быстрее, чем это.

ответ

8

Попробуйте положить это в вашем DB_CONFIG:

set_flags DB_TXN_WRITE_NOSYNC 
set_flags DB_TXN_NOSYNC 

Из моего опыта, это увеличение производительности записи много.


DB_TXN_NOSYNC Если установлено, Berkeley DB не будет писать или синхронно промывать полено транзакции или подготовиться. Это означает, что транзакции демонстрируют свойства ACI (атомарность, согласованность и изоляцию), но не D (долговечность); то есть целостность базы данных будет сохранена, но если приложение или система выйдет из строя, возможно, некоторое количество последних совершённых транзакций может быть отменено во время восстановления. Количество транзакций, подверженных риску, определяется тем, сколько обновлений журнала может вписаться в буфер журнала, как часто операционная система сбрасывает грязные буферы на диск и часто проверяет журнал. Вызов DB_ENV-> set_flags с флагом DB_TXN_NOSYNC влияет только на указанный дескриптор DB_ENV (и любые другие дескрипторы Berkeley DB, открытые в рамках этого дескриптора). Для последовательного поведения в среде все дескрипторы DB_ENV, открытые в среде, должны либо установить флаг DB_TXN_NOSYNC, либо флаг должен быть указан в конфигурационном файле DB_CONFIG.

Флаг DB_TXN_NOSYNC может использоваться для настройки Berkeley DB в любое время в течение срока действия приложения.


DB_TXN_WRITE_NOSYNC Если установлено, Berkeley DB будет писать, но не будет синхронно вровень, журнал на транзакции или готовить. Это означает, что транзакции демонстрируют свойства ACI (атомарность, согласованность и изоляцию), но не D (долговечность); то есть целостность базы данных будет сохранена, но если система выходит из строя, возможно, некоторое количество последних совершенных транзакций может быть отменено во время восстановления. Количество транзакций, подверженных риску, определяется тем, как часто система сбрасывает грязные буферы на диск и как часто регистрируется журнал. Вызов DB_ENV-> set_flags с флагом DB_TXN_WRITE_NOSYNC влияет только на указанный дескриптор DB_ENV (и любые другие дескрипторы Berkeley DB, открытые в рамках этого дескриптора).Для последовательного поведения в среде все дескрипторы DB_ENV, открытые в среде, должны либо установить флаг DB_TXN_WRITE_NOSYNC, либо флаг должен быть указан в файле конфигурации DB_CONFIG.

Флаг DB_TXN_WRITE_NOSYNC может использоваться для настройки Berkeley DB в любое время в течение всего срока службы приложения.

См. http://www.mathematik.uni-ulm.de/help/BerkeleyDB/api_c/env_set_flags.html для получения более подробной информации.

+0

Спасибо за комментарий. Тем не менее, я обнаружил, что просто включение среды приводит к слишком большому снижению производительности по сравнению с тем, что она не используется. Я думаю, что это связано с WAL, поэтому эти флаги помогут мне, но даже без окружающей среды все происходит слишком медленно. – jjfine

+0

@jjfine: Я считаю, что среда используется неявно с анонимными (автоматическими фиксациями) транзакциями, если вы не делаете этого явно. Поэтому не использовать среду не поможет. –

+0

@ VladLazarenko, поэтому, если я установил один из этих двух флагов, когда я закрою berkeley db, кеш будет сброшен на диск? – Alcott

1

Я предлагаю вам использовать транзакции/хранилище данных TDS, если, как вы упоминаете, вы не можете воссоздать базу данных (т. Е. Это не только локальный кеш), если она повреждена. Если вы не хотите потерять несколько элементов в случае сбоя при сбое/отключении питания, то DB_TXN_WRITE_NOSYNC улучшит производительность TDS, ваша база данных будет по-прежнему неотъемлемой и восстанавливаемой. Если вы храните с помощью BTREE и числового индекса (если у вас нет натурального ключа), и следите за проблемами с эндиантами, чтобы вы получили хорошую локальность и высокую загрузку страниц, тогда вы сможете получить более 2000 вложений, особенно на SSD, особенно если вы используете DbMultileKeyDataBuilder для выполнения объемных вставок.

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