Bu makalede Sql Server ’da kaynak kullanımımız için farklı seçenekler ve değerlendirme fırsatları sunan Resource Governor yakından kullanım örneklerini göreceğiz.
Günümüzde sistemlerimizin verimli kaynak kullanımı ve buna yönelik olarak çalışmalar oldukça önemli bir durumdadır. Bu kapsamda Veri tabanı sistemlerimizin kurulu olduğu sunucu kaynaklarımızdan maksimum faydayı ve verimi almaya çalışmaktayız. Bu kapsamda SQL Server veri tabanlarımızda kaynak (CPU, bellek, disk ve I/O) kullanımını yönetmek ve optimize etmek için kullanılan güçlü bir araç olan Resource Governor bizlere 2008 ve sonraki sürümlerde sunmaktadır. Bu sayede kritik iş yüklerinizin ihtiyaç duyduğu kaynaklara erişmesini sağlayabilir ve performansınızı optimize ederek veri tabanlarına gelebilecek aşırı yükü önlemiş olabilirsiniz.
Biraz çalışma prensibinden bahsedelim, Resource Governor veri tabanı nesne ve sorgularında bir öncelik atayarak çalışır. Bunu şu şekilde örneklendirebiliriz sunucuya gelen uygulama sorguları var bunu servis kullanıcısı ile, raporlama sorguları var bunu raporlama kullanıcısı ile ve ilgili uygulamanın loglarının sorgulamasını yapan log kullanıcısı bulunmaktadır bu yapıda en öncelikli sorgularımız uygulamanın servis kullanıcısından gelen uygulama sorguları olacaktır bu kullanıcının yapmış olduğu sorgulama ve isteklere daha fazla sistem kaynaklarını kullanım önceliği tanımamız gerekecektir. Diğer kullanıcılardan gelen sorgu ve istekleri ise siz yapı ve ihtiyaç durumu, aciliyet durumu gibi kriterlere göre kendi yapınıza uygulayabilirsiniz.
Resource Governor Avantajları
- Kritik iş yüklerinin ihtiyaç duyduğu kaynaklara erişmesini kolaylık sağlayarak performans artışına yardımcı olur.
- Belirli sorguların ve kullanıcıların kaynak kullanımını sınırlayarak veri tabanı sisteminin aşırı yüklenmesini önlemeye yardımcı olur.
- Veri tabanı yöneticilerinin (DBA) kaynak kullanımı takibini ve yönetimini kolaylaştıran özellikler sunar.
Resource Governor Dezavantajları
- Veri tabanı yönetim (DBA) ekiminde deneyimsiz veya sunucu ortamında yeni çalışmaya başlayan bir ekip arkadaşı için nasıl çalıştığını anlamak ve karmaşık yapıyı çözmesi zaman alabilir, yönetimi zorlaştırabilir.
- Kritik iş yüklerinin kaynağa erişimi anlamında kolaylık sağlayabileceğinden pozitif bir etkisi olarak bahsettik ancak yanlış ihtiyaç tespiti, yanlış konfigürasyonlar kullanıldığında beklediğimiz pozitif etki yerine sorguların ve işlemlerin yürütülmesini yavaşlatabilir.
- Üçüncü parti ek uygulama veya yazılımlarınızı kullanırken uyumsuzluk problemleri yaşayabilirsiniz.
Resource Pool
Server’ın kaynaklarını temsil eder. Belirli bir iş yükü grubuna tahsis edilen kaynakların kontrol edilmesini ve yönetimini sağlar. İş yüklerinin performansını ve kaynak kullanımını optimize etmek için kullanılır. Default olarak iki adet resource pool oluşur bunlar;
- Internal Pool: SQL Server Engine kendi üzerinde bulunan iç işler için kullanılan pool’ dur.
- Default Pool: Resource governor’ da ilk tanımlanan user pool’ dur. Herhangi bir user defined resource pool’ a yönlendirilmemiş connection’ lar bu pool’ a yönlendirilir yani SQL Server’ da bir konfigürasyon ayarları ve öncelikli pool tanımlamadıysanız tüm sorgular burada ortak bir havuzda kaynak kullanımını sağlayacak.
Şimdi adım adım birkaç örnek yapmaya çalışalım
1.Adım: Resource Pool Oluşturma
Memory kullanımının maksimim ve minimum olarak set etme örnekleri
CREATE RESOURCE POOL [RaporPool] WITH ( MAX_MEMORY_PERCENT=40 --MIN_MEMORY_PERCENT=20 ‘Eğer minimum bir değer set etmek istersek’ )
Bu komut ile SQL Server kullanımında olan memory’ den maksimum %40 kadar kullanım sağlayabilecek veya SQL Server kullanımında olan memory’ den en az %20’ lik bir kaynak ayrılmış olacak.
2.Adım: Work Group Oluşturma
CREATE WORKLOAD GROUP [AktarimGroup] USING [AktarimPool] –‘Resource Pool ile Work group atamasını gerçekleştirdik’ GO ALTER RESOURCE GOVERNOR RECONFIGURE – ‘Yapılandırmaları uygulamasını sağladık’ GO
3.Adım: Sınıflandırma Fonksiyonu Oluşturma
CREATE FUNCTION ClassFunc_ResGov() RETURNS SYSNAME WITH SCHEMABINDING AS BEGIN DECLARE @workload_group sysname; IF (SUSER_NAME()='AktarimKullanicisi) --‘Sınıflandırma yapılacak olan kullanıcıyı yazdığımız alan’ SET @workload_group = 'AktarimGroup'; RETURN @workload_group ; END
Not: Yapımız gereği birden fazla Resource Governor bulunduruyor olabiliriz bunlar arasında da öncelik belirleyebiliriz aşağıda bunu nasıl yapabileceğimizin bir örneğini bırakıyorum.
ALTER WORKLOAD GROUP [AktarimGroup] WITH (IMPORTANCE=HIGH)
4.Adım: Resource Governor Yapılandırma
USE MASTER GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = [dbo].[ClassFunc_ResGov]) GO ALTER RESOURCE GOVERNOR RECONFIGURE
Son olarak bu adımı da uygulayarak 3. adımda oluşturmuş olduğumuz sınıflandırma fonksiyonunun kullanılabilmesi için yapılandırmasını yapıyoruz.
Oluşturmuş olduğumuz Workload group’ ta hangi session bulunduğunu aşağıda bırakacağım sorgular ile kontrol sağlayabilirsiniz.
SELECT S.session_id, S.login_name, G.name FROM SYS.dm_exec_sessions AS s INNER JOIN SYS.dm_resource_governor_workload_groups AS g ON g.group_id=S.group_id ORDER BY g.name
SELECT sder.group_id,wg.name, sder.status, sder.session_id, sder.request_id, sder.start_time, sder.command, sder.sql_handle,ST.text FROM SYS.dm_exec_requests AS sder INNER JOIN SYS.dm_resource_governor_workload_groups AS wg ON wg.group_id=sder.group_id CROSS APPLY SYS.dm_exec_sql_text(sder.sql_handle) AS st --WHERE sder.session_id = ORDER BY wg.name
Oluşturmuş olduğumuz Resource Governor iptal etmek isterseniz aşağıdaki scriptleri kullanabilirsiniz.
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL) GO ALTER RESOURCE GOVERNOR DISABLE GO DROP FUNCTION dbo.ClassFunc_ResGov --'dbo.funtionIsminiz' GO DROP WORKLOAD GROUP [AktarimGroup] --'WorkloadGroupIsminiz' GO DROP RESOURCE POOL [RaporPool] --'ResourcePoolIsminiz' GO ALTER RESOURCE GOVERNOR RECONFIGURE GO
Örnekler, kullanabileceğinizi düşündüğüm bazı örnekleri aşağıya bırakıyorum 🙂
CREATE RESOURCE POOL [OrnekPool] WITH ( MAX_DOP=8 --'kullanılacak maxdop ayarını belirler' GROUP_MAX_REQUESTS = 10 --'WorkloadGroup aynı anda gelen maksimum sorgu limitini belirler' MAX_CPU_PERCENT=50, MAX_MEMORY_PERCENT=70 --'İki limit belirleme işleminide aynı anda yapabilirim' MIN_CPU_PERCENT=20 MIN_IOPS_PER_VOLUME = 20 --'minimum olarak ayrılan I/O' MAX_IOPS_PER_VOLUME = 70 --'maksimum olarak kullanileceği I/O' )
CREATE WORKLOAD GROUP [MyDatabasePool] WITH MEMORY_POOL = (TYPE=FIXED, SIZE = 100GB) --'Sabit boyutlu bir bellek oluşturduk' GO ALTER DATABASE [MyDatabase] SET WORKLOAD GROUP = [MyDatabasePool] GO ALTER WORKLOAD GROUP [MyDatabasePool] WITH MEMORY_LIMIT = 30 PERCENT; --'Yukarıdaki örnkete ben bir veri tabanının memory' de maksimum %30 kullanım sağlayabilmesini sınırlandırdım siz bunu CPU olarakda değiştirebilirsiniz.' --'Ayrıca yukarıda oluşturduğumuz sabit boyutlu bellek yerine dinamik bir bellekte tasarlayabilirdik.' CREATE WORKLOAD GROUP [MyDatabasePool] WITH MEMORY_POOL = (TYPE=DYNAMIC, MIN_SIZE=10GB, MAX_SIZE=50GB)
Gördüğünüz gibi aslında burada tamamen sizin ortamınıza ve ihtiyaçlarınıza yönelik olarak bu özelliği farklı seçeneklerde kullanabilirsiniz bu kapsamda yardımcı olabilmek adına anlatmaya ve örneklendirmeye çalıştım bir sonraki makalede görüşünceye dek iyi ki varsınız, sevgiler 🙂
0 Yorum