RHEL 6.3, 16 GB RAM'e sahip 8 çekirdekli bir makinede çalışan bir PostgreSQL 9.2 örneğine sahibim. Sunucu bu veritabanına tahsis edilmiştir. Varsayılan postgresql.conf dosyasının bellek ayarları konusunda oldukça tutucu olduğu göz önüne alındığında, Postgres'in daha fazla bellek kullanmasına izin vermenin iyi bir fikir olduğunu düşündüm. Sürpriz için, wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server adresindeki tavsiyeye uymak , koştuğum her sorguyu pratikte önemli ölçüde yavaşlattı, ancak açıkça daha karmaşık sorgularda farkedilir.
Ayrıca ayarlanan daha fazla parametre ile aşağıdaki tavsiyeyi veren pgtune'u çalıştırmayı denedim, ancak bu hiçbir şeyi değiştirmedi. Başka yerlerdeki tavsiyelere (ve özellikle PG wiki'ye) uygun görünen 1/4 RAM boyutunda paylaşılan kullanıcılar önerir.
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
Ayarları değiştirdikten sonra tüm veritabanını yeniden eklemeyi denedim (kullanarak reindex database
), ancak bu da işe yaramadı. Buralarda paylaşılan_buffers ve work_mem ile oynadım. Yavaş yavaş onları çok muhafazakar varsayılan değerlerden (128k / 1MB) değiştirmek yavaş yavaş performansı düşürdü.
Koştum EXPLAIN (ANALYZE,BUFFERS)
birkaç sorgularında ve suçlu o Hash önemli ölçüde yavaştır Üyelik gibi görünüyor. Bana neden belli değil.
Belirli bir örnek vermek gerekirse, aşağıdaki sorguyu sahibim. Varsayılan yapılandırmada ~ 2100ms ve tampon boyutu arttırılmış konfigürasyonda ~ 3300ms olarak çalışır:
select count(*) from contest c
left outer join contestparticipant cp on c.id=cp.contestId
left outer join teammember tm on tm.contestparticipantid=cp.id
left outer join staffmember sm on cp.id=sm.contestparticipantid
left outer join person p on p.id=cp.personid
left outer join personinfo pi on pi.id=cp.personinfoid
where pi.lastname like '%b%' or pi.firstname like '%a%';
EXPLAIN (ANALYZE,BUFFERS)
yukarıdaki sorgu için:
- Varsayılan tamponlar: http://explain.depesz.com/s/xaHJ
- Daha büyük tamponlar: http://explain.depesz.com/s/Plk
Soru, tampon boyutlarını arttırdığımda neden performansın azaldığını gözlemliyorum? Makine kesinlikle belleği tükenmiyor. İşletim sistemi içindeki paylaşılan hafıza ( shmmax
ve shmall
) çok büyük değerlere ayarlanmışsa, bu bir sorun olmamalıdır. Postgres günlüğünde de hata alamıyorum. Autovacuum'u varsayılan yapılandırmada çalıştırıyorum, ancak bununla bir ilgisi olmasını beklemiyorum. Tüm sorgular aynı makinede birkaç saniye aralıklarla yapıldı, sadece konfigürasyon değişti (ve yeniden başlatılan PG).
Düzenleme: Sadece ilginç bir gerçeği buldum: 2010 ortasıdaki iMac'imde (OSX 10.7.5) aynı testi Postgres 9.2.1 ve 16GB RAM'le aynı testi yaptığımda, yavaşlama deneyimini yaşamadım. özellikle:
set work_mem='1MB';
select ...; // running time is ~1800 ms
set work_mem='96MB';
select ...' // running time is ~1500 ms
Sunucuda tam olarak aynı verilerle tam olarak aynı sorguyu yaptığımda (yukarıdakilerden biri), work_mem ile 2100 ms ve 96 MB ile 3200 ms elde ederim.
Mac'te SSD var, bu yüzden anlaşılır bir şekilde daha hızlı, ancak beklediğim bir davranış sergiliyor.
Ayrıca pgsql-performansına ilişkin takip tartışmalarına bakınız .