PostgreSQL — Hugepage Kullanımı ve Etkileri
Linux Hugepage Kavramı
Linux hugepage kavramı bellekteki sanal bir bloğun en küçük boyutunu belirler. Yani sanal page’lerin bir tanesinin boyutunu belirler. THP(Transparent Huge Page) kavramından farklıdır. İkisinin karıştırılmaması önemlidir.
Modern x86 CPU mimarilerinde hugepage’ler 4kB,2MB yada 1GB olarak ayarlanabilir. Bu konu özellikle veritabanı performansına doğrudan etki etmektedir.
Linux üzerindeki bir memory page verinin en küçük alanda yönetilebileceği sanal page olarak bilinmektedir. Burada dikkat edilmesi gereken nokta, işletim sistemi üzerinde öntanımlı olarak hugepage değeri 4kB olarak belirlenmektedir. Memory kullanıldığında birçok 4kB page olacağı için işletim sistemi bu sayının fazla olması nedeniyle zaman zaman zorlanabilir ve birçok iş yapması gerekebilir. Bunu optimize etmek için hugepage değerini 2MB gibi bir değer yapabiliriz. Bu sayede, page sayısı az olacağı için daha az işlem yapılması gerekmektedir.
Linux Hugepage Ayarlanması
Hugepage’lerin doğrudan etki ettiği kısım pagetable boyutudur. İşletim sistemindeki pagetable’ın boyutu monitor edilmesi gereken bileşenlerden birisidir. Aşağıdaki gibi örnek bir komutla pagetable’ın boyutu monitör edilebilir.
cat /proc/meminfo | grep PageTablesroot@76bbafba2051:/# cat /proc/meminfo | grep PageTables
PageTables: 75320 kB
Yukarıda görüleceği üzere pagetable’ın toplam boyutu 75MB civarı olarak görülmektedir. Bu değer ufak bir değer olarak görülebilir. Ancak production sistemlerde daha büyük boyutlara ulaşabilir.
Sistemdeki güncel ve mevcut hugepage boyutunu sorgulamak için aşağıdaki komut kullanılabilir. Memory bilgisi bölümünden bu değer öğrenilebilir.
root@76bbafba2051:/# grep ^Hugepagesize /proc/meminfo
Hugepagesize: 2048 kBroot@91385bbfae42:/# cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 512
HugePages_Free: 479
HugePages_Rsvd: 263
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 1048576 kB
Yukarıda görüldüğü gibi hugepage boyutu 2048kB olarak görülmektedir. Bu boyutu değiştirmek için sysctl konfigürasyonuna aşağıdaki parametre ile yeni bir kayıt ekleyebiliriz. Bu sayede, hugepage boyutu değiştirilebilir.
vm.nr_hugepages = 512
vm.nr_hugepages = 1024
vm.nr_hugepages = 2048
vm.nr_hugepages = 4096
PostgreSQL Hugepage Performans Sonuçları
Aşağıdaki sonuçlardan görüleceği üzere hugepage sayısındaki değişimler latency ve TPS anlamında fark yaratmaktadır. Test ortamındaki kaynaklar ve konfigürasyonlar temel konfigürasyonlar olarak ayarlanmıştır.
Buradaki temel motivasyon hugepage değerinin değişiminin performansa bıraktığı etkiyi incelemektir.
Referans
- https://www.enterprisedb.com/blog/improving-postgresql-performance-without-making-changes-postgresql
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-transhuge
- https://www.percona.com/blog/2018/12/20/benchmark-postgresql-with-linux-hugepages/
- https://docs.01.org/clearlinux/latest/guides/maintenance/configure-hugepages.html