Widzisz i czyścisz pamięci podręczne / bufory Postgres?

89

Czasami uruchamiam zapytanie Postgres, trwa to 30 sekund. Następnie natychmiast wykonuję to samo zapytanie i zajmuje to 2 sekundy. Wygląda na to, że Postgres ma jakiś rodzaj buforowania. Czy mogę jakoś sprawdzić, co trzyma ta pamięć podręczna? Czy mogę wymusić wyczyszczenie wszystkich pamięci podręcznych w celu dostrojenia?

Uwaga: zasadniczo szukam wersji postgres następującego polecenia SQL Server:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Ale chciałbym też wiedzieć, jak sprawdzić, co faktycznie jest zawarte w tym buforze.

Dzięki za wszelką pomoc.

Użytkownik1
źródło

Odpowiedzi:

59

Możesz zobaczyć, co jest w buforze bufora PostgreSQL za pomocą modułu pg_buffercache. Zrobiłem prezentację zatytułowaną „ Inside the PostgreSQL Buffer Cache ”, która wyjaśnia, co widzisz, i pokazuję bardziej skomplikowane zapytania, aby pomóc zinterpretować te informacje, które się z tym wiążą.

W niektórych systemach można również spojrzeć na pamięć podręczną systemu operacyjnego, zobacz [pg_osmem.py], aby zapoznać się z pewnym przybliżonym przykładem.

Nie ma sposobu na łatwe wyczyszczenie pamięci podręcznych. W systemie Linux można zatrzymać serwer bazy danych i użyć narzędzia drop_caches do wyczyszczenia pamięci podręcznej systemu operacyjnego; pamiętaj, aby zapoznać się z ostrzeżeniem, aby najpierw uruchomić synchronizację.

Greg Smith
źródło
29
Czy można po prostu ominąć buforowanie w ramach jednej sesji? Często musimy testować wydajność różnych zapytań, a to buforowanie bardzo utrudnia ocenę, czy jedna metoda jest lepsza od drugiej (z wyjątkiem porównania wydajności buforowanej!)
EvilPuppetMaster
7
Nie ma możliwości ominięcia lub opróżnienia pamięci podręcznej bazy danych. Wszystko, co możesz zrobić, aby to wyczyścić, to zrestartować serwer.
Greg Smith
2
Czy można sobie wyobrazić, że byłoby to możliwe, na przykład w ramach przyszłego rozwoju? A może jest to po prostu coś, co przy obecnych systemach (PG i Linux) nie będzie możliwe, jeśli ktoś spróbuje?
Kuberchaun,
9
Podczas korzystania z zarządzanej instalacji PostgreSQL, takiej jak Amazon RDS, nie ma się dostępu do systemu operacyjnego, a opróżnianie pamięci podręcznej systemu operacyjnego do celów testowych może być bardzo trudne, więc ta funkcja byłaby bardzo korzystna w PostgreSQL.
Samuli Pahaoja
4
Nie można odtworzyć wolnego zapytania, to problem, skąd mam pewność, że moje zapytanie działa po dostrojeniu? Ponowne uruchomienie serwera nie jest opcją
Testuję
21

Nie widziałem żadnych poleceń do opróżnienia pamięci podręcznych w PostgreSQL. To, co widzisz, to prawdopodobnie zwykłe indeksy i bufory danych odczytywane z dysku i przechowywane w pamięci. zarówno przez postgresql, jak i pamięci podręczne w systemie operacyjnym. Aby się tego wszystkiego pozbyć, jedyny znany mi sposób:

Co powinieneś zrobić, to:

  1. Wyłączenie serwera bazy danych (pg_ctl, sudo service postgresql stop, sudo systemctl stop postgresql, itd.)
  2. echo 3 > /proc/sys/vm/drop_caches Spowoduje to wyczyszczenie pamięci podręcznych plików / bloków systemu operacyjnego - bardzo ważne, chociaż nie wiem, jak to zrobić w innych systemach operacyjnych. (W przypadku odmowy pozwolenia, spróbuj sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"jak w tym pytaniu )
  3. Uruchomić serwer bazy danych (np sudo service postgresql start, sudo systemctl start postgresql)
Leeeroy
źródło
1
Pomyślałem, że warto zauważyć: jeśli katalog danych Postgres nie znajduje się na tym samym woluminie, na którym jest zamontowany „/”, może być konieczne odmontowanie przed / po powyższej operacji (nie wiesz, który, naprawdę). Ponadto (może trochę voodoo) spróbuj uruchomić „synchronizację” przed i po tych krokach.
marqueed
18

Odpowiedź Grega Smitha na temat drop_caches była bardzo pomocna. Uznałem za konieczne zatrzymanie i uruchomienie usługi postgresql, oprócz porzucenia pamięci podręcznych. Oto skrypt powłoki, który załatwia sprawę. (Moje środowisko to Ubuntu 14.04 i PostgreSQL 9.3.)

#!/usr/bin/sudo bash

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

Testowałem z zapytaniem, które zajęło 19 sekund za pierwszym razem i mniej niż 2 sekundy przy kolejnych próbach. Po uruchomieniu tego skryptu zapytanie ponownie zajęło 19 sekund.

Steve Saporta
źródło
15

Używam tego polecenia na moim Linuksie:

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

Całkowicie pozbywa się pamięci podręcznej.

Mike Starov
źródło
2
Jeśli wersja Postgresql jest inna niż 9.0: sync; usługa sudo postgresql stop; echo 1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails
@rusllonrails To zadziała tylko wtedy, gdy usługa zostanie nazwana postgresql, co może nie mieć miejsca.
jpmc26
Myślę, że syncpowinno to być zrobione po zatrzymaniu serwera, bezpośrednio przed drop_caches, ponieważ Postgres może ponownie coś napisać podczas zatrzymywania procesu.
greatvovan
8

Tak, postgresql z pewnością ma buforowanie. Rozmiar jest kontrolowany przez ustawienie shared_buffers . Poza tym, jak wspomniano w poprzedniej odpowiedzi, używana jest również pamięć podręczna plików systemu operacyjnego.

Jeśli chcesz sprawdzić, co jest w pamięci podręcznej, dostępny jest moduł Contrib o nazwie pg_buffercache (w pliku contrib / w drzewie źródłowym, w RPM Contrib lub gdziekolwiek jest to odpowiednie dla sposobu, w jaki go zainstalowałeś). Sposób korzystania z niego jest wymieniony w standardowej dokumentacji PostgreSQL.

Nie ma innego sposobu na wyczyszczenie pamięci podręcznej bufora niż ponowne uruchomienie serwera. Możesz usunąć pamięć podręczną systemu operacyjnego za pomocą polecenia wymienionego w drugiej odpowiedzi - pod warunkiem, że Twój system operacyjny to Linux.

Magnus Hagander
źródło
7

Miałem ten błąd.

psql: /cygdrive/e/test_insertion.sql: 9: BŁĄD: typ parametru 53 (t_stat_gardien) nie odpowiada temu podczas przygotowywania planu (t_stat_avant)

Szukałem spłukiwania obecnego planu i znalazłem to:

ODRZUĆ PLANY

Miałem to między moimi wkładkami i to rozwiązuje mój problem.

Luc M
źródło
2
Plan
odrzucenia
1
Właściwa składnia to DISCARD PLANS;. I, jak stwierdza dokumentacja: „DISCARD zwalnia wewnętrzne zasoby związane z sesją bazy danych ”.
EAmez
6

Tak, to jest możliwe, aby usunąć zarówno współdzielony cache bufory postgres'owy I cache OS. Rozwiązanie poniżej jest przeznaczone dla systemu Windows ... inni już podali rozwiązanie linux.

Jak wiele osób już powiedziało, aby wyczyścić udostępnione bufory, możesz po prostu zrestartować Postgres (nie ma potrzeby ponownego uruchamiania serwera). Ale samo zrobienie tego nie wyczyści pamięci podręcznej systemu operacyjnego.

Aby wyczyścić pamięć podręczną systemu operacyjnego używaną przez Postgres, po zatrzymaniu usługi użyj doskonałej RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ) z doskonałego pakietu Sysinternals. Po uruchomieniu RamMap, po prostu kliknij „Empty” -> „Empty Standby List” w menu głównym.

Zrestartuj Postgres, a zobaczysz, że następne zapytanie będzie cholernie wolne z powodu braku pamięci podręcznej.

Możesz również uruchomić RamMap bez zamykania Postgresa i prawdopodobnie uzyskasz pożądane wyniki „bez pamięci podręcznej”, ponieważ jak już mówiono, współdzielone bufory zwykle mają niewielki wpływ w porównaniu z pamięcią podręczną systemu operacyjnego. Ale dla wiarygodnego testu wolałbym raczej zatrzymać postgres, jak wszystko przed wyczyszczeniem pamięci podręcznej systemu operacyjnego, aby się upewnić.

Uwaga: AFAIK, nie polecam usuwania innych rzeczy poza "Listą gotowości" podczas używania RamMap, ponieważ inne dane są w jakiś sposób używane i możesz potencjalnie spowodować problemy / utratę danych, jeśli to zrobisz. Pamiętaj, że czyścisz pamięć używaną nie tylko przez pliki postgres, ale także inne aplikacje i system operacyjny.

Pozdrawiam, Thiago L.

Thiago Linhares de Oliveira
źródło
Cieszę się, że pomogło;)
Thiago Linhares de Oliveira
5

to jest mój skrót

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
źródło
5

Istnieje pg_buffercachemoduł do przeglądania shared_bufferspamięci podręcznej. W pewnym momencie musiałem porzucić pamięć podręczną, aby wykonać testy wydajności na „zimnej” pamięci podręcznej, więc napisałem rozszerzenie pg_dropcache, które robi dokładnie to. Proszę sprawdź to.

Ildar Musin
źródło