2013-12-11 27 views
18

Normal kullanımdan sonra, 30 adet boşta kalma postgres işleminin neden bu kadar çok işlem belleğe sahip olduğunu anlamaya çalışıyorum. Postgres 9.3.1 ve CentOS sürüm 6.3 (Final) kullanıyorum. top kullanma , ben paylaşımsız (RES - SHR) arasında (ortalama ~ 200MB) 300 MB'ye kadar kullandığınız postgres bağlantıların birçok görebilirsiniz belleğe:Idle postgres işlemleri çok fazla bellek kapıyor

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
3534 postgres 20 0 2330m 1.4g 1.1g S 0.0 20.4 1:06.99 postgres: deploy mtalcott 10.222.154.172(53495) idle 
9143 postgres 20 0 2221m 1.1g 983m S 0.0 16.9 0:14.75 postgres: deploy mtalcott 10.222.154.167(35811) idle 
6026 postgres 20 0 2341m 1.1g 864m S 0.0 16.4 0:46.56 postgres: deploy mtalcott 10.222.154.167(37110) idle 
18538 postgres 20 0 2327m 1.1g 865m S 0.0 16.1 2:06.59 postgres: deploy mtalcott 10.222.154.172(47796) idle 
1575 postgres 20 0 2358m 1.1g 858m S 0.0 15.9 1:41.76 postgres: deploy mtalcott 10.222.154.172(52560) idle 

yaklaşık 29 toplam boşta bağlantıları vardır. Bu boşta bağlantı, makine takas kullanmaya başlayana kadar bellekte büyümeye devam eder, daha sonra performans durur. Beklendiği gibi, bağlantıyı sıfırlamak, işleme özgü belleği temizler. Aynı makinedeki aynı sayıda bağlantı, periyodik olarak yeniden bağlandığımda sadece% 20 oranında bellek kullanır (0 değişim ile). Bu süreçler ne tür bilgi tutuyor? Uzun süren, boşta kalan postgres işlemlerinin yeni, boşta olanlar için benzer bellek kullanımına sahip olmasını beklerim.

Dikkat Edilmesi Gerekenler: Şiddetle şemaları kullanıyorum. Uygulamamın her isteğinde, search_path ayarını ve sıfırını yapıyorum.

cevap

12

Bu işlemler hangi süreçlere dayanıyor? Uzun süren, boşta kalan postgres işlemlerinin yeni, boşta olanlar için benzer bellek kullanımına sahip olmasını beklerim.

  • relcache (ilişki tanıtıcı)
  • catcache (sistem katalog kayıt)
  • derlenmiş:

bunları yüklendikten sonra Postgres yerel bellekte önbelleğe alır aslında epeyce şey vardır ağaçlar için plpgsql işlevleri

Çoğu kullanım durumu için, bunların tümü ihmal edilebilir miktarda toplanır. Buradaki anahtar, şemaların yoğun kullanımı ve relcache üzerindeki etkiydi. Bu veritabanı, her biri aynı ~ 90 tabloya sahip ~ 500 şema içerir. Postgres'e göre, şemalar hep aynı olsa da, bu 45.000 tabloya (500 * 90) çıkıyor.

Her istek, bazı çizelgelerin ilişki tanımlayıcılarını bellekte (çoğunlukla önündeki istekten farklı bir şemada) önbelleğe alarak, yavaş yavaş relcache'yi doldurdu. Ne yazık ki, Postgres does not offer a way to limit the size of these caches, çoğu kullanım için büyük olasılıkla tersiyer olacaktır.

Olası çözümler:

kullanarak postgres bağlantıların sayısına bir tavan koymak için daha fazla bellek
  • Bağlantı havuzu ekle

    Postgres mailing lists üzerinden bununla ilgili yardım için Tom Lane ve Merlin Moncure'a teşekkürler.