Видеть и очищать кеши / буферы Postgres? - PullRequest
69 голосов
/ 01 августа 2009

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

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


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

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

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

Ответы [ 9 ]

49 голосов
/ 03 августа 2009

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

Также можно посмотреть на кеш операционной системы на некоторых системах, см. pg_osmem.py для одного несколько грубого примера.

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

19 голосов
/ 01 августа 2009

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

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

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

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

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

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

11 голосов
/ 19 сентября 2015

Ответ Грега Смита о 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 секунд.

6 голосов
/ 03 апреля 2017

Да, возможно очистить оба кеша postgres совместно используемых буферов И кеш ОС. Ниже приведено решение для Windows ... другие уже дали решение linux.

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

Чтобы очистить кэш ОС, используемый Postgres, после остановки службы используйте превосходную RamMap (https://technet.microsoft.com/en-us/sysinternals/rammap), из превосходного Sysinternals Suite). Как только вы запустите RamMap, просто нажмите «Очистить» -> «Очистить резервный список» в главном меню.

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

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

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

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

6 голосов
/ 01 августа 2009

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

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

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

5 голосов
/ 29 июля 2016

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

5 голосов
/ 22 марта 2016

это мой ярлык

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;
5 голосов
/ 31 июля 2014

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

psql: /cygdrive/e/test_insertion.sql: 9: ОШИБКА: тип параметра 53 (t_stat_gardien) не соответствует этому при подготовке плана (T_stat_avant)

Я искал текущий план и нашел это:

ПЛАН ОТКЛЮЧЕНИЯ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...