Numa Nodes, MAX/MIN Server Memory, Lock Pages In Memory, MAXDOP

Bu makalede Numa Node’ lu bir sistemde yapılması gereken ayarları inceleyeceğiz. Ama bu Numa Node’u olmayan sistemlerde bu ayarların yapılmayacağı anlamına gelmiyor. Makalede okuyacağınız ayarların hepsi, aslında her sistemde yapılması gereken ayarlar. Konuya Numa Node ile girmemizin sebebi, Numa Node devreye girdiğinde bu ayarların daha kritik bir hale gelmesi.

Bir sistemdeki CPU sayısı ve saat hızıNot1 arttığında, Memory anlamında darboğazlar başlar. Artan CPU ve saat hızı nedeniyle artan işlemler, tek memory bus üzerinde bir çekişme haline girerler. Bu yüzden memory’de bazı beklemeler yaşanmaya başlar. Numa, bunu önlemek için tasarlanmış bir yapı olarak karşımıza çıkıyor. Örnekleme üzerinden gidecek olursak 64 CPU‘ya sahip bir sistem olduğunu düşünelim. Sistemde 8 tane numa Node’u olsun. Böylelikle her numa node’unda 8 tane CPU olur. Ve bu 8 CPU’lu numa node’u için kendine ayrılmış özel bir memory tahsis edilir. Her numa node’un kendi içersindeki memory’e local memory denir. Diğer node lar üzerindeki memory’e ise foreign memory denir.  Ve numa node ları üzerindeki her memory grubu kendine ait memory bus üzerindedir. Var olan cpu sayısının bölünmesi ve bu bölünen CPU grubuna memory tahsis edilmesiyle birlikte memory darboğazımız aşılmış olur. Artık her numa node’una ait CPU üzerinde çalışan işlem çalıştığı numa node’un kendine ait olan memory bus’ı üzerine gidecek ve latency azalacaktır. 

Aşağıda, maddeler halinde Numa Node’u olan bir sistemde yapılması gerekenleri listeledim:

1.  MAX SERVER MEMORY ve MIN SERVER MEMORY

Aynı olacak şekilde set edilmelidir.

Bu şekilde set edildiğinde SQL Server’da memory allocate ve deallocate işlemleri yapılmayacaktır. MAX SERVER MEMORY’nin set edilmesiyle, sql server’ın memory’i eşit bir şekilde numa nodelarına dağıtması için elinde daha iyi bir değer olur. Ve bu da  Foreign Page gerekliliğini azaltarak sorguların performansına etki eder.Not2

 

2.  Lock Pages In Memory

SQL Server Service hesabına gerekli hak verilmelidir.

Bu şekilde SQL Server’ın sahip olduğu memory’nin windows’a geri verilmesi engellenmiş olur.Lock pages in memory Windows üzerindeki bir özelliktir. SQL Server servis hesabına Windows üzerinde gerekli hak verildiğinde sql server, buffer pool için windows’tan aldığı memory’i bir daha windows’a geri iade etmez. Lock pages in memory ayarlarını yaparken de windows’a gerekli ram miktarını bırakmalısınız. Bu konuda dikkat edilmesi gerekenleri Not2’de belirttim. Aşağıdaki şekilde gerekli hakkı verebilirsiniz.

 

Lock pages in memory üzerinde sağ tıklayıp properties dedikten sonra sql server servis hesabını tanımlıyoruz.

Ek bir bilgi paylaşımı olarak Lock pages in memory’nin enable ettikten sonra large page extensions’ı da aktif hale getirebilirsiniz. Bunun için 834 numaralı trace flag’ı startup parametlerine eklemeniz gerekiyor. Ama large page kullanımını aktif hale getirmek sisteminiz için ne kadar gerekli, faydaları ve sakıncaları nelerdir, memory nizdeki large page büyüklüğünü nasıl öğrenebilirsiniz? Bunlar başka bir makalenin konusu olabilir.

3.  MAXDOP, her bir numa node’undaki CPU sayısını geçmemelidir. Bu şekilde bütün numa node’larının eş zamanlı daha verimli çalışması sağlanır. MAXDOP, numa node içersindeki cpu sayısını geçmediği takdirde gelen sorgu büyük olasılıkla local memory’i kullanacaktır. Ve buda Foreign Page gerekliliğini azaltarak sorguların performansına etki edecektir. Tabi bu MAXDOP’u numa node’u içersindeki CPU sayısı kadar set edelim anlamına da gelmiyor. MAXDOP ayarı sistemin türüne göre yapılmalıdır. OLTP sistemlerde genelde bu değer 1 olur. Önemli bir ayrıntı olarak MAXDOP 0 olarak ta set edilmemeli. Çünkü 0 olduğunda, sorgu, sunucudaki CPU sayısı kadar paralel çalışabilir anlamına geliyor, bu da 3. Maddenin başında belirttiğimiz gibi istenilen bir şey değil.

Aşağıdaki sorguyla SQL Server 2012 için Foreign Node Memory, Free Node Memory ve Total Node Memory bilgilerini öğrenebilirsiniz.

select  counter_name , cntr_value / 1024 memory_mb ,
        instance_name,*from    sys.dm_os_performance_counters
where  [object_name] like '%SQLServer:Memory Node%'

Yukarıdaki script’i öncelikle where koşulu olmadan çalıştırıp SQLServer yazan yere ne yazacağınızı belirleyip daha sonra where koşulunu kullanarak çalıştırmalısınız.

Not1: Clock speed(saat hızı), işlemcinin bir komutu işleyebileceği en küçük an dilimidir. İşlemci, saat hızının artmasıyla bir işlemi daha kısa sürede tamamlayabilir.

Not2: Eğer sunucuda birden fazla instance kullanıyorsanız, ya da SQL Server A/P,A/P Failover Cluster yapıda çalışıyorsa, lock pages in memory ve MIN SERVER MEMORY’i set ederken instance’ların kullandıkları memory’nin toplamına dikkat etmelisiniz. Always On için ise böyle bir sıkıntı yok. Çünkü primary ve secondary olmak üzere her iki sunucuda da 1 instance olacak şekilde Always On yapısını kullanabilirsiniz. Ayrıca bahsettiğim tüm yapılar için geçerli olmak üzere  windows’a gerekli ram miktarını bırakmalısınız. Aksi takdirde Windows memory darboğazı yaşayıp sistemi restart edebilir. Özellikle reporting services, analysis services çalışıyorsa ya da uygulamalar veritabanı sunucusu üzerinden hizmet veriyorsa buna daha çok dikkat etmek gerekir. (Bu hiç tavsiye edilmez) Bu özelikleri set etmeden önce Resource Monitor’den hangi uygulamanın/servisin ne kadar ram kullandığına bakabilirsiniz. Sistemin memory anlamında bir düzensizlik yaşamaması için Available Mbytes perfmon counter’ını SCOM ile takip etmelisiniz. Sistemde memory anlamında bir baskı olduğunda baskıya neden olan uygulamayı/servisi bulup İşletim Sistemini bu baskıdan kurtarabilirsiniz.

Loading

Leave Your Comment