Видеть и очищать кеши / буферы Postgres?

89

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

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


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

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

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

Пользователь1
источник

Ответы:

59

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

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

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

Грег Смит
источник
29
Можно ли просто обойтись без кеширования за один сеанс? Нам часто нужно тестировать производительность различных запросов, и это кеширование очень затрудняет оценку того, лучше ли один метод, чем другой (кроме сравнения производительности кеширования!)
EvilPuppetMaster
7
Невозможно обойти или очистить кеш базы данных. Все, что вы можете сделать, чтобы очистить его, - это перезапустить сервер.
Грег Смит
2
Возможно ли, чтобы это стало возможным, например, в будущем? Или это просто то, что с текущими системами (PG и Linux) будет невозможно, если бы кто-то попытался?
Kuberchaun
9
При использовании управляемой установки PostgreSQL, такой как Amazon RDS, у вас нет доступа к ОС, и очистка кешей ОС для целей тестирования может быть очень сложной, поэтому эта функция была бы очень полезной в PostgreSQL.
Самули Пахаоджа
4
Не могу воспроизвести медленный запрос, это проблема, как я могу быть уверен, что мой запрос выполняется после настройки? Перезапуск сервера - это не вариант. Я тестирую запрос в prod, потому что только prod имеет параллелизм, блокировки и записи, достаточные для воспроизведения проблемы,
deFreitas
21

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

Что вам следует сделать:

  1. Завершение работы сервера базы данных (pg_ctl, sudo service postgresql stop, sudo systemctl stop postgresqlи т.д.)
  2. echo 3 > /proc/sys/vm/drop_caches Это очистит кеши файлов / блоков ОС - это очень важно, хотя я не знаю, как это сделать в других ОС. (В случае отказа в разрешении попробуйте, sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"как в этом вопросе )
  3. Запустите сервер базы данных (например sudo service postgresql start, sudo systemctl start postgresql)
Leeeroy
источник
1
Подумал, что было бы полезно отметить: если каталог данных Postgres не находится на том же томе, на котором смонтирован '/', вам может потребоваться размонтировать до / после операции, описанной выше (не уверен, что, на самом деле). Кроме того (может быть, немного вуду) попробуйте запустить «синхронизацию» до и после этих шагов.
выделен
18

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

Стив Сапорта
источник
15

Я использую эту команду в своем Linux-окне:

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

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

Майк Старов
источник
2
Если версия Postgresql отличается от 9.0: sync; sudo service postgresql stop; эхо 1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails
@rusllonrails Это будет работать, только если служба названа postgresql, что может быть не так.
jpmc26
Я думаю, это syncдолжно быть сделано после остановки сервера, непосредственно перед тем drop_caches, как Postgres может снова что-то написать во время процесса остановки.
greatvovan 04
8

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

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

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

Магнус Хагандер
источник
7

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

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

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

ПЛАН ОТКАЗА

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

Люк М
источник
2
План
отмены
1
Правильный синтаксис DISCARD PLANS;. И, как говорится в документации: «DISCARD освобождает внутренние ресурсы, связанные с сеансом базы данных ».
EAmez
6

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

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

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

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

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

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

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

Тьяго Линьярес де Оливейра
источник
Рад, что это помогло;)
Тьяго Линьярес де Оливейра
5

это мой ярлык

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;
Wutzebaer
источник
5

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

Ильдар Мусин
источник