MSSQL Server Network Bekleme Tipleri

Bu makalede mssql server üzerinde Network bekleme tiplerini detaylı bir şekilde görmüş olacağız. İlk olarak çalıştığım sistemde en çok bekleme tiplerine sebep olan bekleme tiplerinden başlayacağız. Bunun için aşağıdaki komut kullanılır.

SELECT
    wait_type,
    wait_time_ms / 1000 AS WaitTimeSec,
    signal_wait_time_ms / 1000 AS SignalWaitTimeSec,
    (wait_time_ms * 100.0) / SUM(wait_time_ms) OVER() AS Yüzde
FROM sys.dm_os_wait_stats
WHERE wait_time_ms > 0
ORDER BY Yüzde DESC;
  • WaitTimeSec: Bu bekleme türünün toplam bekleme süresini saniye cinsinden gösterir. Yani SQL Server, ilgili kaynak için toplamda ne kadar beklemiş.
  • SignalWaitTimeSec: İşlemcinin (CPU) kullanıma hazır olmasını beklerken geçen süredir. Yüksek değerler, CPU darboğazı olabileceğini gösterir.
  • Yüzde: Toplam bekleme süresine göre bu bekleme türünün yüzdesel oranını gösterir. En çok hangi bekleme türünün sistemi yavaşlattığını anlamak için kullanılır.

Şimdi yukarıdaki bekleme tiplerini detaylı bir  aşağıda katagorilere ayrılmış şekilde detaylı bir şekilde açıklayalım.

Ayrıca Session bazlı hangi sorguların  bekleme tipleri olduğunu görmek için aşağıdaki komut kullanılır.

SELECT session_id, wait_type, wait_time/1000 as bekleme_Saniye, wait_resource
FROM sys.dm_exec_requests
WHERE wait_type <> 'WAITFOR'

SQL Server’daki bekleme türleri (wait types), veritabanı motorunun çeşitli kaynaklar için yaptığı beklemeleri izler ve yönetir. Bu beklemeler, SQL Server’ın işlemleri nasıl gerçekleştirdiğini, hangi kaynakların talep edildiğini ve hangi işlemlerin zaman alarak beklediğini anlamanızı sağlar. Bekleme türlerinin doğru analiz edilmesi, SQL Server’daki performans sorunlarının tespit edilmesi ve çözülmesi için kritik öneme sahiptir.

SQL Server’da Bekleme Türlerini Neden İzleriz?

  • Performans Analizi: Bekleme türleri, hangi kaynakların darboğaz oluşturduğunu belirlemek için kullanılır. Eğer belirli bir kaynakta sürekli bekleme oluyorsa, bu kaynak üzerinde iyileştirme yapılması gerekebilir.
  • Veritabanı Optimizasyonu: Bir işlem ya da sorgu belirli bir kaynağı bekliyorsa, bu kaynağın optimizasyonu (örneğin, disk I/O’su ya da bellek yönetimi) sorgunun daha hızlı çalışmasını sağlayabilir.
  • Veritabanı Yönetimi: Bekleme türleri, veritabanı yöneticilerinin (DBA) sistemdeki kaynak kullanımını izlemesine ve veritabanı altyapısını optimize etmesine yardımcı olur.

SQL Server Bekleme Türlerinin Temel Kategorileri

SQL Server’daki bekleme türlerini birkaç ana kategoride toplayabiliriz:

  1. CPU ile ilgili beklemeler
  2. Disk I/O ile ilgili beklemeler
  3. Memory (bellek) ile ilgili beklemeler
  4. Network (ağ) ile ilgili beklemeler
  5. Task Scheduler ve Resource ile ilgili beklemeler

Network ile ilgili kategoriyi detaylı olarak inceleyelim:

4.Network (Ağ) ile İlgili Beklemeler

Bu tür beklemeler, veritabanı işlemlerinin ağ üzerinden gerçekleştirilmesi sırasında meydana gelir ve genellikle ağ bağlantısı sorunları, ağ tıkanıklığı, düşük bant genişliği veya sunucu ile istemci arasındaki mesafeden kaynaklanan gecikmelerle ilişkilidir.

Ağ ile ilgili beklemeler, genellikle veritabanı sunucusu ile istemciler arasındaki veri iletiminde yaşanan sorunları ifade eder ve bu tür beklemeler, ağın performansını ve veritabanı işlemlerinin hızını doğrudan etkileyebilir.

Örnek Bekleme Türleri:

· ASYNC_NETWORK_IO

ASYNC_NETWORK_IO, SQL Server’ın sonuç kümesini (result set) istemciye gönderirken, istemcinin veriyi yeterince hızlı gelen sonucu okumakta veya işleyip bir sonraki veriyi talep etmekte yavaş kalması nedeniyle SQL Server’ın beklemesi anlamına gelir.

Yani: SQL Server veriyi hazırlamış, göndermek istiyor ama karşı taraf “yavaş yavaş alayım” diyor. Bu da SQL’in beklemesine neden oluyor.

“SQL Server veriyi göndermek için hazır, ama istemci neden yavaş yavaş alıyor?”
Cevap: Genellikle uygulama mimarisi, kötü yazılmış kod, ya da teknik sınırlamalar yüzünden. Bazı uygulama geliştiricileri, gelen sonucu tek tek satır satır işliyor.(Row-by-Row Fetch) Bir başka ifadeyle veriyi client tarafından yavaş alma yöntemi:

SQL Server sonucu gönderiyor ama istemci:

  • Satırları memory’ye yazıyor.
  • Excel ya da Power BI gibi araçlar görsel oluşturuyor.
  • Filtreleme, sıralama, pivot gibi işlemler yapıyor.

Bu işlemler veri çekimini yavaşlatır.

Ağ Performansı Sorunları

İstemci ile SQL Server arasında:

  • Zayıf bağlantı (örneğin VPN)
  • Wi-Fi dalgalanması
  • Uzaktan masaüstü ile bağlanma (RDP)

Bu durumlar veri iletimini yavaşlatır → SQL veriyi gönderemez → beklemeye geçer.

Çok Fazla Veri Çekmek

Bazen kullanıcı (ya da uygulama) farkında olmadan milyonlarca satır çekmeye çalışır. SQL Server “al hadi” der ama karşı taraf bu kadar veriyi alıp işlemeye, göstermeye çalışırken zaman kaybeder.

SSMS ya da Excel Gibi Araçlar

Bazen bu araçlar verinin tamamını hemen çekmez. Sen grid’e scroll edince veri “o anda” çekilir.

Yani sen sonuç penceresini açıp bırakınca SQL Server arkada seni bekler.

SELECT 
    wait_type,
    wait_time_ms AS wait_time,
    waiting_tasks_count
FROM 
    sys.dm_os_wait_stats
WHERE 
    wait_type LIKE 'ASYNC_NETWORK_IO'

Çözüm Ne?

İstemci tarafına odaklan:

  • Uygulama geliştiricileriyle konuş → DataReader, DataAdapter, vs. nasıl kullanılıyor?
  • SSMS kullanıcılarına TOP, WHERE kullanmaları gerektiğini öğret
  • Raporlama araçlarında paging (sayfalama) yap
  • Ağ gecikmesini test et

· SQLTRACE_BUFFER_FLUSH

SQLTRACE_BUFFER_FLUSH beklemesi, Bu wait type, SQL Server’ın trace verilerini bellekte topladıktan sonra, bu verileri diske yazmaya çalışırken yaşadığı bekleme durumunu ifade eder. SQL Server, Profiler/Extended Events gibi araçlarla toplanan izleme bilgilerini bellek buffer’larında saklar. Bu buffer’lar dolunca veya belirli bir zaman geçince, SQL Server bu bilgileri diske yazmak zorundadır. Bu yazma işlemi sırasında thread’ler SQLTRACE_BUFFER_FLUSH durumuna geçebilir. SQL Server, trace buffer (izleme tamponu) içindeki verileri istemciye göndermeye çalışırken bu bekleme türü meydana gelir. Bu bekleme türü genellikle SQL Trace veya Profiler gibi araçlar etkinleştirildiğinde görülür.

Ne zaman görülür?

  • SQL Profiler aktif çalışıyorsa
  • sp_trace_create ile oluşturulmuş server-side trace’ler varsa
  • Default trace (sunucu başına varsayılan izleme) açıksa
  • Çok fazla event yakalanıyorsa (özellikle RPC:Completed, SP:StmtCompleted, SQL:BatchCompleted gibi olaylar)
  • Disk yazma işlemleri yavaşsa
SELECT 
    wait_type,
    wait_time_ms AS wait_time,
    waiting_tasks_count
FROM 
    sys.dm_os_wait_stats
WHERE 
    wait_type LIKE 'SQLTRACE_BUFFER_FLUSH'

Ne Anlama Gelir?

Bu wait type’ın çok fazla olması şunlara işaret edebilir:

DurumAnlamı
Ara sıra görülüyorsaNormaldir, endişe etmeye gerek yok
Sürekli ve yüksekseTrace/log işlemleri sistem kaynaklarını zorluyor.
Uygulama yavaşsa ve bu wait görünüyorsaBelki gereksiz trace işlemleri aktif

Ne Yapabilirsin?

Problem KaynağıÇözüm
Profiler açık (özellikle production’da)Kapat. Profiler yerine Extended Events kullan
Server-side trace çok event yakalıyorDaha az event izle, filtre ekle
Default trace sorun çıkarıyorÇok nadir, ama gerekiyorsa kapatılabilir (genelde önerilmez)
Disk yavaşTrace dosyalarının yazıldığı diskin performansını kontrol et

SQL Profiler’ı production ortamında uzun süre açık bırakmak önerilmez. Bu tarz wait’ler hem CPU’yu hem de I/O’yu yorabilir.

Extended Events çok daha hafif ve modern bir alternatiftir.

· NETWORK_IO

NETWORKIO beklemesi, SQL Server’ın veri iletimi veya alımı sırasında meydana gelen beklemeyi ifade eder. Bu bekleme, veritabanı işlemleri sırasında istemci veya diğer sunucularla ağ üzerinden veri iletişimi yapılırken ortaya çıkar. SQL Server, bir işlem verisini ağ üzerinden gönderirken veya alırken beklemeler meydana gelir. Bu bekleme, SQL Server’ın veritabanı sunucusu ile istemci arasındaki veri iletimi sırasında görülebilir. Özellikle büyük veri setlerinin gönderilmesi gerektiğinde bu tür beklemeler daha belirgin hale gelir. Ağ tıkanıklığı, düşük bant genişliği veya ağ gecikmeleri bu tür beklemelere neden olabilir. Bu tür beklemeleri azaltmak için bant genişliğini artırmak, ağ bağlantısını optimize etmek ve veri iletimini hızlandırmak gereklidir. Ayrıca, gönderilen veri miktarını azaltmak veya veri sıkıştırma tekniklerini kullanmak da bu beklemeleri azaltabilir.

SELECT 
    wait_type,
    wait_time_ms AS wait_time,
    waiting_tasks_count
FROM 
    sys.dm_os_wait_stats
WHERE 
    wait_type LIKE 'NETWORK_IO'

· RECEIVE_NETWORK_PACKET

RECEIVE_NETWORK_PACKET beklemesi, SQL Server’ın ağ üzerinden veri alırken meydana gelen beklemeyi ifade eder. Bu bekleme türü, SQL Server sunucusunun bir ağ paketini almayı beklediği durumlarda oluşur. Ağ üzerinden veri paketlerinin alınması sırasında bu tür bir bekleme gözlemlenebilir. Bu bekleme türü, genellikle çok büyük veri setleri alındığında veya yüksek ağ gecikmesi yaşandığında görülür. Ayrıca, istemci sunucu ile ağ bağlantısında problem yaşarsa da bu tür beklemeler artabilir. Ağ gecikmesini azaltmak, ağ tıkanıklığını gidermek ve ağ altyapısını iyileştirmek gereklidir. Ayrıca, veri iletim sürelerini optimize etmek için uygulama düzeyinde iyileştirmeler yapılabilir.

SELECT 
    wait_type,
    wait_time_ms AS wait_time,
    waiting_tasks_count
FROM 
    sys.dm_os_wait_stats
WHERE 
    wait_type LIKE 'RECEIVE_NETWORK_PACKET'

Ağ İle İlgili Beklemelerin Performans Üzerindeki Etkisi

Ağ ile ilgili beklemeler, veritabanı performansını doğrudan etkileyebilir çünkü veri iletimi, ağ gecikmesi ve bant genişliği yetersizliği gibi faktörler sorgu işleme süresini uzatabilir. Özellikle büyük veri kümesi işlemelerinde, ağdan veri almak veya göndermek zaman alabilir, bu da işlem süresini uzatır.

Ağ ile ilgili beklemeler genellikle şunlara neden olabilir:

  • Veri gönderme veya alma işlemlerinin yavaşlaması
  • Ağ tıkanıklığı veya yüksek ağ gecikmesi
  • Veritabanı ve istemci arasındaki bağlantı hızının yavaşlaması

Bu tür beklemeler veritabanı performansını olumsuz etkiler ve kullanıcı deneyimini düşürebilir. Ağ kaynaklarını optimize etmek ve ağ bağlantılarını güçlendirmek bu tür beklemelerin azaltılmasına yardımcı olabilir.

Makalenin başında belirtilen diğer bekleme tiplerine değinelim.

1. LOGMGR_QUEUE

Log yöneticisinin işlemleri sırasında oluşan bekleme süresidir. Log yazma işlemleri yavaşsa, bu bekleme türü artar.

 2. SLEEP_TASK

Bir görev uyku durumundayken oluşan bekleme süresidir. Genellikle arka plan görevleriyle ilgilidir ve kritik değildir.

 3. FTIFTS_SCHEDULER_IDLE_WAIT

 FullText Search (FTS) görevlerinin boşta kalması sırasında oluşan bekleme süresidir. FTS ile ilgili işlemlerde bir gecikme olabilir.

4. CLR_AUTO_EVENT

CLR (Common Language Runtime) otomatik olayları sırasında oluşan bekleme süresidir. CLR ile ilgili işlemlerde bir gecikme olabilir.

 5. LATCH_EX

Bellekteki bir sayfa üzerinde exclusive latch beklenirken oluşan bekleme süresidir. Yoğun yazma işlemleri veya indeks tasarım sorunları bu bekleme türünü artırabilir.

 6. HADR_NOTIFICATION_DEQUEUE

AlwaysOn Kullanılabilirlik Grupları’nda bildirimlerin kuyruktan alınması sırasında oluşan bekleme süresidir. Bildirim işlemlerinde bir gecikme olabilir.

7. DISPATCHER_QUEUE_SEMAPHORE

Geçici bir bekleme türüdür.Bu wait type:
• SQL Server’ın görev (task) ya da iş parçacığı (thread) oluştururken,
• Bu görevlerin dağıtılmasını sağlayan “dispatcher” bileşeninin
• İşlem sırasına göre işlemciye erişim için beklediği bir durumdur.

Bu makalede MSSQL Server Network Bekleme Tiplerini detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle..

“Allah’tan kulları içinde ancak ilim sahibi olanlar korkar.” Fâtır sûresi – 28

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir