См. и очистите кэши/буферы Postgres?


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

Примечание: я в основном ищу версию postgres следующей команды SQL Server:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

но я также хотел бы знать, как можно увидеть, что на самом деле содержится в этом буфер.

Спасибо за любую помощь.

9 62

9 ответов:

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

Я не видел никаких команд для очистки кэшей в PostgreSQL. То, что вы видите, скорее всего, просто обычный индекс и кэш данных, считываемые с диска и хранящиеся в памяти. как postgresql, так и кэши в ОС. Чтобы избавиться от всего этого, единственный способ я знаю:

Что вы должны сделать, это:

  1. завершение работы сервера баз данных (pg_ctl, sudo service postgresql stop, так далее.)
  2. echo 3 > /proc / sys/vm/drop_caches Это очистит файл/блок ОС Кэш - очень важно, хотя я не знаю, как это сделать на других ОС.
  3. запустите сервер баз данных

Я использую эту команду на моем linux box:

sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start

Он полностью избавляется от кэша.

ответ Грега Смита о drop_caches был очень полезен. Я счел необходимым остановить и запустить службу postgresql, в дополнение к удалению кэшей. Вот скрипт, который делает трюк. (Моя среда Ubuntu 14.04 и PostgreSQL 9.3.)

#!/usr/bin/sudo bash

service postgresql stop
sync
echo 3 > /proc/sys/vm/drop_caches
service postgresql start

Я тестировал с запросом, который занял 19 секунд в первый раз и менее 2 секунд при последующих попытках. После запуска этого скрипта запрос снова занял 19 секунд.

да, postgresql, безусловно, имеет кэширование. Размер контролируется настройкой shared_buffers. Кроме того, есть, как упоминалось в предыдущем ответе, кэш файлов ОС, который также используется.

Если вы хотите посмотреть, что находится в кэше, есть модуль contrib под названием pg_buffercache доступно (в contrib/ в исходном дереве, в contrib RPM или везде, где это подходит для того, как вы его установили). Как его использовать указано в стандарте Документации PostgreSQL.

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

У меня была эта ошибка.

psql:/cygdrive/e / test_insertion.sql: 9: ошибка: тип параметра 53 (t_stat_gardien) не соответствует этому при подготовке плана (t_stat_avant)

Я искал промывку текущего плана и нашел это:

ОТКАЗАТЬСЯ ОТ ПЛАНА

У меня было это между моими вставками, и это решает мою проблему.

Это мой ярлык

echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start;

здесь pg_buffercache модуль для изучения shared_buffers кэш. И в какой-то момент мне нужно было удалить кэш, чтобы сделать некоторые тесты производительности на "холодном" кэше, поэтому я написал pg_dropcache расширение, которое делает именно это. Пожалуйста, проверьте это.

Да, это возможно, чтобы очистить и общий буфер данных кэш и кэш ОС. Решение ниже для Windows... другие уже дали решение на базе Linux.

Как многие уже говорили, чтобы очистить общие буферы, вы можете просто перезапустить Postgres (нет необходимости перезагружать сервер). Но просто это не очистит кэш ОС.

очистить кэш операционной системы используется Postgres, и после остановки службы, используйте отличном RamMap (https://technet.microsoft.com/en-us/sysinternals/rammap), из сюиты excelent Sysinternals. После выполнения RamMap, просто нажмите кнопку "пустой" - >" пустой список ожидания " в главном меню.

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

вы также можете выполнить RamMap без закрытия Postgres и, вероятно, получите результаты" без кэша", которые вы хотите, так как, как уже говорили люди, общие буферы обычно дают мало влияния по сравнению с кэшем ОС. Но для надежного теста я бы предпочел остановить postgres, как и все, прежде чем очистить кэш ОС, чтобы убедиться.

Примечание: AFAIK, я не рекомендую очищать другие вещи, кроме "резервного списка" при использовании RamMap, потому что другие данные каким-то образом используются, и вы можете потенциально вызвать проблемы/потерять данные, если вы это сделаете. Помните, что вы очищаете память не только используемые файлы postgres, но и любые другие приложения и ОС также.

С Уважением, Тьяго Л.