postgresql'i büyük miktarlarda koç için ayarlamak


29

İki aynı sunucum var (donanım açısından), ikisi de Windows Server 2008 r2'nin standart kurulumlarıdır, minimum yazılım yüklüydü (temelde benim kodum ve jvm vb. Gerekli şeyler).

Bir sunucuda, ikinci sunucuda postgresql 9.1'de sql server 2005 kullanıyorum. Bu 2 sunucudaki b / n performansındaki fark şaşırtıcı, postgresql'de o kadar kötü ki, ilk "patronumla sql sunucu lisansı için ödeme yapmak yerine postgresql kullanalım" diyerek pişmanım. Aynı komut için 30 saniye ile 15 dakika arasındaki farklardan bahsediyoruz ve bu sadece bir komut değil, attığım herhangi bir sorgu veya komut. Her ikisi de hemen hemen aynı verilere (kayıtlar farklı sırayla eklenmiştir) sahiptir ve her iki veritabanı da aynı yapıya / dizinlere vs. sahiptir.

Ama umarım bu sadece performans ayarlaması meselesidir. Mesele şu ki, sql sunucusu hemen hemen tüm sunucudaki 32 konserin hepsini kullanıyor, postgresl ise hiçbir şeyi kullanmıyor, kesinlikle daha ayrıntılı bir şekilde çözemedim.

Postgresql'nin 20'den fazla konser koçu kullanmasını nasıl sağlayabilirim? Bu sunucular özellikle bu veritabanı için özel olarak oluşturulmuş, bu nedenle veritabanı tarafından kullanılmayan herhangi bir ram ve destekleyici işlemler bence boşa harcanıyor.


4
İlk ayar için bir şey değiştirdiniz mi? Adım 1: SET effective_cache_size=18G;(varsayılan ayar son derece düşük) BTW: bunun 64 bitlik bir makine olduğunu varsayarsak (PTE yok)

1
Gerçekten bize çok yardımcı olacak kadar vermiyorsun. "Yavaş" dışında, veri kümeniz hakkında, bilgiye nasıl eriştiğiniz, hangi tür sorguların genellikle yavaş çalıştığı, sunucunuzu ayarlamak için ne yaptığınız (ve muhtemelen yanlış ayar) hakkında çok fazla şey bilmiyoruz. Heck, çok sayıda çekirdek ve bellek kanalına sahip bir linux makinede, postgresql'i yüklemeden çok önce berbat bir performans elde edebilirsiniz. CPU veya IO bağlı mısınız? Hangi varsayılan olmayan ayarlarınız zaten var? Ne tür sorular yavaş?
Scott Marlowe

2
Postgres ondan bahsettiğin gibi "ram kullanmaz". Önbelleklemesi için OS dosya sistemi sayfa önbelleğine dayanır, bu nedenle postgres çalıştıran bir sistemde ram kullanımını izlediğinizde, tipik olarak işletim sistemi tamponları / önbellek tarafından kullanılan birçok GB'yi ve yalnızca birkaçını kullanarak bireysel postgres arka uç işlemlerini kullanırsınız. her biri birkaç on MB.
dbenhur

1
Bu bağlantıya bakınız: tekadempiere.blogspot.ae/2014/09/… Ve kaynak temelli conf değerlerinizi buradan bulun
Sajeev

belki ilginizi çekebilecek bir soru: stackoverflow.com/questions/47311485/…
mountainclimber

Yanıtlar:


41

Üzerinden başlatılan birçok tweakable sabit vardır postgres.conf. En önemlileri:

  • max_connections: eşzamanlı oturum sayısı
  • work_mem : hash tabloları gibi orta sonuçlar için ve sıralama için kullanılacak maksimum hafıza miktarı
  • shared_buffers 'sabitlenmiş' arabellek alanına atanan bellek miktarı.
  • effective_cache_size işletim sisteminin LRU arabellekleri tarafından kullanıldığı varsayılan bellek miktarı.
  • random_page_cost : aradığı diskin göreceli maliyeti için bir tahmin.

max_connectionsgerekenden daha yükseğe ayarlanmamalı, boşta olsalar bile bağlantıların maliyeti düşüktür; Çoğu durumda bir bağlantı, dışarıda beklemekten çok içeride bekleyerek zaman geçirir. (eşzamanlılık pahasına) Baştan sona güzel bir kural, "iğ sayısı + işlemci sayısı + X" şeklindedir.

work_memyanıltıcı: Her alt sorguya uygulanabilir, bu nedenle 5 ile bir sorgu HASHJOINS5 * mal olabilir work_mem. Ve en kötü senaryolar için, bu miktarı tüketen çoklu oturumları da düşünmelisiniz (yine de max_connectionsdüşük kalması için bir neden ).

shared_buffers(IMHO) abartılı. Normalde mevcut tüm "boş" belleğin yaklaşık 1/4 ... 1 / 2'sine ayarlanması önerilir, ancak düşük tutmaya ve effective_cache_sizemevcut tüm "boş" belleğe ayarlamaya meyilliyim .

random_page_costdiskte arama + okuma maliyetidir. Bu, sequential_disk_cost1 olan ile ilgilidir. Varsayılan (4) random_page_cost, modern makineler ve ağ depolaması için çok yüksektir, normalde 2 ile 1.x arasında düşürülebilir. SSD diskleri için, 1.0'ı bile ayarlayabilirsiniz, çünkü arama SSD'lerde neredeyse ücretsizdir.


Mükemmel! Effect_cache_size'nin önemini hiç görmedim, her zaman yalnızca paylaşılan_buffers ile kandırdım. Bu gerçekten büyük bir fark yarattı. Pgtune'ı da çalıştırdım ve shard_buffers için kullanılacak 20 GB 96'yu, ancak etkili_cache_size için 64 GB'ı önerdim. Teşekkürler!

1
FWIW, Postgres belgelerinde bu ve diğer ayarları önerdim ve sunucumuz için bir analiz yaptım .
mlissner

Cevabınız için çok teşekkür ederim. Varsayılan 100 olduğunda ve sunucu RAM'inin 32 GB (özel postgres sunucusu) work_memolduğunda ne önerildiğini sorabilir miyim max_connections? Günlük soruları temel alarak bunu kendim ayarlamam gerektiğini biliyordum. Sadece bana "tek bir boyuta tüm cevaplara uyuyor" değeri (veya bir başlangıç ​​noktası değeri) söyleyebilir misiniz acaba? 50 MB çok mu büyük? Çok teşekkürler.
sgon00

Makinenizdeki tipik eşzamanlı faaliyete bağlıdır. Her biri 50 milyon (10..20 milyonun üzerinde) isteyen 100 seans sığabilecek. Ya da olmayabilir. İzlenim elde etmek için vmstat veya üstü izleyin. Artı: Sorgunuza (ve diğerlerine) bağlıdır. Sadece planlara bak.
wildplasser

@wildplasser hızlı cevap için çok teşekkür ederim. Pgtune.leopard.in.ua adresinde ilginç bir web sitesi buldum . Sanırım önerisinden itibaren başlangıç ​​noktası olarak 40 MB kullanacağım ve buna göre ayarlayacağım. Şerefe.
sgon00

20

PostgreSQL yapılandırmasını ayarlamanıza yardımcı olmak için pgtune kullanmayı düşünün . PgFoundry'dan:

pgtune, wimpy varsayılan postgresql.conf dosyasını alır ve veritabanı sunucusunu, kullanıldığı donanım kadar güçlü olacak şekilde genişletir.

PostgreSQL'in varsayılan konfigürasyonu çok muhafazakardır ve bu araç bu kesin duruma yardımcı olmak içindir. Belgeler bir ışık okumak ve aracı kullanmak oldukça basittir.

Pgtune'ın kesin önerilerini kullanmaya gerek olmadığını unutmayın. Ayarlarıyla oynamak ve sonuç dosyasında meydana gelen değişiklikleri izlemek, PostgreSQL'in yapılandırmasını ve manuel olarak nasıl ayar yapılacağını daha iyi anlamanızı sağlayacaktır.


8
Pgtune’un son güncellemesi 2009’da yapıldı, bu 5 yıl önceydi ve hala sayıyor. 9.1-9.2-9.3 serisi için hala geçerli olup olmadığını merak ediyorum.
sorin

9
pgtune artık çevrimiçi olarak
Alfabravo

3

Her sorgu veya komut yavaş çalışıyorsa, bundan şüpheleniyorum:

  • çalıştırdığınız her sorgu için veritabanına bağlanırsanız;
  • işe yaramayan ve bu belirli kimlik doğrulama yöntemi zaman aşımına uğrayana kadar sorgularınızı durduran bir tür kimlik doğrulama yöntemi yapılandırdınız.

Lütfen bize böyle bir sorgu yapmanın ne kadar sürdüğünü söyler misiniz select version()? Anında olması gerekiyorsa (iş istasyonumda 0,16ms).


2

HER sorgu bu kadar yavaşsa, sunucuda bir şeyler çok yanlış olur. Tecrübelerime göre, her db diğerinden daha iyi bir kaç şeye sahiptir, ancak performans bilge pgsql kolayca mssql sunucusu ile aynı alandadır.

Peki, hangi işletim sistemi üzerinde pgsql kullanıyorsunuz? Hangi donanım? Hangi ayarları zaten değiştirdiniz? Veri kümeniz ne kadar büyük? Zayıf bir sorgunun örneği ve açıklamanın analizinin çıktısı nedir (Sorgunuzu şöyle çalıştırın:

açıklamak analyze select ... burada sorgunun kalanını ...;

Çıktıyı http://explain.depesz.com/ adresine gönderin ve bağlantıyı buraya yazın.


1
Evet, her sorgu / komut yavaş çalışıyor ve evet "bir şey" çok yanlış, bu yüzden benim sorum. Mesele şudur ki, mssql, sunucudaki mevcut ramden (yani ağır önbellekleme) tam olarak faydalanmakta iken psql değildir. Yorumlarınız ve tavsiyeleriniz için teşekkür ederim, ancak sorumun büyük kısmını ve konu satırının özünü kaçırmış olmalısınız ... Sadece mevcut koçtan faydalanmak için psql'nin nasıl kullanılacağını bilmek istiyorum; şu anda diğerleri tarafından listelenen bazı önerileri deniyor ...
user85116

1
RAM'inizi kullanmak sorun değil. Postgresql önbelleklemenin çoğunu yapmak için işletim sistemine güvenir. Bu nedenle, tüm RAM'i kullanmak gerekmez. Yine, benim açımdan çok şey kaçırdın. Bize yardım etmemiz için bize çok az şey veriyorsun. Bir yaşam için 5000 TPS postgresql küme kullanıyorum. Tavsiyemi alabilir veya pgsql'nin nasıl çalıştığını ve tartıştığını bildiğinizi düşünmeye devam edebilirsiniz.
Scott Marlowe

@ user85116, lütfen Scott'u duyun, süper gecikmeye bağlı olan MySQL ile zaten bir iş akışımız var, bu yüzden şu anda MySQL bu sorguları hızlı bir şekilde yapmak için 64GB ram kullanıyor, bununla birlikte sadece 2G Postgres'te sadece gerçekleştirilmiş görünümlerle elde edilebiliyor. Tüm veritabanını RAM'e önbelleğe almak sorununuzu çözmez, yalnızca daha az görünür hale getirir. DB yapısında aynı problemlere sahipseniz Postgres sizin için düzeltmeyecek, gizlemeye çalışmayacaktır.
kworr
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.