MSSQL’de Kaynak Havuzlarını Oluşturma ve Kontrol Etme: Resource Governor ile Performans Yönetimi
Modern veritabanı sistemleri, farklı önceliklere ve kaynak ihtiyaçlarına sahip çok sayıda iş yükünü aynı anda barındırmak zorundadır. OLTP (Online Transaction Processing) sistemleri düşük gecikme süresi isterken, raporlama veya veri analizi (OLAP) iş yükleri yoğun CPU ve bellek tüketebilir. Bu farklı iş yüklerinin aynı sunucuda bir arada çalışması, kaynak çekişmesine ve performans darboğazlarına yol açabilir. SQL Server Resource Governor, bu tür senaryolarda sunucu kaynaklarının (CPU, bellek, I/O) farklı iş yükleri arasında adil ve kontrollü bir şekilde dağıtılmasını sağlayan güçlü bir özelliktir. Bu makalede, Resource Governor’ın ne olduğunu, nasıl çalıştığını ve SQL Server ortamınızda kaynak havuzlarını nasıl oluşturup yöneteceğinizi detaylı bir şekilde inceleyeceğiz.
Resource Governor Nedir ve Neden Önemlidir?
SQL Server Resource Governor, SQL Server 2008 ile tanıtılmış ve sunucu kaynaklarının (CPU, fiziksel G/Ç ve bellek) farklı iş yükleri arasında yönetilmesini sağlayan bir özelliktir. Temel amacı, çeşitli uygulamaların veya kullanıcı gruplarının sunucu üzerindeki etkisini kontrol ederek, kritik iş yüklerinin performansını garanti altına almak ve kaynakların kötüye kullanılmasını engellemektir. Özellikle çok kiracılı (multi-tenant) ortamlar veya aynı sunucuda farklı önceliklere sahip uygulamaların çalıştığı durumlar için hayati öneme sahiptir.
Temel Tanımlar ve Bileşenler
- Kaynak Havuzları (Resource Pools): Sunucu kaynaklarının (CPU, bellek, I/O) mantıksal bölümleridir. Her havuz, belirli bir minimum ve maksimum kaynak yüzdesi ile yapılandırılır.
- İş Yükü Grupları (Workload Groups): Benzer özelliklere sahip oturumların veya isteklerin bir araya getirildiği mantıksal gruplardır. Her iş yükü grubu, bir kaynak havuzuna atanır.
- Sınıflandırma Fonksiyonu (Classifier Function): Gelen her yeni bağlantıyı veya isteği belirli bir iş yükü grubuna yönlendirmek için kullanılan bir kullanıcı tanımlı fonksiyondur. Bu fonksiyon, kullanıcı adı, uygulama adı, IP adresi gibi çeşitli kriterlere göre sınıflandırma yapabilir.
Resource Governor’ın Amacı ve Avantajları
Resource Governor’ın temel amacı, SQL Server’ın kaynaklarını optimize ederek performans istikrarı sağlamaktır. Sağladığı avantajlar şunlardır:
- Performans Garantisi: Kritik iş yükleri için belirli bir minimum kaynak seviyesi garanti ederek performans dalgalanmalarını önler.
- Kaynak Kontrolü: Kaynakları aşırı tüketen sorguların veya uygulamaların diğer iş yüklerini olumsuz etkilemesini engeller.
- Öngörülebilirlik: Kaynak dağıtımını öngörülebilir hale getirerek daha tutarlı bir performans deneyimi sunar.
- İzolasyon: Farklı iş yüklerini mantıksal olarak izole ederek, birinin diğerini etkileme riskini azaltır.
Resource Governor Bileşenleri: Havuzlar, Gruplar ve Sınıflandırma
Resource Governor’ın etkin bir şekilde çalışması için üç ana bileşenin doğru bir şekilde anlaşılması ve yapılandırılması gerekmektedir. Bu bileşenler, sunucu kaynaklarının nasıl ayrılacağını, iş yüklerinin nasıl gruplandırılacağını ve hangi iş yükünün hangi kaynak havuzunu kullanacağını belirler.
Kaynak Havuzları (Resource Pools)
Kaynak havuzları, SQL Server’ın CPU, bellek ve G/Ç kaynaklarının mantıksal bölümleridir. Her SQL Server örneği için varsayılan olarak iki havuz bulunur:
- Internal Pool: SQL Server’ın kendi iç sistem görevleri için ayrılmış havuzdur. Bu havuzun kaynak limitleri değiştirilemez.
- Default Pool: Resource Governor yapılandırılmadığında veya bir isteğin belirli bir iş yükü grubuna atanmadığında kullanılan havuzdur.
Kullanıcı tanımlı havuzlar oluşturarak, belirli iş yükleri için özel kaynak limitleri belirleyebilirsiniz. Önemli parametreler:
MIN_CPU_PERCENT: Havuzun alacağı minimum CPU yüzdesi.MAX_CPU_PERCENT: Havuzun alabileceği maksimum CPU yüzdesi.CAP_CPU_PERCENT: Havuzun hiçbir zaman aşamayacağı mutlak CPU sınırı (SQL Server 2012+).MIN_MEMORY_PERCENT: Havuzun alacağı minimum bellek yüzdesi.MAX_MEMORY_PERCENT: Havuzun alabileceği maksimum bellek yüzdesi.MAX_IOPS_PER_VOLUME: Havuzun her disk birimi başına yapabileceği maksimum G/Ç işlemi sayısı (SQL Server 2014+).
İş Yükü Grupları (Workload Groups)
İş yükü grupları, belirli özelliklere sahip sorguları veya oturumları bir araya getiren mantıksal gruplardır. Her iş yükü grubu, bir kaynak havuzuna atanır. Bu sayede, o gruba ait tüm istekler, atandığı havuzun kaynak limitleri dahilinde çalışır. Varsayılan olarak iki grup bulunur:
- Internal Group: Internal Pool’a atanmıştır.
- Default Group: Default Pool’a atanmıştır.
İş yükü grupları için yapılandırabileceğiniz bazı önemli parametreler:
GROUP_MAX_REQUESTS: Grupta aynı anda çalışabilecek maksimum istek sayısı.REQUEST_MAX_MEMORY_GRANT_PERCENT: Bir isteğin alabileceği maksimum bellek yüzdesi.REQUEST_MAX_CPU_TIME: Bir isteğin çalışabileceği maksimum CPU süresi.MAX_DOP: Bir isteğin kullanabileceği maksimum paralellik derecesi (MAXDOP).
Sınıflandırma Fonksiyonu (Classifier Function)
Sınıflandırma fonksiyonu, Resource Governor’ın “beyni” gibidir. Gelen her yeni bağlantıyı değerlendirir ve onu uygun iş yükü grubuna yönlendirir. Bu fonksiyon, sys.fn_resourcegovernor_get_classification_info() gibi yerleşik fonksiyonları veya APP_NAME(), SUSER_NAME(), HOST_NAME(), IS_MEMBER() gibi sistem fonksiyonlarını kullanarak dinamik kararlar verebilir. Fonksiyonun dönüş değeri, bir iş yükü grubunun adıdır. Eğer bir grup adı döndürülmezse veya geçersiz bir grup adı döndürülürse, istek Default Group’a atanır.
Kaynak Havuzları ve İş Yükü Grupları Oluşturma
Resource Governor’ı yapılandırmanın ilk adımı, kaynak havuzlarını ve iş yükü gruplarını tanımlamaktır. Bu bölümde, örnek senaryolar üzerinden bu bileşenlerin nasıl oluşturulacağını ve yapılandırılacağını inceleyeceğiz.
Yeni Kaynak Havuzu Oluşturma
Diyelim ki, sunucumuzda hem yüksek öncelikli OLTP uygulamaları hem de daha düşük öncelikli raporlama ve analiz iş yükleri çalışıyor. Bu iki iş yükü için ayrı kaynak havuzları oluşturalım:
-- Resource Governor'ı etkinleştirmeden önce değişiklikleri yapın
-- CREATE RESOURCE POOL [OLTP_Pool] WITH (
-- MIN_CPU_PERCENT = 30,
-- MAX_CPU_PERCENT = 70,
-- CAP_CPU_PERCENT = 80, -- CPU kullanımını %80 ile sınırla
-- MIN_MEMORY_PERCENT = 30,
-- MAX_MEMORY_PERCENT = 70,
-- MAX_IOPS_PER_VOLUME = 1000 -- Her birim için 1000 IOPS ile sınırla
-- );
-- CREATE RESOURCE POOL [Reporting_Pool] WITH (
-- MIN_CPU_PERCENT = 10,
-- MAX_CPU_PERCENT = 40,
-- CAP_CPU_PERCENT = 50, -- CPU kullanımını %50 ile sınırla
-- MIN_MEMORY_PERCENT = 10,
-- MAX_MEMORY_PERCENT = 40,
-- MAX_IOPS_PER_VOLUME = 500 -- Her birim için 500 IOPS ile sınırla
-- );
-- Örnek kodda Resource Governor'ı devre dışı bırakıp sonra etkinleştireceğiz.
-- Bu yüzden CREATE komutlarını yorum satırı yaptım.
-- Gerçek senaryoda bu komutları doğrudan çalıştırabilirsiniz.
Yukarıdaki örnekte, OLTP_Pool daha fazla CPU, bellek ve I/O kaynağına erişim sağlarken, Reporting_Pool daha kısıtlı kaynaklarla çalışacaktır.
Yeni İş Yükü Grubu Oluşturma ve Havuzla Eşleştirme
Şimdi bu havuzlarla ilişkilendireceğimiz iş yükü gruplarını oluşturalım:
-- CREATE WORKLOAD GROUP [OLTP_Group]
-- WITH (
-- GROUP_MAX_REQUESTS = 100, -- Aynı anda maksimum 100 istek
-- REQUEST_MAX_MEMORY_GRANT_PERCENT = 50, -- Bir isteğin alabileceği max bellek
-- MAX_DOP = 4 -- Maksimum paralellik derecesi
-- )
-- USING [OLTP_Pool];
-- CREATE WORKLOAD GROUP [Reporting_Group]
-- WITH (
-- GROUP_MAX_REQUESTS = 20, -- Aynı anda maksimum 20 istek
-- REQUEST_MAX_MEMORY_GRANT_PERCENT = 20,
-- MAX_DOP = 1 -- Paralel sorgulara izin verme
-- )
-- USING [Reporting_Pool];
Bu gruplar, hangi uygulamaların veya kullanıcıların hangi havuzu kullanacağını belirleyecek. Örneğin, OLTP_Group üyeleri OLTP_Pool'un kaynaklarını kullanırken, Reporting_Group üyeleri Reporting_Pool'un kaynaklarını kullanacaktır.
Kaynak Havuzlarını ve İş Yükü Gruplarını Güncelleme ve Silme
Mevcut havuz veya grupların parametrelerini değiştirmek için ALTER komutunu, silmek için ise DROP komutunu kullanabilirsiniz:
-- Kaynak havuzunu güncelleme
-- ALTER RESOURCE POOL [Reporting_Pool] WITH (MAX_CPU_PERCENT = 60);
-- İş yükü grubunu güncelleme
-- ALTER WORKLOAD GROUP [Reporting_Group] WITH (MAX_DOP = 2);
-- İş yükü grubunu silme (önce grubun boş olduğundan emin olun)
-- DROP WORKLOAD GROUP [Reporting_Group];
-- Kaynak havuzunu silme (önce havuzun boş olduğundan emin olun)
-- DROP RESOURCE POOL [Reporting_Pool];
Değişikliklerin uygulanması için her zaman ALTER RESOURCE GOVERNOR RECONFIGURE komutunu çalıştırmanız gerektiğini unutmayın.
Sınıflandırma Fonksiyonu ile İstekleri Yönlendirme
Kaynak havuzları ve iş yükü grupları oluşturulduktan sonra, Resource Governor'ın gelen bağlantıları doğru gruplara atamasını sağlamak için bir sınıflandırma fonksiyonu tanımlamamız gerekir.
Sınıflandırma Fonksiyonu Oluşturma ve Atama
Bu fonksiyon, SQL Server'a bağlanan her oturum için çalışır ve oturumu belirli bir iş yükü grubuna yönlendirir. Aşağıdaki örnek, uygulama adına göre sınıflandırma yapar:
-- Resource Governor'ı devre dışı bırakın
ALTER RESOURCE GOVERNOR DISABLE;
GO
-- Kaynak havuzlarını oluşturun
CREATE RESOURCE POOL [OLTP_Pool] WITH (
MIN_CPU_PERCENT = 30,
MAX_CPU_PERCENT = 70,
CAP_CPU_PERCENT = 80,
MIN_MEMORY_PERCENT = 30,
MAX_MEMORY_PERCENT = 70
);
GO
CREATE RESOURCE POOL [Reporting_Pool] WITH (
MIN_CPU_PERCENT = 10,
MAX_CPU_PERCENT = 40,
CAP_CPU_PERCENT = 50,
MIN_MEMORY_PERCENT = 10,
MAX_MEMORY_PERCENT = 40
);
GO
-- İş yükü gruplarını oluşturun
CREATE WORKLOAD GROUP [OLTP_Group]
WITH (
GROUP_MAX_REQUESTS = 100,
REQUEST_MAX_MEMORY_GRANT_PERCENT = 50,
MAX_DOP = 4
)
USING [OLTP_Pool];
GO
CREATE WORKLOAD GROUP [Reporting_Group]
WITH (
GROUP_MAX_REQUESTS = 20,
REQUEST_MAX_MEMORY_GRANT_PERCENT = 20,
MAX_DOP = 1
)
USING [Reporting_Pool];
GO
-- Sınıflandırma fonksiyonunu oluşturun
CREATE FUNCTION dbo.fn_ResourceGovernorClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @WorkloadGroup SYSNAME;
IF APP_NAME() = 'MyOLTPApp'
SET @WorkloadGroup = 'OLTP_Group';
ELSE IF APP_NAME() LIKE '%Report%'
SET @WorkloadGroup = 'Reporting_Group';
ELSE
SET @WorkloadGroup = 'default'; -- Diğerleri varsayılan gruba
RETURN @WorkloadGroup;
END;
GO
-- Sınıflandırma fonksiyonunu Resource Governor'a atayın
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = 'dbo.fn_ResourceGovernorClassifier');
GO
-- Resource Governor'ı etkinleştirin ve değişiklikleri uygulayın
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
Bu örnekte, eğer uygulama adı 'MyOLTPApp' ise, oturum OLTP_Group'a, eğer uygulama adı '%Report%' içeriyorsa Reporting_Group'a atanır. Aksi takdirde, default grubuna yönlendirilir. Uygulama adını, bağlantı dizenizde Application Name=MyOLTPApp; şeklinde belirtebilirsiniz.
Fonksiyonu Test Etme ve İzleme
Sınıflandırma fonksiyonunun doğru çalıştığını ve isteklerin beklenen gruplara atandığını doğrulamak için aşağıdaki DMV'leri kullanabilirsiniz:
-- Hangi oturumun hangi gruba atandığını görmek için
SELECT
s.session_id,
s.login_name,
s.host_name,
s.program_name,
g.name AS workload_group_name,
p.name AS resource_pool_name
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_resource_governor_workload_groups AS g
ON s.group_id = g.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS p
ON g.pool_id = p.pool_id
WHERE s.is_user_process = 1;
-- Kaynak havuzlarının anlık durumunu görmek için
SELECT * FROM sys.dm_resource_governor_resource_pools;
-- İş yükü gruplarının anlık durumunu görmek için
SELECT * FROM sys.dm_resource_governor_workload_groups;
Resource Governor'ı Yönetme, İzleme ve En İyi Uygulamalar
Resource Governor'ı kurmak sadece başlangıçtır; etkili bir şekilde yönetmek ve performansını izlemek sürekli bir süreçtir. Bu bölüm, Resource Governor'ı etkinleştirme, izleme ve en iyi uygulamaları ele alacaktır.
Resource Governor'ı Etkinleştirme ve Devre Dışı Bırakma
Tüm yapılandırma değişiklikleri yapıldıktan sonra, Resource Governor'ı etkinleştirmeniz gerekir. Bu, ALTER RESOURCE GOVERNOR RECONFIGURE komutu ile yapılır. Bu komut, Resource Governor'ın yeni yapılandırmayı yüklemesini ve uygulamaya başlamasını sağlar. Resource Governor'ı tamamen durdurmak için ise ALTER RESOURCE GOVERNOR DISABLE komutunu kullanabilirsiniz.
-- Resource Governor'ı etkinleştirme
ALTER RESOURCE GOVERNOR RECONFIGURE;
-- Resource Governor'ı devre dışı bırakma
-- ALTER RESOURCE GOVERNOR DISABLE;
Performansı İzleme
Resource Governor'ın etkinliğini değerlendirmek için düzenli izleme şarttır. Kullanabileceğiniz araçlar ve DMV'ler şunlardır:
- DMV'ler:
sys.dm_resource_governor_resource_pools: Kaynak havuzlarının anlık CPU, bellek ve I/O istatistiklerini gösterir.sys.dm_resource_governor_workload_groups: İş yükü gruplarının anlık istatistiklerini, kaç isteğin kuyrukta beklediğini, kaçının çalıştığını gösterir.sys.dm_exec_requests: Çalışan isteklerin hangi gruba ait olduğunu görmek içingroup_idsütununu kullanın.
- Performans Sayaçları (Performance Monitor): SQL Server Resource Governor nesnesi altında CPU, bellek ve I/O ile ilgili detaylı sayaçlar bulunur.
- Extended Events: Resource Governor ile ilgili olayları (örneğin, bir isteğin bir gruba atanması, kaynak kısıtlamaları) izlemek için Extended Events oturumları oluşturabilirsiniz.
En İyi Uygulamalar
Resource Governor'ı uygularken dikkate almanız gereken bazı en iyi uygulamalar:
- Küçük Adımlarla Başlayın: Tüm iş yüklerini aynı anda yönetmeye çalışmak yerine, en kritik veya en sorunlu iş yüklerinden başlayın.
- Test Ortamında Deneyin: Canlı bir üretim ortamında Resource Governor'ı doğrudan uygulamadan önce, bir test ortamında kapsamlı bir şekilde test edin.
- İzleme ve Ayarlama: Kurulumdan sonra sürekli izleme yapın ve performans verilerine göre havuz ve grup ayarlarını gerektiğinde ayarlayın.
- CAP_CPU_PERCENT Kullanımı: Bir havuzun CPU kullanımını mutlak bir üst sınırla kısıtlamak için
CAP_CPU_PERCENTkullanın. Bu, diğer havuzlar boşta olsa bile o havuzun belirlenen sınırı aşmamasını sağlar. - Sınıflandırma Fonksiyonunu Basit Tutun: Sınıflandırma fonksiyonu her bağlantı için çalıştığından, mümkün olduğunca basit ve hızlı olmalıdır. Karmaşık mantıklar performans düşüşüne neden olabilir.
- IOPS Limitlemesi: Özellikle paylaşımlı depolama ortamlarında G/Ç çekişmesini önlemek için
MAX_IOPS_PER_VOLUMEparametresini kullanın.
Sonuç
SQL Server Resource Governor, karmaşık ve dinamik veritabanı ortamlarında kaynak yönetimini optimize etmek için vazgeçilmez bir araçtır. Kaynak havuzları, iş yükü grupları ve sınıflandırma fonksiyonu gibi bileşenleri doğru bir şekilde yapılandırarak, farklı iş yüklerinin performansını garanti altına alabilir, kaynak çekişmesini azaltabilir ve sunucu istikrarını artırabilirsiniz. Başlangıçta biraz öğrenme eğrisi olsa da, Resource Governor'ın sunduğu kontrol ve öngörülebilirlik, özellikle yüksek performans gerektiren ve çeşitli iş yüklerini barındıran sistemler için uzun vadede büyük faydalar sağlayacaktır. Unutmayın, etkili bir Resource Governor uygulaması, sürekli izleme, test etme ve ayarlama gerektirir.
SSS (Sık Sorulan Sorular)
Resource Governor hangi SQL Server sürümlerinde kullanılabilir?
Resource Governor, SQL Server 2008 ve sonraki tüm sürümlerinde mevcuttur. Ancak, bazı özellikler (örneğin, CAP_CPU_PERCENT, MAX_IOPS_PER_VOLUME) belirli sürümlerde eklenmiştir.
Resource Governor CPU ve belleği nasıl yönetir?
Resource Governor, CPU için zamanlayıcıları, bellek için ise bellek ayırıcılarını (memory clerks) kullanarak kaynakları yönetir. Belirlenen yüzdelere göre, bir havuzun alabileceği minimum ve maksimum CPU/bellek miktarını belirler. MIN_CPU_PERCENT ve MIN_MEMORY_PERCENT garanti edilen kaynakları sağlarken, MAX_CPU_PERCENT ve MAX_MEMORY_PERCENT o havuzun kullanabileceği üst sınırı belirler.
IOPS yönetimi nasıl yapılır?
SQL Server 2014 ve sonraki sürümlerde, MAX_IOPS_PER_VOLUME parametresi ile her bir kaynak havuzu için disk G/Ç işlemlerine (IOPS) bir üst sınır getirebilirsiniz. Bu, özellikle aynı depolama birimini kullanan farklı iş yüklerinin birbirini olumsuz etkilemesini önlemek için kullanışlıdır.
Resource Governor'ı devre dışı bırakmak mümkün müdür?
Evet, ALTER RESOURCE GOVERNOR DISABLE; komutu ile Resource Governor'ı geçici olarak devre dışı bırakabilirsiniz. Bu durumda, tüm istekler default grubuna atanır ve default havuzunun kaynaklarını kullanır.
Bir istek hangi iş yükü grubuna düşeceğini nasıl belirler?
Bir istek sunucuya ulaştığında, eğer bir sınıflandırma fonksiyonu tanımlanmışsa, bu fonksiyon çalıştırılır. Fonksiyonun döndürdüğü iş yükü grubu adına göre istek o gruba atanır. Eğer bir sınıflandırma fonksiyonu yoksa veya fonksiyon bir grup adı döndürmezse, istek otomatik olarak default iş yükü grubuna atanır.
