MSSQL Load(Stress) Test – II

SQL Server üzerinde yük oluşturarak kaynak kullanımlarını ve sql server’ın bu yük ile başa çıkma durumu incelenmek için zaman zaman bazı testler yapılır. Yük oluştururken Microsoft tool’u ile bunu yapmak isterseniz daha önce kaleme aldığımız MSSQL Load (Stress) Test adlı makalemize bakabilirsiniz. Bu testleri yapmak için birçok tool vardır. Bunlardan biri de Adam Mechanic’in yapmış olduğu SqlQuerryStress Tool’u dur. Bu tool ile istediğiniz sorguyu istediğiniz thread’de ve istediğiniz sayıda göndererek sistem üzerinde yük oluşturabilirsiniz. Bu başlık altında SqlQueryStress tool’un kullanım durumuna ve kullanım sonrasında Sql Server üzerindeki yükleri inceleyeceğiz. Öncelikle bu tool’u aşağıdaki linkten indirebilirsiniz. İndirdikten sonra exe’yi yönetici olarak çalıştırmanız tool’un başlatılması için yeterli olacaktır. Bu tool’u birden fazla kez açıp farklı sorgularda gönderebilirsiniz. https://github.com/ErikEJ/SqlQueryStress/releases Görsel-1 Görsel – 2 Görsel – 3 Exe’yi başlattığımızda yukarıdaki görsel bizi ilk olarak karşılayacaktır. Burada başlatmadan önce Database button’u ile yükü hangi server ve database üzerinde, hangi kullanıcı ile yapacağımız bilgisini girmemiz gerekmektedir. […]

MSSQL Load(Stress) Test – II

SQL Server üzerinde yük oluşturarak kaynak kullanımlarını ve sql server’ın bu yük ile başa çıkma durumu incelenmek için zaman zaman bazı testler yapılır. Yük oluştururken Microsoft tool’u ile bunu yapmak isterseniz daha önce kaleme aldığımız MSSQL Load (Stress) Test adlı makalemize bakabilirsiniz.

Bu testleri yapmak için birçok tool vardır. Bunlardan biri de Adam Mechanic’in yapmış olduğu SqlQuerryStress Tool’u dur. Bu tool ile istediğiniz sorguyu istediğiniz thread’de ve istediğiniz sayıda göndererek sistem üzerinde yük oluşturabilirsiniz.

Bu başlık altında SqlQueryStress tool’un kullanım durumuna ve kullanım sonrasında Sql Server üzerindeki yükleri inceleyeceğiz.

Öncelikle bu tool’u aşağıdaki linkten indirebilirsiniz. İndirdikten sonra exe’yi yönetici olarak çalıştırmanız tool’un başlatılması için yeterli olacaktır. Bu tool’u birden fazla kez açıp farklı sorgularda gönderebilirsiniz.

https://github.com/ErikEJ/SqlQueryStress/releases

Görsel-1

Görsel – 2

Görsel – 3

Exe’yi başlattığımızda yukarıdaki görsel bizi ilk olarak karşılayacaktır. Burada başlatmadan önce Database button’u ile yükü hangi server ve database üzerinde, hangi kullanıcı ile yapacağımız bilgisini girmemiz gerekmektedir.

Eğer sql server Authentication ile yapacaksak kullanıcı ismi ve şifresini girmemiz gerekmektedir.

Ayrıca Always encrypt ve Readonly routing gibi özellikleri aktif olarak kullanmak istiyorsak bu seçenekleri seçerek ilerleyebiliriz. Bizim amacımız sadece yük oluşturmak olduğu için şimdilik bu kısımları boş bırakarak devam edeceğiz.

Görsel – 4

 

Yukarıdaki bizi ilgilendiren alanları doldurduktan sonra tekrar ana pencereye geliyoruz. Yük testini başlatmadan önce “Clean Buffers” ve “Free Cache” seçeneğini seçmelimiyiz yoksa seçmemelimiyiz.

Eğer bu işlemleri test ortamında yapacaksak öncesinde seçmek yük oluşturma anlamında daha verimli olacaktır. Prod ortamda tüm cache ve buffer’ı boşaltacağı için danışmanınızdan bu konuda yardım almanızı tavsiye ederim.

Number of Iterations: Yazmış olduğumuz select count(*) person.person sorgusunun kaç kez execute edileceği ilgili bilgiyi belirtir.

Number Of threads: Yazmış olduğumuz sorgunun kaç tane eşzamanlı olarak thread açacağını belirtir.

Siyah olarak görünen alanlarda ise istediğimiz sorguyu istediğimiz thread ve sayıyı belirledikten sonra go diyerek çalıştırdıktan sonra ne kadar sürede bittiği ve toplamda ne kadar iteration tamamladığı bilgisini gösterecektir. Ayrıca sistem üzerindeki Avg. Logical Read değerini okuyacağız ve CPU’da geçirdiği süreyi göreceğiz.

Görsel – 5

Görsel – 6

 

SELECT

dmes.session_id AS SPID,

dmer.start_time,

UPPER (DB_NAME(dmer.database_id)) DBName,

dmes.host_name AS HostName,

UPPER(dmes.login_name) AS LoginName,

UPPER(dmer.status) AS SPIDState,

dmer.command as RequestCommand,

dmer.total_elapsed_time AS ElapsedTime,

dmer.cpu_time AS CPUTime,

dmer.reads AS RequestRead,

dmer.writes AS RequestWrites,

dmer.logical_reads AS RequestLogicalRead,

SUBSTRING (dmest.text, (dmer.statement_start_offset/2) + 1,

((CASE WHEN dmer.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), dmest.text)) * 2

ELSE dmer.statement_end_offset  END - dmer.statement_start_offset)/2) + 1) AS SubQuery,

UPPER(REPLACE(LTRIM(LTRIM(CONVERT(varchar(2000),REPLACE(REPLACE(REPLACE(dmest.text,'-',''),'=',''),'*','')))),CHAR(9),'')) AS ParentQuery,

dmeqp.query_plan AS QueryPlan,

dmer.wait_type AS Current_WaitType,

dmer.wait_time AS Current_WaitTime,

dmer.last_wait_type AS Last_WaitType,

dmer.wait_resource AS RequestWaitResource,

dmer.blocking_session_id AS RequestBlockingSPID,

dmer.lock_timeout AS RequestTimeout,

dmer.open_transaction_count OpenTransactionCount,

dmer.row_count RowsCount,

dmer.percent_complete TaskCompletedPercent,

(dmes.memory_usage*8) AS Memory_UsagesInKB,

GETDATE()

FROM

sys.dm_exec_sessions dmes

INNER JOIN  sys.dm_exec_requests dmer ON dmer.session_id = dmes.session_id

CROSS APPLY sys.dm_exec_sql_text(dmer.sql_handle) dmest

CROSS APPLY sys.dm_exec_query_plan(dmer.plan_handle) dmeqp

LEFT JOIN   sys.dm_exec_cached_plans dmecp ON dmecp.plan_handle = dmer.plan_handle

LEFT JOIN   sys.dm_db_task_space_usage dmtsu ON dmtsu.session_id = dmer.session_id and dmtsu.request_id = dmer.request_id

LEFT JOIN   sys.dm_db_session_space_usage dmssu ON dmssu.session_id = dmes.session_id

WHERE dmes.session_id <> @@SPID

ORDER BY 11 DESC

 

Test öncesi ve sonrası sistem CPU kullanımı ve Activity Monitor batch request durumuna kısa göz gezdirelim.

Test öncesi;

Görsel – 7

Görsel – 8

Test sonrası;

Görsel – 9

Görsel – 10

 

Parametrik değerler ile random sorgular göndermek istersek eğer;

Görsel – 11

Görsel – 12

 

 

Sorgu ile kontrol etmek isterseniz eğer;

—-Arka planda çalışan sorguların kontrolü için

sp_WhoIsActive

—Procedure’in kaç kez çalıştığını görmek için

SELECT  DB_NAME(st.dbid) DBNamee

,OBJECT_SCHEMA_NAME(st.objectid,dbid) SchemaName

,OBJECT_NAME(st.objectid,dbid) StoredProcedure

,MAX(cp.usecounts) Execution_count

FROM sys.dm_exec_cached_plans cp

CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st

WHERE DB_NAME(st.dbid) IS NOT NULL

AND cp.objtype = 'proc'

AND OBJECT_NAME(st.objectid, dbid) LIKE 'uspGetEmployeeManagers'

GROUP BY cp.plan_handle, DB_NAME(st.dbid),

OBJECT_SCHEMA_NAME(objectid,st.dbid),

OBJECT_NAME(objectid,st.dbid)

ORDER BY MAX(cp.usecounts) DESC

GO

 

Random değerler ile göndermesini istersek eğer aşağıdaki konfigürasyonlar ile kontrol edebiliriz;

Görsel – 13

Görsel – 14

Görsel – 15

Ayrıca Profiler açarak çok kısa süre içerisinde farklı BusinessEntityID’ler ile 8000’in üzerinde sorgu çalıştırdığı tespit ettik.

Görsel – 16

 

Benzer Yazılar

MSSQL Load(Stress) Test

SQL Server 3 gün önce

Bu yazıda SQL Server üzerinde yükler oluşturacağız, yük oluştururken SQL Server üzerindeki workload’ları inceleyeceğiz. SQL Server’da Yük Testi (Stress Testi) oluşturmak istediğimizde birçok tool önümüze çıkacaktır. Microsoft bu testi yapabilmemiz için bizimle RML Utilities Tool’unu paylaşmıştır. Öncelikle tool’u PC’inize kurmak ve yüklemek için aşağıdaki adımları takip etmelisiniz. Aşağıdaki linke girşi sağladıktan sonra downlaoda etmelisiniz. https://www.microsoft.com/en-us/download/details.aspx?id=103126 Görsel – 1 Görsel – 2 Kurulum başarılı şekilde tamamlandıktan sonra Tool’un aşağıdaki path’e kurulduğunu teyit edebilirsiniz. “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\RML Utilities for SQL Server\” Görsel – 3   CMD’yi açtıktan sonra; aşağıdaki parametreleri kullanarak kendi yazmış olduğumuz sorguları stress testi için gönderebiliriz. Görsel – 4 Microsoft bu testi yaparken oStress komutunu kullanarak yapmaktadır. T-Sql query’lerin yük oluşturabilmesi için tasarlanmıştır. Bu sayede veritabanına ciddi bir yük bindirebilirsiniz. SQL Server üzerinde yük üretmek için bir database’e ihtiyacımız olacak. Biz bunun için AdventureWorks Veritabanını kullandık. Aşağıdaki link üzerinden bu Database’in backup’ını indirerek Restore edebilirsiniz. https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorks2022.bak Yük oluştururken 3 adet […]

Contained Availibility Group – SQL Server 2022 Feature

SQL Server 3 gün önce

Contained Availibility Group – SQL Server 2022 Feature Bu Yazımızda SQL Server 2022’nin Feature’larından olan Contained Availablity Group’tan bahsedeceğiz. SQL Server Always on ile birlikte birçok kullanıcı oluşturdukları Agent Job ve User’larda zaman zaman problemler ile karşılaşmaktadır. Özellikle hangi job’un primary’de hangi Job’un secondary’de çalışacağı konusu zaman zaman problemler yaratmaktadır. Tamda bu noktada SQL Server 2022 Contained AG özelliği ile bu probleme çözüm getirmek için hayatımıza girdi. Yazımızda adım adım nasıl Contained AG oluştrulur ve oluştururken nelere dikkat etmeliyiz bunları tek tek ele alacağız. 1.Adım: Yeni bir Availablity Group Wizard oluşturuyoruz. Görsel 1: New Availability Group Wizard   2.Adım: Yeni bir AG oluşturuyoruz. Burada önemli nokta Contained seçeneğinin seçilmesi. Reuse seçeneğini yeni oluşturduğumuz Contained AG’de seçmiyoruz Reuse’un kullanımı ile alakalı yazı içerisinde detaylı olarak paylaşacağız. Görsel 2: New Availability Group as Contained   3.Adım: Hangi database’in Contained AG içerisinde olacağını belirliyoruz. Biz örneğimizde ContainedDB’yi örnek olarak ele alacağız. Görsel 3: […]

SQL Server Plan Cache Temizlemenin 9 Farklı Yolu

SQL Server 6 gün önce

SQL Server Cache Temizleme Yöntemleri Bu yazımızda SQL Server’da cache problemleri ile karşılaştığımızda hangi yöntemle nasıl çözümler üretebileceğimizin üzerinde duracağız. Bu işlem sistemde öngörülemeyen sorunlara yol açabileceğinden, komutları çalıştırmadan önce uzmanlardan yardım almanızda fayda olacaktır.   Cache üzerinde sorun yaşamamıza neden olacak bazı durumlar vardır; Query’lerde çok fazla Recompile kullanımı. Özellikle Store Procedure içinde yer alan Option Recompile kullanımı. Dynamic T-SQL code’ların çok fazla kullanımı. SQL Server Instance’ın ihtiyacı olan memory’den daha az memory verilmesi. Uzun süre çalışan ve size olarak çok fazla data çeken query’ler Index’siz kullanılan query’ler. Birden fazla SQL Server Instance kullanımında var olan Memory’den daha fazla memory kullanımına izin verilmesi.   Yukardaki durumlar memory dar boğazı yaşamamıza neden olacaktır ve bunun sonucunda cache temizleme ihtiyacı duyacağımız durumlar ortaya çıkması olasıdır. Cache temizlemenin birçok yöntemi vardır. Bu yöntemleri birlikte ele alacağız.   1-) DBCC FREEPROCCACHE Bu komut yardımı ile bir Resource pool’u ya da specific bir planı […]

0 Yorum

Yorum Yaz

Rastgele