2012-03-28 3 views
2

Я выполняю некоторые задачи бенчмаркинга, используя Postgresql 9.1, работающий на Debian Linux. Я хотел бы сравнить производительность запросов, которые разделяют общую часть. Перед выполнением каждого запроса перезапустить базу данных и выполнить следующую команду:Очистка кеша для бенчмаркинга в PostgreSQL 9.1

эхо 3>/Труды/SYS/VM/drop_caches

, направленные на падение как общая память и кэш ОС. Тем не менее, я заметил, что если я запускаю ту же рабочую нагрузку на запрос с другим порядком, я получаю разные времена отклика запросов. Я подозреваю, что каким-то образом оптимизатор запросов «запоминает», как эффективно выполнять общие части запроса или повторно использовать некоторые ранее кэшированные результаты.

Есть ли у вас идеи по устранению этой проблемы? Я хотел бы получить примерно одинаковое время ответа, независимо от порядка запросов. Обратите внимание, что я разбираю вывод EXPLAIN, чтобы извлечь фактическое время работы.

ответ

1

Первое, что приходит на ум, заключается в том, что autovacuum (задача обслуживания фона в PostgreSQL: http://www.postgresql.org/docs/current/interactive/routine-vacuuming.html#AUTOVACUUM) может выполнять некоторую работу, которая повторно заполняет ваш кеш в труднодоступных для прогнозирования направлениях. Вы можете отключить его, но имейте в виду, что это может привести к раздуванию, плохим статистическим данным, приводящим к неправильному выбору плана, а также добавлению дополнительной работы в интерфейсные процессы - поэтому обычно это не рекомендуется. Еще один способ приблизиться к этому - запустить VACUUM FREEZE ANALYZE после загрузки ваших данных, перевести все в хорошо поддерживаемое состояние, остановить PostgreSQL, очистить кеш операционной системы, а затем запустить и выполнить свой тест.

Другим возможным источником проблем могут быть контрольно-пропускные пункты; вы должны убедиться, что у вас есть контрольные точки, сконфигурированные достаточно высоко, чтобы не вызывать частые контрольные точки, и вы должны учитывать настройку checkpoint_timeout в терминах, когда контрольные точки будут возникать во время теста.

Возможно также, что плата контроллера RAID или жесткий диск может быть достаточно кэшированной, чтобы не иметь значения - я не знаю, очищает ли их кеш OS, но я в этом сомневаюсь.

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

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