PostgreSQL'i yazma performansı için yapılandırma


30

PostgreSQL sunucularımdan biri, sürekli veri akışı alan birkaç (1-3) veritabanına ev sahipliği yapıyor. Veriler özellikle yapılandırılmamıştır, o andaki zamana ve o belirli an için gözlemlenen çeşitli verilere karşılık gelir. Veri oranı oldukça yüksektir; bir veritabanı için günde bir gigabayt, bir tanesi için bunun onda biri için çalışır. Bu oranın artmasını beklemiyorum. Okuma performansı çok daha düşük bir önceliktir ve şu anda kabul edilebilir.

Günlüklerde şu mesajı var:

LOG:  checkpoints are occurring too frequently (15 seconds apart)
HINT:  Consider increasing the configuration parameter "checkpoint_segments".

Bu değer şu anda nezaketinde olan 16'ya ayarlanmıştır pgtune.

Yazma performansını iyileştirmek için göz önünde bulundurmam gereken ayarlar nelerdir? Mümkün olduğu kadar güvenliği sağlamayı tercih ederim. Gelen veri hacmi göz önüne alındığında, verilerin büyük kısmı bozulmadan kaldığı sürece bazı son verilerdeki verileri kaybetmeyi kabul edebilirim.

Düzenleme: Şimdilik PostgreSQL 9.0 kullanıyorum, ancak 9.1'e yükseltmeyi planlıyorum. Donanım detaylarını göndermiyorum çünkü önemini kabul etmeme rağmen, nihayetinde bu optimizasyonu çok çeşitli donanımlara sahip birkaç makinede yapmak zorunda kalacağım. Donanım cevap için gerekliyse, lütfen bana genel bilgileri verin, böylece yanıtı farklı donanım yapılandırmalarına sahip makinelere uygulayabilirim.


Sürümünüzü ve tercihen depolama donanımınızla ilgili bazı ayrıntıları gönderebilir misiniz?
Jack Douglas

checkpoint_segmentsTavsiye edildiği gibi arttı mı? Ne oldu?
a_horse_with_no_name

3
Bu tür sorular için bir başka mükemmel kaynak da Gregory Smith'in PostgreSQL 9.0 High Performance adlı kitabı .
jp

Yanıtlar:


24

Günde 1 Gigabayt yazma yükü kadar yüksek değil. Gün boyunca yayıldı, saniyede yaklaşık 50kbayta çıkar. Yavaş bir USB flaş sürücü bunu kaldırabilir. Sanırım daha da yanmış. A_horse_with_no_name'in önerdiği gibi, kontrol noktası segmentlerini arttırın. 100 ya da öylesine sıradan değil.

Sonra checkpoint_timeout1 saatinizi artırın , ayrıca sizi checkpoint_completion_target1,0'a (% 100) yakın bir şeye yükseltmeye bakın . Tamamlama hedefi, PostgreSQL'e arka planda ne kadar agresif bir şekilde yazıldığını söyler, böylece bir kontrol noktasını çalıştırmadan önce% x tamamlanır; bu, tüm verileri bir kerede WAL'den bir kerede yazılmaya zorlar ve bu sırada sistemi bir taramaya yavaşlatır.

Genellikle% 100 olarak ayarlamamanızın nedeni, aynı bloğa bir kereden fazla yazmak oldukça yaygın olmasıdır ve WAL yazmasını ana mağazaya erteleyerek, aynı bloğun sebepsiz yere iki kez yazılmasını önlersiniz.

Muhtemelen, zaman aşımına uğramadan önce bir kereden fazla aynı bloğa yazacaksınız, yani tek yapmanız gereken yerleştirmek ve daha sonra yüksek ayar yapmak onu 0.9 veya daha yükseğe çıkarmak mantıklı olacaktır. En kötüsü, gerekenden gerekenden biraz daha fazla yazacağınız, ancak kontrol noktalarının etkisi büyük ölçüde azalacak.


Yazma hacmi aslında neredeyse tamamen tekdüzedir: bu, her saniye, sürekli olarak, 24x7 oranında anket yapan donanım izleme yazılımı veri deposudur. Kesin veri hızını hesaplayabilirdim, ancak programcılar monitör noktalarını ekleyip kaldırırken bir miktar dalgalanıyor.
Daniel Lyons

1
Eğer oran günde 1G ise ve pürüzsüzse, hemen hemen her alt sistem yazma yükünü kaldırabilir, kontrol noktasını tamamlama hedefinin 1,0'a ayarlanması ve uzun bir kontrol noktası zaman aşımının size ulaşması gereken pürüzsüz tutmak istersiniz.
Scott Marlowe

10

Çok 'ağır yazma' sisteminde, WAL'ın en yüksek aktivite sırasında yazabileceği oranla sınırlama olasılığınız yüksektir.

Eğer gerçekten "başarısız olan bazı verileri kaybetmeyi kabul edersen", senkronize etmeyi kapatabilirsin ki:

Performansın bir işlemin dayanıklılığı konusunda kesin olarak kesinliğinden daha önemli olduğu durumlarda faydalı bir alternatif olabilir

Donanımınızı değiştirebiliyorsanız, yazma işlemlerini optimize etmek için bunlardan herhangi birini düşünebilirsiniz:

  • RAID5 üzerinden RAID10
  • Çok sayıda iğ (örneğin 3.5 "yerine 2.5" anlamına gelebilir)
  • SATA üzerinden SAS
  • 10 bin sürücüden 15K
  • SSD

--Düzenle

@ Scott'ın mükemmel cevabı hakkındaki yorumunuza dayanarak : "Yazma hacmi aslında neredeyse tamamen tekdüze" ve "saniyede 50kbayt" olarak belirtilen veri hızı, veri kaybını tehlikeye sokan herhangi bir şey yapmanız gerektiğinden şüpheliyim. Belki diğer yapılandırma parametrelerinizden bazılarının neye ayarlanmış olduğunu bilmek de yardımcı olabilir.


3
Yazma performansı önemliyse, işletim sistemi ve dönen sabit diskler arasındaki pil destekli bir kontrol cihazı BÜYÜK bir fark yaratabilir.
Scott Marlowe

5

Taahhütlerinizin sıklığını / boyutunu da kontrol edebilirsiniz: Son zamanlarda,> 1 milyon kaydı tek bir işlemde güncellemeye çalıştığım bir sorunla karşılaştım. OP tarafından açıklananlara benzer günlük mesajları aldım, ancak birkaç saat sonra bile işlem tamamlanamadı. Yazımı daha küçük işlemlere ayırdığımda (10.000 kayıt ya da öylesine), gereken toplam süre yaklaşık 15 dakikaya düştü.

Ne düşünüyorum oldu Postgres günlükleri yazarken çok zaman harcadım olmasıydı checkpoint_timeout o kayıtları tasarrufu önemli bir ilerleme edemeden geçen. Bu açıklamanın devam edip etmediğinden emin değilim. Hala uyarıları alıyorum, fakat bütün yazılar sonunda işleniyor. Ancak, veritabanını yeniden yapılandırmayı gerektiren bir program yerine geçici bir çözüm buldum.

Ayrıca bkz. Http://www.postgresql.org/docs/9.3/static/wal-configuration.html

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.