vSphere – CPU and NUMA
NUMA konusunda birçok yazı yazıldı, çizildi, benim de bu konuda bir katkım olsun istedim. Sizlere basit örnekler ile NUMA nın nasıl çalıştığını sanal makine oluştururken neye dikkat etmeniz gerektiğini ve yenilik olarak vSphere 6.x ile neyin değiştiğini anlatmak istedim.
Bu konu sanal ortam uzmanları için gerçekten çok önemli. Yapılan hatalar özellikle kritik iş yüklerini çalıştıran sanal sunucuda ciddi performans kaybına neden olabilir. Yazının ilk bölümü NUMA nedir, nasıl çalışır bunu anlatacağım. Diğer bölümde ise örnekler üzerinde duracağız.
Numa nedir?
Açılımı Non Unified Memory Access. Yani CPU unun memory erişimini optimize eden bir teknolojidir. Her CPU, bir memory controller üzerinden memory e erişir ve her CPU bir NUMA node içerisinde tutulur ki, kendisine uzak kalan memory e erişmesin, kendi lokalindeki memory e erişsin, böylelikle işlemler daha hızlı bir şekilde tamamlansın. Eğer bir CPU, uzaktaki memory modüllerini kullanırsa, o zaman CPU daki işler bir nebze daha yavaş tamamlanacaktır. Çünkü kendisine atanan memory ‘de değil, uzaktaki memory ‘de işlerini görecektir.
ESXi NUMA Scheduler
Aşağıdaki resim üzerinden NUMA ve ESXi NUMA Scheduler servisini anlatalım:
- Elinizde iki soketli bir fiziksel sunucu var. Varsayılan olarak bu makinede iki NUMA node açılır. Bunlara NUMA Home Node denilir.
- Her NUMA Home Node kendine atanmış CPU ve Memory modüllerinden oluşur.
- Şu ana kadar sanallaştırmayı işin içine dahil etmedik. Şimdi bu sunucuya ESXi işletim sistemini kurduğumuzu varsayalım. İlk olarak bilmemiz gereken servis, ESXi NUMA Scheduler.
- ESXi NUMA Scheduler, CPU ya gelen işleri ilgili NUMA node içerisinde atanmış memory ‘i kullanarak tamamlamaya çalışır. Bu varsayılan davranıştır.
- Bu ortamda bir sanal makine açtığınızda ESXi NUMA Scheduler bu makineyi ilgili NUMA home node içerisinde dinamik olarak konumladırmaya çalışır. Çalışır diyorum çünkü bu sanal makineye vereceğiniz vCPU ve memory bunu belirleyecektir.
- Ayrıca dinamik dedik ya, mesela aynı NUMA home node içerisinde birden fazla VM denk geldi, diğer NUMA Home node biraz daha boş. Bu durumda sanal makineleri çalışırken siz fark etmeden diğer NUMA node içerisine de taşıyabilir. Dinamikliği buradan geliyor.
Şimdi sanal ortamda olay nasıl oluyor biraz daha detaylandıralım.
Yine bir resim üzerinde anlatalım.
- Sanal makineye vCPU ve vSocket ataması yapıyoruz.
- Makineyi poweron dediğimizde VMKernel devreye giriyor.
- VMKernel bu sanal CPU ve sanal socketi gerçek dünya ile ilişkilendiriyor. Bu makinenin çalışacağı fiziksel soketi ve NUMA home node ESXi NUMA Scheduler aracılığıyla belirleniyor. Sonra “bir full core da mı yoksa hyperthread yani logical processor de mi?” işlem görecek bu belirleniyor.
- ESXi, kernel seviyesinde bir sanal makineniye ait vCPU ve memory gruplayıp, buna NUMA Client adını verir. Mesela yukarıdaki tabloda VM1 bire ait NUMA Client bir core a sığıyor, ama VM3 e atanmış vCPU daha fazla dolayısıyla ona ait NUMA client daha büyük olacaktır, çünkü iki core kullanıyor.
- Biraz da performans gözlüğüyle bakalım: Yukarıdaki örnekte yer alan 3 sanal makine de mevcut NUMA Home Node içerisine sığabiliyor, dolayısıyla performans istenilen düzeyde, yani sorun yok.
Bir sonraki yazımda Wide VM, vNUMA ve optimizasyon konularını anlatacağım.