PostgreSQL kontrol noktasında ne olur?


22

İşte denetim noktası günlüğümün bir parçası:

2014-03-26 11:51:29.341 CDT,,,18682,,532854fc.48fa,4985,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 15047 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 30 recycled; write=68.980 s, sync=1.542 s, total=70.548 s; sync files=925, longest=0.216 s, average=0.001 s",,,,,,,,,""
2014-03-26 11:56:05.430 CDT,,,18682,,532854fc.48fa,4987,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 16774 buffers (1.6%); 0 transaction log file(s) added, 0 removed, 31 recycled; write=72.542 s, sync=17.164 s, total=89.733 s; sync files=885, longest=3.812 s, average=0.019 s",,,,,,,,,""
2014-03-26 12:01:21.650 CDT,,,18682,,532854fc.48fa,4989,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 14436 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 33 recycled; write=122.350 s, sync=5.212 s, total=127.676 s; sync files=924, longest=3.740 s, average=0.005 s",,,,,,,,,""
2014-03-26 12:06:25.028 CDT,,,18682,,532854fc.48fa,4991,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 13277 buffers (1.3%); 0 transaction log file(s) added, 0 removed, 29 recycled; write=126.217 s, sync=5.733 s, total=131.991 s; sync files=894, longest=1.859 s, average=0.006 s",,,,,,,,,""
2014-03-26 12:10:41.958 CDT,,,18682,,532854fc.48fa,4993,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 20765 buffers (2.0%); 0 transaction log file(s) added, 0 removed, 28 recycled; write=88.015 s, sync=10.818 s, total=98.872 s; sync files=881, longest=2.690 s, average=0.012 s",,,,,,,,,""

Bazen veritabanımızın çok yavaş olduğunu fark ettim - şu ana kadar çok uzun süre sıkışmış çok sayıda normal kısa sorgu görebilirsiniz. Net bir suçlu olmadan düzenli olarak gerçekleşir.

Soru: Kontrol noktası buna neden olabilir mi? Kontrol noktasının "senkronizasyon" aşamasında ne olur?

Yanıtlar:


32

İşlemi sırasında, PostgreSQL işlem günlüğü dosyalarındaki değişiklikleri kaydeder, ancak bunları hemen gerçek veritabanı tablolarına sığdırmaz. Genellikle sadece bellekteki değişiklikleri tutar ve RAM dolmaya başladığında ve bunları yazmak zorunda olmadıkça istendiğinde onları bellekten döndürür.

Bu, çökerse, diskteki tabloların güncel kalmayacağı anlamına gelir. Geri yükleme işlemine başlamadan önce, diskteki tablolardaki değişiklikleri uygulayarak işlem günlüklerini yeniden oynatması gerekir. Büyük, yoğun bir veritabanı için biraz zaman alabilir.

Bu nedenle ve işlem günlüklerinin sonsuza dek büyümesini sürdürmemesi için, PostgreSQL periyodik olarak DB'nin temiz durumda olduğundan emin olduğu bir kontrol noktası yapar. Bekleyen tüm değişiklikleri diske siler ve değişikliklerin kilitlenme kurtarma kaydını tutmak için kullanılan işlem günlüklerini geri dönüştürür.

Bu yıkama iki aşamada gerçekleşir:

  • Tamponlar masaya write()kirli s shared_buffers; ve
  • fsync() etkilenen dosyaların değişmesi gerçekten diske çarptığından emin olmak için

Her ikisi de disk G / Ç yükünü artırabilir. Bu yazıların yol açtığı çekişme okumaları yavaşlatabilir ve ayrıca işlemlerin gerçekleştirilmesi için gereken WAL segmentlerinin temizlenmesini de yavaşlatabilir.

Uzun zamandır devam eden bir zorluk oldu, ancak daha fazla RAM içeren sistemleri gördüğümüzden daha da kötüye gidiyor, böylece daha fazla veriyi tamponlayabilir ve yazması daha uzun sürebilir. Linux ve PostgreSQL toplulukları arasında, şu anda bununla nasıl başa çıkılacağı, bu LWN.net makalesinde tartışıldığı gibi tartışmalar var . (LWN.net, insanlar abone olmadığında bu kadar harika bir çalışma yazmaya devam edemez. Abone ve bu bağlantıyı paylaşıyorum çünkü bu yararlı ve bilgilendirici. Lütfen daha fazla görmek istiyorsanız abone olmayı düşünün bir şey.)

Şu anda kontrol noktalarının etkisini azaltmak için yapabileceğiniz en önemli şey, kontrol noktası faaliyetini genişleterek yaymaktır checkpoint_completion_target; böylelikle daha fazla veri, son kontrol noktası geldiğinde yazılmıştır. Ancak bunun bir maliyeti vardır - bir sayfayı on kez güncellerseniz (bir dize), kilitlenme emniyeti için yalnızca bir kez kesin olarak yazılması gerektiğine rağmen, yüksek bir tamamlama hedefi olan kontrol noktasından önce birkaç kez diske yazılabilir. Daha yüksek bir tamamlanma hedefi daha yumuşak G / Ç düzenleri, ancak daha genel G / Ç yükü için yapar.

Yardım etmek için yapabileceğiniz diğer şey, işletim sisteminize arabelleğe alınan yazmalar anında veri yazmaya başlamasını söylemektir. Bu, ortamın çekirdeği gibidir checkpoint_completion_targetve benzer bir takası vardır. Bkz linux vm belgelerine özellikle dirty_background_bytes, dirty_background_ratio, dirty_expire_centisecs.


Yazma uzun zamandır yayılmış ve sorunlara neden olduğunu sanmıyorum. Peki ya senkronizasyon, herhangi bir şans eseri bir dünyayı durdurma operasyonu olabilir mi?
Konrad Garus

@KonradGarus Senkronizasyon , bir dünyayı durdurma işlemi olmamalı , ama yine de çoğu zaman. Yukarıya bağladığım makaleyi okuyun, oldukça teknik açıdan da olsa, sorunların zamanında ve faydalı bir özetidir. Kısa versiyon, Linux'ta "fsync (), fsync () ile eşzamanlı olarak herhangi bir G / Ç'nin performansını tamamen azaltma eğilimindedir". Bir fsync tarafından atılması gereken miktarı azaltmak için yukarıda listelenen ayar seçenekleriyle bunu azaltabilirsiniz.
Craig Ringer

1

Aşan kaynaklanan kirli OS dosya sistemi tamponlarını ateş basması dirty_bytesya dirty_ratio olan bir ön plan yapmasına engel!

Çekirdek tunables dirty_bytes, dirty_background_bytes, dirty_ratio, dirty_background_ratiove dirty_centisecskontrol diske kirli OS dosya sistemi tamponların yıkar. dirty_bytesBayt cinsinden dirty_ratioeşik, toplam hafızanın oranı olarak eşiktir. dirty_background_bytesve dirty_background_ratiobenzer eşikler, ancak yıkama arka planda gerçekleşir ve tamamlanana kadar diğer okuma / yazma işlemlerini engellemez. dirty_centisecsbir yıkamaya başlamadan önce kaç santim saniye geçebileceği.

Son zamanlarda, bu makinelerin varsayılan ayarları Linux'ta düşmüştür, çünkü modern makineler için bellek büyüklüğü çarpıcı biçimde artmıştır. 256 GB'lık bir makine için dirty_background_ratiove dirty_ratioüzerinde % 5 ve% 10'luk bir oran bile bir G / Ç sistemini aktarabilir.

Ayarlamak dirty_background_bytesveya dirty_background_ratioarka planda kirli tamponları temizlemeye başlamak zordur. Neyse ki bu ayarları, PostgreSQL veya ana bilgisayarı durdurmak zorunda kalmadan uygun dosyaları yeni değerler ekleyerek ayarlayabilirsiniz:

$ sudo echo [int value of bytes] > /proc/sys/vm/dirty_background_bytes

örneğin, bir arka plan sifonu tetiklemek için kirli bayt sayısını ayarlamak için. Eğer bir pil destekli, kapasitör destekli veya flash bellek RAID kartı (kullandığınız takdirde yok sen, bir kaza durumunda verilerinizi korumak istiyorsun değil mi?) Ayarlama ile başlamak dirty_background_bytes1/2 yazma önbelleği tampon boyutu ve dirty_bytesbu boyutun 3/4. I / O profilinizi iostats ile izleyin ve hala gecikme problemleri görüyorsanız, veritabanı yazma yükünüzün halen üzerinde durduğu anlamına gelir, arabellek önbelleği temizlenir. Gecikme süresi iyileşene veya I / O alt sisteminizi yükseltmeyi düşünene kadar değerleri azaltın. FusionIO kartları ve SSD'ler aşırı G / Ç verimi için iki olasılıktır.

İyi şanslar!


"Kirli" veri hakkındaki yorumunuz yavaşlık için önemli bir noktadır. Temel olarak: kirli oran arttıkça, yıkama başlamadan önce kirli veriler için daha fazla tampon ayrılır. Bu nedenle, yıkama gecikmelerini en aza indirmek kirli tamponu arttırmak veya kirli verilerin bellekte kalabileceği süreyi artırmak anlamına gelir.
Peter Teoh 15
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.