Bilişim sistemlerinin kalbi olan merkezi işlem birimleri (CPU), bellek yapıları ve ağ bağlantıları, sistemin verimliliğini belirleyen temel sütunlardır. Özellikle kurumsal düzeydeki sunucularda bu bileşenlerin takibi, iş sürekliliği ve darboğazların tespiti açısından kritiktir. Bir Windows işletim sistemi üzerinde “Görev Yöneticisi” aracılığıyla izlenen veriler, donanımın ham gücü ile yazılımın bu gücü ne kadar efektif kullandığını bir ayna gibi yansıtır. Bu makale, bir Intel Xeon Gold sistemine ait performans verileri üzerinden modern işlemci ve bellek terminolojisini detaylandırmaktadır.

Kullanım (Utilization): İşlemcinin o anki toplam kapasitesinin ne kadarının aktif olarak çalıştırıldığını yüzde cinsinden ifade eder. Görselde %43 seviyesindeki kullanım, sistemin ciddi bir yük altında olduğunu ancak hala rezerv kapasitesinin bulunduğunu gösterir.
Hız (Speed): İşlemcinin o saniye içindeki çalışma frekansıdır. İşlemcinin temel hızı 2,10 GHz olmasına rağmen, 2,57 GHz hızında çalışması, sistemin “Turbo Boost” gibi teknolojilerle performansı artırdığını gösterir.
Yuvalar (Sockets): Anakart üzerindeki fiziksel işlemci sayısıdır. Görselde 4 adet fiziksel işlemci bulunmaktadır.
Çekirdekler (Cores): Her bir fiziksel işlemcinin içindeki bağımsız işlem birimleridir. Toplam 96 çekirdek, sistemin aynı anda 96 farklı ağır işi donanımsal düzeyde bölebildiğini gösterir.
Mantıksal İşlemciler (Logical Processors): Hyper-Threading teknolojisi sayesinde her çekirdeğin iki iş parçacığını yönetmesidir. Toplam 192 mantıksal işlemci, yazılımların bu sistemi 192 çekirdekliymiş gibi görmesini sağlar.
Yukarıda bulunan processes bölümü makina üzerinde kaç farklı uygulama çalıştığını gösterir. Bunlar sqlserver-resimprogramı-IIS- antivirüs vs.. programlardır.
Microsoft’un resmi hesaplama mantığı:
- CPU sayısı 4 ten küçükse: CPU başına 512 thread kullanılır.
- CPU sayısı 4 ten büyükse: İlk 4 CPU için 2048 thread + her ek CPU için 256 thread
Maksimum worker thread = 2048 + (192 – 4) * 256=50176 Tread kullanılabilir.
Thread Dağılım Örneği:
| Thread Türü | Tahmini Sayı | Açıklama |
|---|---|---|
| Aktif Sorgular | 1,200 | Şu anda çalışan sorgular |
| Idle Threads | 6,000 | Beklemedeki thread’ler |
| Sistem Görevleri | 225 | Backup, Index, Maintenance |
CPU sunucu üzerindeki tüm işlemler için ortaktır. Bir tread cpu da en fazla 20 mili saniye olarak çalıştırılır. sonra sıradakine yer açar. 4 milisaniyede olabilir. 1 paralel işlemci = 1 thread = 1 logical CPU kullanımıdır.
Ama bu, “her thread bir anda kesinlikle bir çekirdeği işgal eder” demek değildir. Kuyruk yapısına göre sıralı bir şekilde gelmektedir.
Sorgu Maliyet ve MAXDOP Mantığı:
Senaryo:
• MAXDOP = 8 → Her sorgu paralel plan kullandığında maksimum 8 CPU/thread kullanabilir.
• 30 eş zamanlı sorgu geldi.
• Sanal olarak: 30 x 8 = 240 thread gerekiyor. Bu yapı 240 cpu demek değildir. Yani hepsi aynı anda aktif thread olamaz. Ama sistem çalışmaya devam eder. Neden?
Cevap: SQL Server Thread Scheduler (Planlayıcı) ve Kuyruklama Sistemi
SQL Server, Windows’un thread yönetimiyle birlikte “cooperative scheduling” kullanır. Yani:
• İstenen kadar thread açılır, ama bunlar çekirdeklere sırayla atanır.
• Eğer tüm CPU’lar meşgulse, yeni thread’ler bekler → bir kuyruk oluşur.
• Çalışan thread bitince, sıradaki thread onun yerine geçer.
Yani işlemci doldu diye sistem durmaz, ama işlemci kuyrukları uzar → sorguların tamamlanma süresi artar, performans düşer.
Bu Durumda Ne Olur?
• 192 CPU varsa → aynı anda maksimum 192 thread çalışabilir.
• 240 thread gerekiyorsa:
• 192 thread aktif olur,
• 48 thread bekler (kuyrukta),
• Zamanla yer değiştirerek hepsi çalışır.
Bu, kullanıcının gözünde:
• CPU %100’e yaklaşır, sorgular yavaş çalışır, bazen timeout bile olur.
Handle, bir işlem (process) tarafından işletim sistemi kaynaklarına erişmek için kullanılan benzersiz tanımlayıcıdır.
Bir program (örneğin SQL Server):
• Bellek kullanır
• Dosya açar
• TCP bağlantısı kurar
• Event, semaphore, mutex gibi senkronizasyon nesneleriyle çalışır
• Registry okur
• vs…
Her bu tür erişim için Windows, o işleme bir handle verir. Yani handle, SQL Server’ın işletim sisteminden “şu kaynağı bana ver” dediğinde aldığı “fiş” gibidir. Handle, bir nesneye erişim için kullanılan kimliktir.
İşlemci (CPU) çok hızlıdır, ancak ana bellek (RAM) ona göre çok yavaştır. İşlemci her seferinde veriyi RAM’den beklerse performansı düşer. Bu yüzden işlemcinin hemen yanına yerleştirilen ve verileri önceden depolayan çok hızlı birimlere Önbellek (Cache) denir.
- L1 Cache : İşlemci çekirdeklerine en yakın, en hızlı ama en küçük kapasiteli bellektir. Görselde 6,0 MB olarak görünüyor. Bu seviye, işlemcinin o saniye işleyeceği komutları tutar. Buradaki veri transferi neredeyse ışık hızındadır. Kapasitesinin düşük olması normaldir çünkü maliyeti çok yüksek ve fiziksel olarak işlemci çekirdeğinin tam içindedir.
- L2 Cache: L1’den biraz daha yavaş ama daha büyük kapasitelidir. Görseldeki 96,0 MB gibi oldukça yüksek bir değer var. Bu, modern Xeon Gold serisinin gücünü gösterir. L1’de bulunamayan veri burada aranır. Çekirdek başına ayrılan özel bir tampon bölge gibidir.
- L3 Cache: Tüm çekirdeklerin ortaklaşa kullandığı en büyük önbellek havuzudur. Sistemimizde 143 MB L3 önbellek mevcut. Bu rakam muazzamdır. L3 önbelleğinin büyük olması, özellikle büyük veri tabanları (SQL Server gibi) veya karmaşık hesaplamalarda işlemcinin RAM’e gitme ihtiyacını azaltır.
L1’den L3’e doğru gidildikçe hız azalır, kapasite artar. Eğer işlemci aradığı veriyi L1’de bulursa en yüksek performansa ulaşır (buna “Cache Hit” denir). Eğer hiçbirinde bulamazsa RAM’e gitmek zorunda kalır ki bu işlemci için “kaplumbağa hızı” demektir. Önbellek miktarı ne kadar fazlaysa, sistemdeki “gecikme” o kadar düşük olur. Yukarıdaki resimde bulunan değerler, bu makinenin aynı anda binlerce talebi çok kısa sürede işleyebilecek bir donanım mimarisine sahip olduğunu kanıtlıyor. Bu değerler işlemcinin “kısa süreli hafızası”dır. Hafıza ne kadar büyük ve hiyerarşik olarak düzenliyse, sistem o kadar az “bekleme” yapar.
Veri her zaman hiyerarşik bir yol izler. İşlemci bir veriye ihtiyaç duyduğunda şu sırayla bakar:
- L1 Cache: Bulamazsa (Cache Miss),
- L2 Cache: Bulamazsa,
- L3 Cache: Bulamazsa,
- RAM (Ana Bellek): Buradan veriyi çeker ve geçerken tüm Cache katmanlarına bir kopyasını bırakır.
Bir veri az önce kullanıldıysa, muhtemelen çok yakında tekrar kullanılacaktır.” İşlemci, az önce kullandığı bir değişkeni veya komutu RAM’e geri göndermek yerine en hızlı erişebileceği L1 veya L2 içinde tutar.
Bir veriye erişildiyse, muhtemelen onun hemen yanındaki verilere de erişilecektir.” Örneğin, bir veri tabanı tablosunda bir satırı okuyorsanız, işlemci sadece o satırı değil, RAM’deki o bloğun tamamını (Cache Line) önbelleğe çeker.
İşlemci içindeki Cache Controller, çalışan yazılımın (örneğin SQL Server’ın) veri okuma alışkanlıklarını izler. Eğer sürekli 1, 3, 5, 7 şeklindeki adreslerden veri okuyorsanız, işlemci “Bir sonraki veri muhtemelen 9 numaralı adreste” der ve siz daha o veriyi istemeden RAM’den çekip L3 veya L2 önbelleğine koyar. Eğer işlemci bir komutu işlemek için o veriye hemen ihtiyaç duyuyorsa, bu veri “öncelikli” olarak en üst seviye önbelleğe alınır.
Önbellekler (L1, L2, L3) çok küçüktür ve hemen dolar. Yeni bir veri gelmesi gerektiğinde hangisinin silineceğine genellikle LRU (Least Recently Used – En Son Kullanılan) algoritması karar verir. En uzun süredir kimse bu veriye dokunmadıysa, onu dışarı at (RAM’e geri yaz veya sil) ve yeni veriye yer aç.
Başka makalede görüşmek dileğiyle..
“İlminle övünme, Şeytan’a bak!” Araf-12
