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.
sumber
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:
sudo service postgresql stop
,sudo systemctl stop postgresql
, dll)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, cobasudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
seperti dalam pertanyaan itu )sudo service postgresql start
,sudo systemctl start postgresql
)sumber
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.
sumber
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.
sumber
postgresql
, yang mungkin tidak terjadi.sync
harus dilakukan setelah menghentikan server, segera sebelumnyadrop_caches
, karena Postgres dapat menulis sesuatu selama proses penghentian lagi.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.
sumber
Saya mengalami kesalahan ini.
Saya sedang mencari pembilasan rencana saat ini dan menemukan ini:
BUANG RENCANA
Saya memiliki ini di antara sisipan saya dan itu memecahkan masalah saya.
sumber
DISCARD PLANS;
. Dan, seperti yang dinyatakan dalam dokumentasi: "Buang rilis sumber daya internal yang terkait dengan sesi database ".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.
sumber
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;
sumber
Ada
pg_buffercache
modul untuk melihatshared_buffers
cache. 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.sumber
Jika Anda memiliki database pengujian khusus, Anda dapat menyetel parameter: shared buffer ke 16. Itu akan menonaktifkan cache untuk semua kueri.
sumber