Побачити та очистити кеші / буфери Postgres?


89

Іноді я запускаю запит Postgres, який займає 30 секунд. Потім я одразу запускаю той самий запит, і це займає 2 секунди. Здається, Postgres має якесь кешування. Чи можу я якось побачити, що зберігає цей кеш? Чи можу я змусити очистити всі кеші для цілей налаштування?

Примітка: В основному я шукаю версію postgres наступної команди SQL Server:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Але я також хотів би знати, як побачити, що насправді міститься в цьому буфері.

Дякую за будь-яку допомогу.

Відповіді:


59

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

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

Неможливо легко очистити кеші. У Linux ви можете зупинити сервер баз даних і скористатися функцією drop_caches для очищення кешу ОС; обов’язково прислухайтеся до попередження, щоб спочатку запустити синхронізацію.


29
Чи можна просто обійти кешування протягом одного сеансу? Нам часто потрібно перевіряти продуктивність різних запитів, і це кешування дуже ускладнює оцінку того, чи один метод кращий за інший (за винятком порівняння кешованої продуктивності!)
EvilPuppetMaster

7
Неможливо обійти або очистити кеш бази даних. Все, що ви можете зробити, щоб це очистити - це перезапустити сервер.
Greg Smith

2
Чи можна уявити, що це могло б стати можливим, наприклад, у майбутньому розвитку? Або це просто те, що з існуючими системами (PG та Linux) буде неможливим, якщо спробувати?
Куберхаун

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)

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 box:

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 postgresql зупинка; echo 1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails

@rusllonrails Це буде працювати, лише якщо служба названа postgresql, що може бути не так.
jpmc26,

Я думаю, це syncслід робити після зупинки сервера, безпосередньо перед тим drop_caches, як Postgres може написати щось під час зупинки знову.
greatvovan

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;

5

Існує pg_buffercacheмодуль для пошуку shared_buffersкешу. І в якийсь момент мені потрібно було скинути кеш, щоб зробити деякі тести продуктивності `` холодного '' кешу, тому я написав розширення pg_dropcache, яке робить саме це. Будь ласка, перевірте це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.