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.
źródło
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:
sudo service postgresql stop
,sudo systemctl stop postgresql
, itd.)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óbujsudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
jak w tym pytaniu )sudo service postgresql start
,sudo systemctl start postgresql
)źródło
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.
źródło
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.
źródło
postgresql
, co może nie mieć miejsca.sync
powinno to być zrobione po zatrzymaniu serwera, bezpośrednio przeddrop_caches
, ponieważ Postgres może ponownie coś napisać podczas zatrzymywania procesu.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.
źródło
Miałem ten błąd.
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.
źródło
DISCARD PLANS;
. I, jak stwierdza dokumentacja: „DISCARD zwalnia wewnętrzne zasoby związane z sesją bazy danych ”.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.
źródło
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;
źródło
Istnieje
pg_buffercache
moduł do przeglądaniashared_buffers
pamię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.źródło