IIS de CPU Affinity ayarı ve işlemci gruplama

Merhabalar,

IIS 7.5 a kadar olan IIS sürümlerinde, ‘CPU Affinity’ 32 bit makinalar için 32 CPU ve 64 bit makinalar için 64 CPU’ya kadar destekleniyor. ‘CPU Affinity’ ayarı ile ‘application pool’ bazında kullanılacak işlemcileri belirleyip, her bir application pool’a ayrı işlemciyi dedike olarak atayabilirsiniz.

Bu ayar aşağıdaki resimde gösterildiği gibi application pool içerisinden yapılıyor. ‘smpAffinitized’ değeri true olarak set edilirse, ‘Process Affinity Mask’ 32 bitlik değeri application pool’un kullanacağı processor’leri belirtmek için bir ‘mask’ değeri olarak kullanılıyor.

Bu 32 bitlik ‘mask’ değeri IIS konfigürasyonu içerisinde ‘smpProcessorAffinityMask’ değişkeni ile belirtiliyor. Bunun haricinde 64 bitlik serverlarda ikinci bir değer olan ‘smpProcessorAffinityMask2’ değeri ile belirtilecek CPU sayısı 64 ‘e kadar çıkarılabiliyor. Yani 64 bitlik bir serverda bu iki değer de kullanılabilirken 32 bitlik bir application pool da sadece ‘smpProcessorAffinityMask’ değeri bir anlam ifade ediyor. Örneğin; Eğer bu değer ‘0000000000000011’ ise ilk iki bit ‘1’ olduğu için application pool ilk iki processor içerisinde çalışacak demek oluyor.

Yukarıdaki konfigürasyon değişikliği sonrasında applicationhost.config ( IIS konfigürasyon klasörü içerisinde) dosyasında aşağıdaki gibi bu ayar kaydedilmiş olacaktır:

     <system.applicationHost>

        <applicationPools>

            <add name="DefaultAppPool" autoStart="true" enable32BitAppOnWin64="false" managedRuntimeVersion="v2.0" managedPipelineMode="Classic">

                <processModel identityType="ApplicationPoolIdentity" />

                <cpu smpAffinitized="true" smpProcessorAffinityMask="4294967295"/>

Bu değeri daha iyi anlayabilmek için arka planda çalıştırılıyor olan Windows API fonksiyonu olan SetProcessAffinityMask() ‘yi inceleyebilirsiniz.

Fakat diyelim ki 64 processor’dan daha yüksek sayıda CPU’nuz var ve onları da kullanmak istiyorsunuz. Örneğin NUMA mimarisine sahip 80 processor’lü bir server’ınız var. 64 ‘ten fazla işlemciniz varsa eğer bu noktada ‘Processor Group’ ları devreye giriyor.

İşlemci gruplama Windows 7 / Windows Server 2008 R2 sürümleri ve sonraki 64 bitlik sürümlerde desteklenmekte. Bu işletim sistemlerinde Processor’lerinizi gruplara ayırmak için bcdedit.exe kullanabilir yahut bunu manuel olarak registry üzerinden yapabilirsiniz. Gruplamanızıtamamladıktan sonra gine bcdedit.exe kullanarak ‘groupaware’ opsiyonunu aktif hale getirmeniz gerekiyor. Yoksa işletim sistemi çalışan process’leri hep ‘0’ (sıfır) numaralı grupta çalıştırıyor olacak. Bu opsiyon seçili olduğunda işletim sistemi çalıştırılacak her uygulama için uygun grubu bulup uygulamayı o işlemci grubunda çalıştırıyor olacak. Eğer işletim sisteminde process’ler dengeli olarak dağıtılmıyorsa bu güncellemeyi yüklemek isteyebilirsiniz.

Peki uygulamayı işletim sistemi değil de siz kendi istediğiniz grupta nasıl çalıştırabilirsiniz? Bunu yapmak için de bu güncellemeye ihtiyacınız olacak. Bu güncelleme sayesinde komut satırından ilgili uygulamayı başlatırken ek olarak node parametresi ile işlemci grubunu seçebilirsiniz.

start /NODE 1 /AFFINITY 0x3 application1.exe

 Şimdi tekrar IIS ‘e dönelim,

IIS 7.5 ve önceki sürümler için, 'application pool’u hangi işlemci grubunda çağırılacağına dair herhangi bir konfigürasyon elemanı bulunmamakta. Bu dağıtım yukarıda da bahsettiğimiz gibi işletim sistemi seviyesinde ‘groupaware’ aktif ise algoritmik olarak yapılıyor.  Örneğin IIS 7.5 server üzerinde bir application pool için 10 adet worker process açtığımızda makine random seçerek 4 adetini 1. Grup üzerinde diğer 6 adedini 2.Grup üzerinde açabiliyor. Bir application pool restart’ı sonrasında bu dağılım 2-8 şeklinde de gerçekleşebiliyor. Grup seçimini komut satırından da yapamıyoruz çünkü biliyorsunuz ki worker process ‘ler WWW Servisi tarafından başlatılmakta. 

Fakat bu destek IIS 8.0 ile birlikte geliyor gibi görünmekte. IIS 8.0 NUMA donanımları ile uyumlu olarak geliyor. Örneğin Web Gardening’de "Maximum Worker Processes" Application pool ayarını ‘0’ değerine çektiğimizde IIS kaç tane NUMA nodu olduğunu bulup, bu node’larda çalışmak üzere birer application pool yaratıyor.

 

İyi çalışmalar,

Mert Öztürk