Power Sistemler Üzerinde PostgreSQL Optimizasyonu

EnterpriseDB ve IBM arasında yapılan bir işbirliği sonucu, 9.4 sürümünden itibaren (September 30, 2016) IBM Power8 işlemcilerin üzerinde PostgreSQL ve EDB Postgres Advanced Server (PAS) kullanımı mümkün hale gelmişti. Geldiğimiz 9.6 sürümünde bu işbirliğinin sonuçları ve etkisi büyük oldu.

EDB Postgres Advanced Server (PAS) ile PostgreSQL aynı kod tabanına sahip olmakla beraber arasındaki temel fark, EDB PAS’ın

  • Artırılmış performans,
  • Oracle/MSSQL uyumluluğu,
  • Güvenlik,
  • Kurumsal Yönetim Araçları

Özellikle bu 4 fark, Oracle üzerinde geliştirilmiş veya koşmakta olan herhangi bir uygulamanın kolayca EDB PAS üzerinde çalıştırılarak işletmenin büyük maliyet tasarrufu ve ek performans sağlaması anlamına gelir. EDB PAS’ın desteklemekte olduğu mimariler için güncel bilgiye https://www.enterprisedb.com/services/edb-supported-products-and-platforms adresinden ulaşabilirsiniz. PostgreSQL 9.6 Sürümü itibariyle EDB PAS IBM Power üzerinde işletim sistemi olarak sadece RedHat 7 (Little Endian) ile destekleniyor.

Power Mimaride PostgreSQL Kullanımında Dikkat Edilmesi Gerekenler

Öncelikli olarak EDB Performans ve Optimizasyon Rehberine göz atmanızda fayda var.  Ayrıca EDB Postgres Enterprise Manager içerisinde bir Tuning Wizard mevcuttur. Kurumsal aboneliğiniz (subscription) yoksa, en azından 60 günlük deneme sürümünü indirip kullanabilirsiniz.

EDB PEM Tuning Wizard

EDB PEM Tuning Wizard

EDB PEM içerisinde yer alan Performans Sihirbazı gelişmiş sistem ayarlarını otomatik olarak yapacak şekilde dizayn edilmiştir. Sistem üzerinde yer alan işlemci, bellek gibi donanım özellikleri, kullanım amacı gibi değişkenlere göre sistemi yeniden ayarlayabilir ve raporlayabilir.

Gereksinimler

EDB PAS Power Sistemler üzerinde RedHat 7 (Little Endian) ile desteklenmektedir. YUM reposunun önceden ayarlanması gerekir. EDB Yum repolarının ayarlanması sonrası EDB Postgres Advanced Server kurulumu yapılabilir.

Eğer community PostgreSQL kullanacak iseniz IBM PowerLinux için geliştirilmiş IBM Advanced Toolchain araçlarını yüklemelisiniz. Bu araçlar, Power üzerinde çalışan Linux işletim sistemi ve uygulamalarının Power mimariden daha fazla faydalanmasını sağlayacak olan bir takım açık kaynaklı derleyicileri, işletim kütüphanelerini ve geliştirme araçlarını içerir.

Performansın en yüksek seviyede optimizasyonu için bu durumda PostgreSQL kodları indirilerek sisteme özel bir derleme işlemi yapılmalıdır. EDB Postgres Advanced Server yum binary paketleri zaten bu araçlar kullanılarak optimize edilmiştir ve gerek yoktur.

Örnek olarak CFLAGS, CPPFLAGS, ve LDFLAGS, mimari özellikleri vb.  configure komutuna parametre olarak verilmelidir:

./configure CPPFLAGS='-Wl, -q -mcpu=power8 -mtune=power8 -O3 -m64' CFLAGS='-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64' LDFLAGS='-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64'

Power Sistem Ayarları

Biz sistemi bir benchmark için hazırladığımızdan dolayı tek bir partition modunu kullandık, yani tek bir Sanallaştırılmamış Mantıksal Birim (LPAR) kullanarak tüm mevcut CPU çekirdeklerini bu tek birime atadık. Bu birimi ayarlayabilmek için öncelikle bir HMC (Hardware Management Console) kurulumu yapmak gerekli.

Genel amaçlı veritabanı kullanımı için güç tasarrufu özellikleri devre dışı bırakılmalı veya uygun şekilde ayarlanmalı. Önerimiz Idle Power Saver kapatılmalı ve Dynamic Power Saver modu açılmalı. Bu ayarlara HMC kullanarak ASMI (Advanced System Management Interface) üzerinden erişebilirsiniz. Bu seçenekler PowerVM harici bir firmware kullanımında farklı olabilir. Bu durumlarda RHEL veya hangi Linux dağıtımını kullanıyorsanız, komut satırı üzerinden cpupower komutu ile düzenlenmelidir.

cpupower frequency-set --governor performance

governor seçeneği performans için ayarlanıyor yukarıdaki komutta. Daha gelişmiş ve kompleks iş yükleri, raporlama sunucuları veya peak time yaşayan sistemlerde governor seçeneği zamanlamalı görevler aracılığı ile farklı şekilde ayarlanarak performans optimizasyonu iş zamanlamalarına, gün, tarih, saate göre değişken olarak düzenlenebilir. Daha detaylı bilgiyi RedHat için (CPUFREQ) veya kullandığınız dağıtımın belgelendirmesinden edinebilirsiniz.

Çekirdek Ayarları ve İşletim Sistemi Seviyesinde Ayarlar

Community PostgreSQL bir pos cihazının üzerinde dahi çalışabilecek şekilde en temel yapılandırma ile sunulmakta, kurumsal kullanım ihtiyaçlarını karşılayabilmesi için yeniden yapılandırmaya ve performans ayarlamasına kesinlikle ihtiyaç duymaktadır. Performans optimizasyonu temelde işletim sistemi ile çok ilişkili çalışan PostgreSQL için sadece donanım ve veritabanı seviyesinde değil aynı zamanda işletim sistemi ve çekirdek seviyesinde de yapılmalıdır.

PostgreSQL işletim sistemi ile birlikte çalışan, performansı ve çalışma yapısı işletim sistemi seviyesindeki ayarlarla çok ilişkili bir veritabanı sistemidir. Örneğin Oracle bu konuda daha izole çalışmakta, MSSQL ise işletim sistemi parametrelerini kendisi istediği gibi ayarlamaktadır. Dolayısı ile PostgreSQL optimizasyonu yapılmak istendiğinde sadece veritabanı parametrelerinin düzenlenmesi yeterli olmayacaktır.

En azından aşağıdaki çekirdek parametrelerinin üzerinden geçilmesi ve ayarlanması gerekir.

Çekirdek Ayarları

  • fs.file-max
  • vm.dirty_background_bytes
  • vm.dirty_ratio
  • vm.dirty_background_ratio
  • vm.hugetlb_shm_group
  • vm.dirty_bytes
  • vm.swappiness
  • vm.hugepages_treat_as_movable
  • vm.zone_reclaim_mode
  • vm.drop_caches
  • kernel.sched_migration_cost
  • kernel.sched_autogroup_enabled
  • kernel.numa_balancing
  • vm.zone_reclaim_mode

Mevcut donanım özelliklerine göre ayarlanması gereken özellikler:

  • shmall
  • shmmax

İşletim Sistemi Ayarları

  • SMT Snooze Delay daha yüksek bir değere çekilmelidir (Sadece Power7 ve Power7+ üzerinde, Power8 ve sonrası için gerekli değildir). Varsayılan değer 100’dür.
  • I/O Önceliklendirmesi (preemption), öncelik zamanlayıcının, önceliği yüksek olarak ayarlanmış görevlerin işletilmesinden sonraki işlemcinin serbest bırakılması zaman ayarına ilişkin tanımı yapar. Sistem üzerindeki veritabanının kullanım amacına göre sistem mühendisin kararına ve sonrasındaki pgbench değerlerine göre yeniden düzenlemeyi gerektirebilir. Bazen bu gecikme süresi tamamen kaldırılır, bazen yarıya düşürülür veya pgbench ile iş yükünün yapısına göre hesaplanarak belirlenir. Mevcut sunucumuzda varsayılan veya atanmış olan değer 0.012 saniye veya 12000000 nano saniye olarak belirlenmişti (/proc/sys/kernel/sched_latency_ns).
  • Donanımsal Veri Önbelleklendirmesi (hardware data prefetch) iş yükünün yapısına göre açılabilir veya kapatılabilir.

PostgreSQL Community sürümüne yönelik Power Ayarları

Community PostgreSQL kaynak kodunda bazı değerler Intel mimarisine göre düzenlenmiş ve optimum değerler ve/veya maksimum olarak belirlenmiştir. Buna örnek olarak Büyük Sayfa Boyutu dediğimiz (Huge Page Size) 2MB olarak belirlenmiştir (sysv_shmem.c: satır 402). Bu değer IBM Power mimarisi için 16MB olarak düzenlenip postgresql yeniden derlenmelidir.

Ayrıca çekirdek değerleri postgresql.org ayarlarında

vm.nr_hugepages=2000
vm.nr_overcommit_hugepages=512

ayarlandıktan sonra, postgresql.conf dosyasında Postgres’e huge page kullanımını devreye alması belirtilmelidir.

#huge_page = try #it will use huge pages if exists
huge_page=on #it will force to use huge pages

EDB Postgres Advanced Server için Power Ayarları

İşletim sistemi tarafında EDB/Postgres kullanıcısı için limitler düzenlenmelidir (/etc/security/limits.conf). Bu dosyada soft ve hard bellek değerleri düzenlenebilir. Bu limit kullanıcının bellek üzerinde korumalı alan olarak kilitleyebileceği maksimum alanı ifade eder, dolayısı ile bu ayar sistem mühendisi tarafından donanıma ve kullanıma göre hesaplanarak belirlenir.

kullanıcı_adi soft memlock xxxxxxxxxxx
kullanıcı_adi hard memlock xxxxxxxxxxx

EDB PAS için huge page ayarı kullanıcının çevresel değişkenleri üzerinden ayarlanabilir.

HUGETLB_SHM=yes
LD_PRELOAD='/usr/lib64/libhugetlbfs.so'
export HUGETLB_SHM
export LD_PRELOAD

EDB PAS Power paketleri kurumsal kullanıma yönelik olarak düzenlendiği için, kaynak kod üzerindeki 2MB olan hugepage değeri zaten 16MB olarak ayarlanmış durumdadır.

Notlar

Yapılan optimizasyon değişiklikleri sistem mühendisi tarafından yapılacak olan bir dizi benchmark ile onaylanmalı (validation) gerekirse değerler üzerinde değişiklikler yapılmalıdır. Bu yazı içerisinde yer alan optimizasyon konuları donanımın tüm bileşenlerini, ağ, dosya sistemi ve depolama donanımı vb. ile ilgili konuları kapsamamaktadır.

Yazı içerisinde performans optimizasyonu yapılmak üzere ele alınan değişkenlere ait değerler özellikle verilmemiştir. Bunun sebebi sistem kullanım amacı, veritabanı sürümü, donanım gibi değişkenlere bağlı olarak yapılmalarıdır.

pgbench aracı PostgreSQL Community Sürüm kaynak kodunu indirdiğinizde, contrib dizini altında yer almaktadır. Standart make && make install komutlari iler derlenip yüklenebilir.

IBM, IBM Power Architecture, Power8, Oracle, MSSQL, Red Hat ilgili firmaların tescilli markalarıdır.