Kurumsal sanallaştırma ortamlarında (Proxmox VE, saf KVM/libvirt veya VMware ESXi) standart iş yüklerinin %90’ı varsayılan paylaşımlı donanım profilleriyle sorunsuz çalışır. Ancak üzerinde saniyede yüz binlerce paket işleyen bir yük dengeleyici (Load Balancer/WAF), düşük gecikmeli bir veritabanı (PostgreSQL/Percona) veya yoğun indeksleme yapan bir OpenSearch düğümü çalıştırdığınızda, hipervizörün soyutlama katmanı (abstraction layer) mikrosaniyelik gecikme sıçramalarına (jitter) neden olmaya başlar.
Sanal makinenin vCPU iş parçacıklarının fiziksel çekirdekler arasında sürekli göç etmesi (context switching), L1/L2/L3 işlemci önbelleklerinin (CPU Cache) her göçte sıfırlanması ve yazılım tabanlı sanal switch’lerin (vmbr0 / tap arayüzleri) yarattığı kesme (interrupt) yükü, donanımın gerçek potansiyelini kilitler.
Bugünkü yazımızda, KVM ve Proxmox VE üzerindeki kritik sanal makinelerinizi Bare-Metal (Fiziksel Sunucu) performansına ulaştıracak üç temel donanım izolasyon tekniğini inceliyoruz: CPU Pinning (vCPU Affinity), Sanal NUMA Topolojisi ve PCIe SR-IOV.
1. İşlemci Tipi Seçimi: Neden kvm64 veya x86-64-v2-AES Yerine host?
Proxmox VE üzerinde yeni bir VM oluşturduğunuzda, küme içi canlı göç (Live Migration) uyumluluğunu korumak adına varsayılan CPU tipi genellikle x86-64-v2-AES veya kvm64 olarak seçilir. Bu modlar, fiziksel işlemcinizdeki (Intel Xeon Scalable veya AMD EPYC) modern komut setlerini (AVX2, AVX-512, BMI2,INVPCID, PDPE1GB) sanal makineden gizler.
- Altın Kural: Kümenizdeki sunucular aynı nesil işlemcilere sahipse (veya ilgili VM için maksimum tek çekirdek performansı ve şifreleme hızı öncelikliyse), CPU tipini mutlaka host olarak yapılandırın.
- pdpe1gb ve +pcid Bayrakları:
hostmodu seçildiğinde sanal makine, konuk işletim sistemi içinde 1GB HugePages kullanabilmesini sağlayanpdpe1gbve TLB (Translation Lookaside Buffer) temizleme maliyetini düşürenpciddonanım bayraklarına doğrudan erişir.
# Proxmox VE üzerinde 105 ID'li VM'in CPU tipini 'host' ve NUMA desteğini aktif yapma
sudo qm set 105 --cpu host --numa 1
2. Sanal NUMA (vNUMA) ve CPU Pinning (vCPU Sabitleme)
Çift soketli (Dual-Socket) bir sunucuda (örneğin 2 x 32 çekirdekli işlemci) her fiziksel işlemci kendi yerel RAM kanallarına (NUMA Node 0 ve Node 1) doğrudan bağlıdır. Eğer bir sanal makineye 16 vCPU verip hiçbir kısıtlama yapmazsanız, Linux çekirdek zamanlayıcısı (CFS/EEVDF) bu vCPU thread’lerini hem Soket 0 hem de Soket 1 üzerinde rastgele koşturur. Sanal makine Soket 0’daki RAM adresini okumak isterken o an Soket 1 üzerinde çalışıyorsa, Remote NUMA Access cezası öder ve bellek gecikmesi ~80 nanosaniyeden ~140+ nanosaniyeye fırlar.
Adım 1: Fiziksel Sunucunun NUMA ve Çekirdek Haritasını Çıkarın
# Hangi CPU çekirdeklerinin ve PCIe yuvalarının hangi NUMA düğümünde olduğunu görüntüleyin
lscpu | grep "NUMA node"
Örnek Çıktı:
NUMA node0 CPU(s): 0-15,32-47
NUMA node1 CPU(s): 16-31,48-63
(Burada 0-15 fiziksel çekirdekler, 32-47 ise aynı çekirdeklerin Hyper-Threading / SMT kardeşleridir).
Adım 2: vCPU’ları Tek Bir Fiziksel NUMA Düğümüne Sabitleyin (Affinity)
Kritik bir veritabanı VM’ine 8 vCPU vereceksek, onu tamamen NUMA Node 0 üzerindeki fiziksel çekirdeklere (örneğin 4-7 ve SMT kardeşleri olan 36-39’a) sabitleyerek L3 önbelleğinin (LLC – Last Level Cache) her zaman sıcak kalmasını sağlayabiliriz:
# Proxmox VE'de 105 ID'li VM'i sadece Node 0 üzerindeki belirli çekirdeklere sabitleme
sudo qm set 105 --affinity 4-7,36-39
Pratik İpucu: Fiziksel sunucunun ilk çekirdeklerini (CPU 0 ve SMT kardeşi CPU 32) asla yüksek yüklü VM’lere sabitlemeyin. Hipervizörün kendi sistem süreçleri ve donanım kesmeleri genellikle ilk çekirdekleri tercih eder.
Adım 3: Çok Yüksek İzolasyon (isolcpus ve nohz_full)
Eğer sanal makinenizde sıfır gecikme toleranslı (ultra-low latency) bir iş yükü çalışıyorsa, fiziksel hipervizörün /etc/default/grub dosyasında bu çekirdekleri ana işletim sistemi zamanlayıcısından tamamen ayırabilirsiniz:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt isolcpus=4-7,36-39 nohz_full=4-7,36-39 rcu_nocbs=4-7,36-39"
3. Ağ ve Depolamada Sıfır Sanallaştırma Yükü: PCIe SR-IOV
Standart KVM mimarisinde en hızlı sanal ağ kartı virtio-net (vhost_net çekirdek hızlandırmasıyla) olsa bile, gelen her paket önce fiziksel NIC’ten hipervizör çekirdeğine, oradan Linux Bridge (vmbr0) veya Open vSwitch katmanına, oradan da tap arayüzü üzerinden sanal makineye kopyalanır. 25GbE ve 100GbE hızlarda bu işlem ciddi bir CPU SoftIRQ yükü oluşturur.
SR-IOV (Single Root I/O Virtualization) teknolojisi ise fiziksel bir ağ kartını (veya kurumsal bir NVMe diski) donanım seviyesinde birden fazla sanal PCIe kartına (VF – Virtual Function) böler. Sanal makineye bağlanan her VF, hipervizör ağ yığınını (vmbr0) tamamen bypass ederek fiziksel switch ile doğrudan DMA (Direct Memory Access) üzerinden konuşur.
| Mimari Katman | VirtIO-Net (vhost_net + Bridge) | PCIe SR-IOV (Virtual Function) |
| Paket Yolu | NIC -> Host Kernel -> Bridge -> TAP -> VM | NIC Donanım Switch -> Doğrudan VM Belleği (DMA) |
| Ağ Gecikmesi (Latency) | ~15 – 35 µs (Mikrosaniye) | ~2 – 5 µs (Bare-Metal seviyesi) |
| Host CPU Yükü (25GbE) | Yüksek (vhost thread’leri çekirdek tüketir) | Sıfıra Yakın (Kesme doğrudan VM içinde işlenir) |
| Canlı Göç (Live Migration) | Tam Destekli (Sorunsuz) | Kısıtlı (Failover/Bonding kurgusu gerektirir) |
Adım 1: IOMMU Passthrough Modunu ve VF Sayısını Aktif Edin
Yukarıdaki GRUB satırında yer alan intel_iommu=on iommu=pt (AMD için amd_iommu=on iommu=pt) parametresi ile sunucuyu açtıktan sonra, fiziksel 25GbE kartınız (örneğin eno1) üzerinde 8 adet donanımsal sanal kart (VF) oluşturalım:
# Kartın desteklediği maksimum Virtual Function (VF) sayısını kontrol edin
cat /sys/class/net/eno1/device/sriov_totalvfs
# Anlık olarak 8 adet bağımsız SR-IOV donanım fonksiyonu (VF) oluşturun
echo 8 | sudo tee /sys/class/net/eno1/device/sriov_numvfs
# Oluşan sanal PCIe cihazlarını doğrulayın
lspci | grep -i ethernet
Adım 2: VF İçin VLAN, MAC ve Güvenlik (spoofchk) Tanımlaması
SR-IOV VF’ini sanal makineye vermeden önce, hipervizör üzerinden MAC adresini sabitlemeli ve gerekiyorsa VLAN etiketini donanım seviyesinde (VST – Virtual Switch Tagging) basmalısınız:
#eno1 altındaki 0 numaralı VF'e sabit MAC, VLAN 200 ve Spoof koruması atama
sudo ip link set eno1 vf 0 mac 02:54:00:1a:2b:3c vlan 200 spoofchk on trust off
Ardından Proxmox VE arayüzünden (Hardware -> Add -> PCI Device) veya /etc/pve/qemu-server/105.conf içerisinden (hostpci0: 0000:3b:02.0,pcie=1) bu VF’i doğrudan sanal makinenize bağlayabilirsiniz.