Lihat dan hapus cache / buffer Postgres?

90

Terkadang saya menjalankan kueri Postgres, dibutuhkan waktu 30 detik. Lalu, saya langsung menjalankan query yang sama dan butuh waktu 2 detik. Tampaknya Postgres memiliki semacam cache. Dapatkah saya melihat apa yang disimpan dalam cache itu? Dapatkah saya memaksa semua cache dibersihkan untuk tujuan penyetelan?

Catatan: Saya pada dasarnya mencari versi postgres dari perintah SQL Server berikut:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Tapi saya juga ingin tahu bagaimana melihat apa yang sebenarnya terkandung dalam buffer itu.

Terima kasih atas bantuannya.

Pengguna1
sumber

Jawaban:

60

Anda dapat melihat apa yang ada di cache buffer PostgreSQL menggunakan modul pg_buffercache. Saya telah melakukan presentasi yang disebut " Di dalam Cache Buffer PostgreSQL " yang menjelaskan apa yang Anda lihat, dan saya menunjukkan beberapa pertanyaan yang lebih rumit untuk membantu menafsirkan informasi yang menyertainya.

Anda juga dapat melihat cache sistem operasi pada beberapa sistem, lihat [pg_osmem.py] untuk satu contoh kasar.

Tidak ada cara untuk menghapus cache dengan mudah. Di Linux Anda dapat menghentikan server database dan menggunakan fasilitas drop_caches untuk membersihkan cache OS; pastikan untuk mengindahkan peringatan di sana untuk menjalankan sinkronisasi terlebih dahulu.

Greg Smith
sumber
29
Apakah mungkin untuk melewati caching dalam satu sesi? Kami sering kali perlu menguji kinerja kueri yang berbeda dan caching ini membuatnya sangat sulit untuk menilai apakah satu metode lebih baik dari yang lain (kecuali saat membandingkan kinerja yang di-cache!)
EvilPuppetMaster
7
Tidak ada cara untuk melewati atau membersihkan cache database. Yang dapat Anda lakukan untuk menghapusnya adalah memulai ulang server.
Greg Smith
2
Apakah bisa dibayangkan hal ini bisa diwujudkan, misalnya dalam pembangunan di masa depan? Atau apakah ini hanya sesuatu yang dengan sistem saat ini (PG dan Linux) tidak akan mungkin jika harus dicoba?
Kuberchaun
9
Saat menggunakan penginstalan PostgreSQL terkelola seperti Amazon RDS, seseorang tidak memiliki akses ke OS, dan mengosongkan cache OS untuk tujuan pengujian bisa sangat sulit, jadi fitur ini akan sangat bermanfaat di PostgreSQL.
Samuli Pahaoja
4
Tidak dapat mereproduksi kueri yang lambat. Ini masalah, bagaimana saya bisa yakin bahwa kueri saya bekerja setelah penyetelan? Memulai ulang server bukanlah pilihan Saya menguji kueri dalam prod karena hanya prod memiliki konkurensi, kunci dan catatan yang cukup untuk mereproduksi masalah
deFreitas
22

Saya belum melihat perintah apa pun untuk membersihkan cache di PostgreSQL. Apa yang Anda lihat mungkin hanya indeks normal dan cache data yang dibaca dari disk dan disimpan di memori. oleh postgresql dan cache di OS. Untuk menyingkirkan semua itu, satu-satunya cara yang saya tahu:

Yang harus Anda lakukan adalah:

  1. Shutdown server database (pg_ctl, sudo service postgresql stop, sudo systemctl stop postgresql, dll)
  2. echo 3 > /proc/sys/vm/drop_caches Ini akan menghapus file OS / memblokir cache - sangat penting meskipun saya tidak tahu bagaimana melakukannya di OS lain. (Jika izin ditolak, coba sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"seperti dalam pertanyaan itu )
  3. Mulai server database (misalnya sudo service postgresql start, sudo systemctl start postgresql)
Leeeroy
sumber
1
Saya pikir akan sangat membantu untuk dicatat: jika direktori data Postgres tidak pada volume yang sama dengan '/' yang dipasang, Anda mungkin perlu melakukan umount sebelum / sesudah operasi di atas (tidak yakin yang mana, sungguh). Selain itu (mungkin sedikit voodoo) coba jalankan 'sinkronisasi' sebelum dan sesudah langkah-langkah tersebut.
Marqueed
18

Jawaban Greg Smith tentang drop_caches sangat membantu. Saya merasa perlu untuk berhenti dan memulai layanan postgresql, selain menjatuhkan cache. Berikut skrip shell yang melakukan triknya. (Lingkungan saya adalah Ubuntu 14.04 dan PostgreSQL 9.3.)

#!/usr/bin/sudo bash

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

Saya menguji dengan kueri yang membutuhkan waktu 19 detik untuk pertama kalinya, dan kurang dari 2 detik untuk percobaan berikutnya. Setelah menjalankan skrip ini, kueri sekali lagi membutuhkan waktu 19 detik.

Steve Saporta
sumber
15

Saya menggunakan perintah ini di kotak linux saya:

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

Ini benar-benar menghilangkan cache.

Mike Starov
sumber
2
Jika versi Postgresql bukan 9.0: sync; sudo layanan postgresql berhenti; echo 1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails
@rusllonrails Itu hanya akan bekerja jika layanan dinamai postgresql, yang mungkin tidak terjadi.
jpmc26
Saya pikir, syncharus dilakukan setelah menghentikan server, segera sebelumnya drop_caches, karena Postgres dapat menulis sesuatu selama proses penghentian lagi.
greatvovan
8

Ya, postgresql pasti memiliki caching. Ukurannya dikontrol oleh pengaturan shared_buffers . Selain itu, ada seperti yang disebutkan pada jawaban sebelumnya, cache file OS juga digunakan.

Jika Anda ingin melihat apa yang ada di cache, tersedia modul contrib bernama pg_buffercache (di contrib / di pohon sumber, di contrib RPM, atau di mana pun yang sesuai dengan cara Anda menginstalnya). Cara menggunakannya tercantum dalam dokumentasi PostgreSQL standar.

Tidak ada cara untuk membersihkan cache penyangga, selain dengan me-restart server. Anda dapat menjatuhkan cache OS dengan perintah yang disebutkan di jawaban lain - asalkan OS Anda adalah Linux.

Magnus Hagander
sumber
7

Saya mengalami kesalahan ini.

psql: /cygdrive/e/test_insertion.sql: 9: ERROR: jenis parameter 53 (t_stat_gardien) tidak cocok dengan yang digunakan saat menyiapkan rencana (t_stat_avant)

Saya sedang mencari pembilasan rencana saat ini dan menemukan ini:

BUANG RENCANA

Saya memiliki ini di antara sisipan saya dan itu memecahkan masalah saya.

Luc M
sumber
2
Buang paket tidak diperbaiki untuk saya, kueri tampaknya disimpan dalam cache
deFreitas
1
Sintaks yang benar adalah DISCARD PLANS;. Dan, seperti yang dinyatakan dalam dokumentasi: "Buang rilis sumber daya internal yang terkait dengan sesi database ".
EAmez
6

Ya, adalah mungkin untuk menghapus cache postgres buffer bersama DAN cache OS. Solusi di bawah ini untuk Windows ... yang lain telah memberikan solusi linux.

Seperti yang sudah dikatakan banyak orang, untuk menghapus buffer bersama, Anda dapat memulai ulang Postgres (tidak perlu memulai ulang server). Tetapi hanya melakukan ini tidak akan menghapus cache OS.

Untuk menghapus cache OS yang digunakan oleh Postgres, setelah menghentikan layanan, gunakan RamMap yang sangat baik ( https://technet.microsoft.com/en-us/sysinternals/rammap ), dari Sysinternals Suite yang sangat baik. Setelah Anda menjalankan RamMap, cukup klik "Empty" -> "Empty Standby List" di menu utama.

Mulai ulang Postgres dan Anda akan melihat sekarang kueri Anda berikutnya akan sangat lambat karena tidak ada cache sama sekali.

Anda juga dapat mengeksekusi RamMap tanpa menutup Postgres, dan mungkin akan mendapatkan hasil "tanpa cache" yang Anda inginkan, karena seperti yang telah dikatakan orang, buffer bersama biasanya memberikan sedikit pengaruh dibandingkan dengan cache OS. Tetapi untuk pengujian yang andal, saya lebih suka menghentikan postgres karena semuanya sebelum membersihkan cache OS untuk memastikan.

Catatan: AFAIK, saya tidak menyarankan menghapus hal-hal lain selain "Daftar siaga" saat menggunakan RamMap, karena data lain entah bagaimana sedang digunakan, dan Anda berpotensi menyebabkan masalah / kehilangan data jika Anda melakukannya. Ingatlah bahwa Anda membersihkan memori tidak hanya digunakan oleh file postgres, tetapi juga aplikasi dan OS lain.

Hormat kami, Thiago L.

Thiago Linhares de Oliveira
sumber
Senang bisa membantu;)
Thiago Linhares de Oliveira
5

ini jalan pintas saya

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.dll
sumber
5

Ada pg_buffercachemodul untuk melihat shared_bufferscache. Dan pada titik tertentu saya perlu melepaskan cache untuk melakukan beberapa tes kinerja pada cache 'dingin' jadi saya menulis ekstensi pg_dropcache yang melakukan hal ini. Silakan periksa.

Ildar Musin
sumber
0

Jika Anda memiliki database pengujian khusus, Anda dapat menyetel parameter: shared buffer ke 16. Itu akan menonaktifkan cache untuk semua kueri.

Charlie Chen
sumber