Postgres önbelleklerini / arabelleklerini görün ve temizleyin?


90

Bazen bir Postgres sorgusu çalıştırıyorum, 30 saniye sürüyor. Sonra hemen aynı sorguyu çalıştırıyorum ve 2 saniye sürüyor. Postgres'in bir tür önbelleğe alma özelliği var gibi görünüyor. Önbelleğin ne tuttuğunu bir şekilde görebilir miyim? Ayarlama amacıyla tüm önbellekleri temizlenmeye zorlayabilir miyim?

Not: Temel olarak aşağıdaki SQL Server komutunun postgres sürümünü arıyorum:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Ama aynı zamanda o tamponda gerçekte neyin bulunduğunu nasıl göreceğimi de bilmek isterim.

Herhangi bir yardım için teşekkürler.

Yanıtlar:


60

PostgreSQL arabellek önbelleğinde ne olduğunu pg_buffercache modülünü kullanarak görebilirsiniz. Gördüklerinizi açıklayan " PostgreSQL Tampon Önbelleğinin İçinde " adlı bir sunum yaptım ve bununla birlikte gelen bu bilgileri yorumlamaya yardımcı olacak bazı daha karmaşık sorgular gösteriyorum.

Bazı sistemlerde işletim sistemi önbelleğine de bakmak mümkündür, biraz kaba bir örnek için [pg_osmem.py] adresine bakın.

Önbellekleri kolayca temizlemenin bir yolu yok. Linux'ta, veritabanı sunucusunu durdurabilir ve OS önbelleğini temizlemek için drop_caches özelliğini kullanabilirsiniz ; Önce senkronizasyonu çalıştırmak için oradaki uyarıyı dikkate aldığınızdan emin olun.


29
Tek bir oturumda önbelleğe almayı basitçe atlamak mümkün müdür? Sık sık farklı sorguları test etmemiz gerekir ve bu önbelleğe alma, bir yöntemin diğerinden daha iyi olup olmadığını değerlendirmeyi çok zorlaştırır (önbelleğe alınan performansı karşılaştırmak dışında!)
EvilPuppetMaster

7
Veritabanının önbelleğini atlamanın veya temizlemenin bir yolu yoktur. Bunu temizlemek için yapabileceğiniz tek şey sunucuyu yeniden başlatmaktır.
Greg Smith

2
Bunun, örneğin gelecekteki gelişmede mümkün kılınması düşünülebilir mi? Yoksa bu sadece mevcut sistemlerde (PG ve Linux) denemek gerekirse mümkün olmayacak bir şey mi?
Kuberchaun

9
Amazon RDS gibi yönetilen bir PostgreSQL kurulumunu kullanırken, işletim sistemine erişiminiz olmaz ve işletim sistemi önbelleklerini test amacıyla boşaltmak çok zor olabilir, bu nedenle bu özellik PostgreSQL'de çok faydalı olacaktır.
Samuli Pahaoja

4
Yavaş bir sorguyu yeniden üretemiyorum, bu bir sorun, sorgumun ayarlamadan sonra çalıştığından nasıl emin olabilirim? Sunucuyu yeniden başlatır bir seçenek değil Sorguyu
prod'da

22

PostgreSQL'de önbellekleri temizlemek için herhangi bir komut görmedim. Gördüğünüz şey muhtemelen normal dizin ve veri önbelleklerinin diskten okunup bellekte tutulmasıdır. hem postgresql hem de işletim sistemindeki önbellekler tarafından. Tüm bunlardan kurtulmak için bildiğim tek yol:

Yapmanız gereken şey:

  1. Veritabanı sunucusunu kapatın (pg_ctl, sudo service postgresql stop ,,sudo systemctl stop postgresql vs.)
  2. echo 3 > /proc/sys/vm/drop_caches Bu, işletim sistemi dosyası / blok önbelleklerini temizleyecektir - diğer işletim sistemlerinde bunu nasıl yapacağımı bilmememe rağmen çok önemli. (İzin reddedilirse, o sorudasudo sh -c "echo 3 > /proc/sys/vm/drop_caches" olduğu gibi deneyin )
  3. Veritabanı sunucusunu başlatın (örn sudo service postgresql start. sudo systemctl start postgresql)

1
Şunu not etmenin faydalı olacağını düşündüm: Postgres'in veri dizini '/' ile aynı birimde değilse, yukarıdaki işlemden önce / sonra umount yapmanız gerekebilir (hangisi olduğundan emin değilim, gerçekten). Ek olarak (belki biraz vudu) bu adımlardan önce ve sonra 'senkronizasyonu' çalıştırmayı deneyin.
Marqueed

18

Greg Smith'in drop_caches hakkındaki yanıtı çok yardımcı oldu. Önbellekleri düşürmenin yanı sıra postgresql hizmetini durdurup başlatmayı gerekli buldum. İşte hile yapan bir kabuk betiği. (Ortamım Ubuntu 14.04 ve PostgreSQL 9.3'tür.)

#!/usr/bin/sudo bash

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

İlk seferinde 19 saniye ve sonraki denemelerde 2 saniyeden kısa süren bir sorgu ile test ettim. Bu komut dosyasını çalıştırdıktan sonra sorgu bir kez daha 19 saniye sürdü.


15

Linux kutumda bu komutu kullanıyorum:

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

Önbellekten tamamen kurtulur.


2
Postgresql sürümü 9.0 değilse: sync; sudo hizmet postgresql durdurma; echo 1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails

@rusllonrails Bu, yalnızca hizmetin adlandırılmış olması durumunda çalışacaktır postgresql, durum böyle olmayabilir.
jpmc26

Postgres durma işlemi sırasında tekrar bir şeyler yazabildiği synciçin sunucuyu durdurduktan hemen önce yapılması gerektiğini düşünüyorum drop_caches.
greatvovan

8

Evet, postgresql'de kesinlikle önbelleğe alma var. Boyut, shared_buffers ayarı tarafından kontrol edilir . Bunun dışında, önceki cevapta belirtildiği gibi, aynı zamanda kullanılan işletim sistemi dosya önbelleği de var.

Önbellekte ne olduğuna bakmak isterseniz, pg_buffercache adında bir katkıda bulunan modül var. vardır (katkıda / kaynak ağacında, katkıda veya nasıl kurduğunuza uygun olan herhangi bir yerde). Nasıl kullanılacağı standart PostgreSQL belgelerinde listelenmiştir.

Sunucuyu yeniden başlatmak dışında arabellek önbelleğini temizlemenin bir yolu yoktur. İşletim sisteminizin Linux olması koşuluyla, diğer yanıtta belirtilen komutla işletim sistemi önbelleğini bırakabilirsiniz.


7

Bu hatayı aldım.

psql: /cygdrive/e/test_insertion.sql: 9: ERROR: 53 parametresinin türü (t_stat_gardien) planı hazırlarken bununla eşleşmiyor (t_stat_avant)

Mevcut planı temizlemeyi arıyordum ve şunu buldum:

PLANLARI ATIN

Bunu uçlarımın arasında tuttum ve sorunumu çözdü.



1
Doğru sözdizimi DISCARD PLANS;. Ve belgelerin belirttiği gibi: "DISCARD, bir veritabanı oturumuyla ilişkili dahili kaynakları serbest bırakır ".
EAmez

6

Evet, paylaşılan tamponlar postgres önbelleği hem temizlemek mümkündür VE OS önbelleği. Aşağıdaki çözüm Windows içindir ... diğerleri zaten linux çözümünü vermişlerdir.

Birçok kişinin söylediği gibi, paylaşılan arabellekleri temizlemek için Postgres'i yeniden başlatmanız yeterlidir (sunucuyu yeniden başlatmanıza gerek yoktur). Ancak bunu yapmak, işletim sistemi önbelleğini temizlemeyecektir.

Postgres tarafından kullanılan işletim sistemi önbelleğini temizlemek için, hizmeti durdurduktan sonra , mükemmel Sysinternals Suite'ten mükemmel RamMap'i ( https://technet.microsoft.com/en-us/sysinternals/rammap ) kullanın . RamMap'i çalıştırdıktan sonra, ana menüden "Boşalt" -> "Bekleme Listesini Boşalt" seçeneğine tıklayın.

Postgres'i yeniden başlatın ve şimdi bir sonraki sorgunuzun hiç önbellek olmadığı için çok yavaş olacağını göreceksiniz.

RamMap'i Postgres'i kapatmadan da çalıştırabilirsiniz ve muhtemelen istediğiniz "önbellek yok" sonuçlarına sahip olursunuz, çünkü insanların daha önce söylediği gibi, paylaşılan tamponlar genellikle işletim sistemi önbelleğine kıyasla çok az etki sağlar. Ancak güvenilir bir test için, emin olmak için işletim sistemi önbelleğini temizlemeden önce postgres'i durdurmayı tercih ederim.

Not: AFAIK, RamMap kullanırken "Bekleme listesi" dışındaki diğer şeyleri temizlemenizi önermiyorum, çünkü diğer veriler bir şekilde kullanılıyor ve bunu yaparsanız potansiyel olarak sorunlara / kayıp verilere neden olabilirsiniz. Belleği yalnızca postgres dosyaları tarafından değil, diğer uygulamalar ve işletim sistemleri tarafından da temizlediğinizi unutmayın.

Saygılarımızla, Thiago L.


Yardımcı olduğuna sevindim;)
Thiago Linhares de Oliveira

5

bu benim kısayolum

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

Önbelleğe pg_buffercachebakılacak modül var shared_buffers. Ve bir noktada 'soğuk' önbellekte bazı performans testleri yapmak için önbelleği düşürmem gerekti, bu yüzden tam olarak bunu yapan bir pg_dropcache uzantısı yazdım . Lütfen kontrol et.


0

Tahsis edilmiş bir test veritabanınız varsa, parametresini ayarlayabilirsiniz: paylaşılan tamponlar 16'ya. Bu, tüm sorgular için önbelleği devre dışı bırakır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.