1. HugePages Nedir?

HugePages, Linux çekirdeğinde standart bellek sayfalarına kıyasla daha büyük bellek blokları ayırarak bellek yönetimini iyileştiren bir özelliktir. Büyük bellek tahsisi gerektiren veritabanları, yüksek performanslı hesaplama uygulamaları ve bellek yoğun programlar için oldukça faydalıdır.

2. Kubernetes’te HugePages Kullanımı Neden Önemli?

  • Bellek Yönetimi: Daha büyük bellek sayfaları kullanarak TLB (Translation Lookaside Buffer) girişlerini azaltır, böylece CPU’nun bellek erişimini hızlandırır.
  • Daha Az Overhead: Küçük bellek sayfalarının neden olduğu yönetim yükünü azaltarak performansı artırır.
  • Optimize Edilmiş Performans: Redis, PostgreSQL, MySQL gibi uygulamalarda büyük veri işlemleri için daha verimli bellek tahsisi sağlar.

3. Kubernetes’te HugePages Nasıl Kullanılır?

Adım 1: Node’larda HugePages Desteğini Kontrol Etme

Öncelikle, mevcut HugePages desteğini görmek için şu komutu çalıştırın:

grep Huge /proc/meminfo

Çıktıda şu değerleri görmelisiniz:

HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

📌 Eğer Hugepagesize: 1048576 kB görüyorsanız, 1Gi HugePages destekleniyor demektir.

Adım 2: HugePages’i Etkinleştirme

2MB (2048KB) Sayfa Boyutları İçin:

echo 512 > /proc/sys/vm/nr_hugepages

1GB (1048576KB) Sayfa Boyutları İçin:

echo 8 > /proc/sys/vm/nr_hugepages

Bu değişiklikleri kalıcı hale getirmek için:

echo "vm.nr_hugepages=512" >> /etc/sysctl.conf
sysctl -p

Adım 3: Kubernetes Node’larda HugePages Tanımlama

Kubernetes’in HugePages’i tanıyıp tanımadığını kontrol etmek için:

kubectl describe node <node-name> | grep hugepages

Eğer tanımlanmamışsa, Kubelet için şu ayarı yapmalısınız:

Dosyayı aç:

sudo nano /etc/kubernetes/kubelet.env

Mevcut KUBELET_ARGS değişkenini şu şekilde güncelleyin:

KUBELET_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
--config=/etc/kubernetes/kubelet-config.yaml \
--kubeconfig=/etc/kubernetes/kubelet.conf \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--runtime-cgroups=/system.slice/containerd.service \
--feature-gates=HugePageStorageMediumSize=true"

Kaydedip çıkın ve ardından şu komutları çalıştırın:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

4. HugePages Türleri: hugepages-2Mi ve hugepages-1Gi Nedir?

Linux çekirdeği, farklı boyutlarda HugePages destekler. Kubernetes’te iki tür HugePages kullanabilirsin:

  • hugepages-2Mi (2MB HugePages): Küçük ve orta ölçekli bellek tahsisleri için uygundur. Çoğu modern CPU’da varsayılan olarak desteklenir.
  • hugepages-1Gi (1GB HugePages): Büyük bellek tahsisleri yapan uygulamalar için optimize edilmiştir. Daha az sayıda büyük sayfa kullanarak bellek yönetimini iyileştirir.

32GB RAM İçin Hangisini Kullanmalıyım?

  • 2MB HugePages için: 32GB / 2MB = 16384 adet HugePages gerekir. echo 16384 > /proc/sys/vm/nr_hugepages resources: requests: hugepages-2Mi: 32Gi limits: hugepages-2Mi: 32Gi
  • 1GB HugePages için: 32GB / 1GB = 32 adet HugePages gerekir. echo 32 > /proc/sys/vm/nr_hugepages resources: requests: hugepages-1Gi: 32Gi limits: hugepages-1Gi: 32Gi

📌 Öneri: Eğer donanımın 1Gi HugePages destekliyorsa, 32GB için en verimli seçenek hugepages-1Gi olacaktır.


Adım 5: Kubernetes’te Pod İçin HugePages Tanımlama

Bir Pod’un HugePages kullanmasını sağlamak için resource limits ayarlarını tanımlamalıyız:

apiVersion: v1
kind: Pod
metadata:
  name: hugepage-pod
spec:
  containers:
  - name: hugepage-container
    image: busybox
    command: ["sleep", "3600"]
    resources:
      requests:
        hugepages-2Mi: 100Mi
      limits:
        hugepages-2Mi: 100Mi

Eğer 1GB HugePages kullanacaksanız:

      requests:
        hugepages-1Gi: 1Gi
      limits:
        hugepages-1Gi: 1Gi

Adım 6: High Availability İçin Doğru Yaklaşım

  • Tüm Worker Node’lara aynı miktarda HugePages tahsis edilmeli.
  • Pod’un belirli bir node’a bağımlı olmaması için nodeSelector yerine nodeAffinity kullanılmalı.
  • Pod’ları otomatik olarak dağıtmak için ReplicaSet veya Deployment kullanılmalı.

Node Affinity ile HugePages Destekleyen Node’lara Yönlendirme:

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: hugepages-enabled
            operator: In
            values:
            - "true"

Bu sayede Kubernetes, hangi Worker Node müsaitse otomatik olarak oraya Pod’u yerleştirebilir.


Sonuç

High Availability için ReplicaSet veya Deployment ile pod’lar otomatik olarak dağıtılmalıdır.

Kubernetes’te HugePages kullanımı, bellek tahsisini optimize ederek performansı artırır.

Sadece Pod’un çalışacağı node’da değil, tüm uygun Worker Node’larda HugePages yapılandırılmalıdır.

Pod’ların herhangi bir node’a bağımlı olmasını engellemek için nodeAffinity kullanılmalıdır.