Подтвердить что ты не робот

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

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

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


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Ответ Грега Смита о drop_caches был очень полезным. Я счел необходимым остановить и запустить службу postgresql, в дополнение к отбрасыванию кешей. Здесь находится оболочка script, которая делает трюк. (Моя среда - 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 секунд при последующих попытках. После запуска этого script запрос снова занял 19 секунд.

Ответ 5

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

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

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

Ответ 6

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

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

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

ОТКЛЮЧИТЬ ПЛАНЫ

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

Ответ 7

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

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

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

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

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

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

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

Ответ 8

это мой ярлык

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;

Ответ 9

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