ASYNC_NETWORK_IO bekleme türünden kaynaklanan yavaş sorgularda sorun giderme
Belirtiler
SQL Server sonuç kümeleri oluşturduğunda ve sonuçları bir çıkış arabelleğine koyarak bunları bir istemci uygulamasına gönderdiğinde, istemci uygulaması bunları çıkış arabelleğinden getirir. İstemci uygulaması durursa veya sonuçları yeterince hızlı getirmezse, SQL Server daha fazla sonuç göndermeden önce istemci uygulamanın tüm sonuçları aldığına dair onay beklemesi gerekir. Bu bekleyiş olarak ASYNC_NETWORK_IO
gösterilir. Daha fazla bilgi için SQL Server'da ASYNC_NETWORK_IO Beklemeleri Anlama başlıklı videoya bakın.
Aşırı ASYNC_NETWORK_IO bekleme iki soruna neden olabilir:
Toplam süreleri daha uzun olacağı için sorgular yavaşlar.
SQL Server istemcinin sonuçları getirmesini beklediğinde alınan kilitleri bırakamaz. Kilit uzun süre serbest bırakılmazsa, diğer oturumlar SQL Server engellenir.
Nedenler ve çözümler
Aşağıdaki bölümlerde bu bekleme türünün yaygın nedenleri ve sorunu çözmek için ilgili adımlar listelanmaktadır:
Büyük sonuç kümesi
Bazı uygulama istemcileri binlerce hatta milyonlarca satır ister ve ardından filtreler, sıralama ve toplamalar uygulayarak sonuçları işler. Büyük sonuç kümeleri gereksiz ağ kullanımına ve istemci uygulamasının işlenmesine yol açabilir.
Çözünürlük: Uygulama geliştiricilerinin SQL Server ve istemciler arasındaki işlemeyi dikkatle dengelemesi gerekir. Filtreleme veya toplama işlemleri SQL Server tarafından gerçekleştirilebilir ve sonuç kümesi küçük olabilir. İstemcilere ulaşan sonuç kümesini sınırlayın. Veriler alındıktan sonra veriler, sunu ve biçimlendirme üzerinde daha fazla hesaplama istemci tarafında daha uygundur.
Uygulama sonuçları yeterince hızlı getirmiyor
İstemci uygulaması sonuçları yeterince hızlı getirmezse ve sonuç kümesinin alındığını SQL Server bildirmezse sunucuda ASYNC_NETWORK_IO
bekleme gerçekleşir.
ADO.NET kullanmayı göstermek için DataSet ve DataTable varsayılan olarak istemcinin erişebilmesi için tüm satırları tamamlamaya getirir. Ancak SqlDataReader gibi sınıflar, uygulama geliştiricisinin her satır sunucudan getirildikten sonra ne yapacağını seçmesine olanak sağlar. Bir uygulama bir kerede bir satır getirebilir ve sonra bu satırı iş gereksinimlerine göre işleyebilir. Örneğin:
Satırı bir dosyaya yazın.
Satırı ağ üzerinden başka bir uygulamaya gönderin.
Bir süre bekleyin veya kullanıcı girişi için bekleyin.
Çözünürlük: Sorunu çözmek için, sıkı bir WHILE/FOR döngüsü kullanarak tüm sonuçları istemcinin olabildiğince hızlı bir şekilde getirin. Bu, sonuçların bellekte depolanması ve yalnızca daha sonra daha fazla işlem yapılması anlamına gelir.
İstemci uygulama makinesi stres altında (G/Ç, bellek veya CPU)
Uygulama kodu sonuçları mümkün olduğunca hızlı getirmek için geliştirilmiş olsa bile sistem kaynağı sorunları istemci işleminin tamamının yavaşlamasına neden olabilir. Örneğin:
İstemci uygulamasını çalıştıran makine kaynak kısıtlamalarına sahipse uygulama sonuçları hızla getirmeyebilir. Örneğin:
%100 CPU kullanımı
Yetersiz bellek (tüm bellek tüketilir)
Yavaş G/Ç (belki de uygulama sonuçları veya günlükleri yazar)
Bu kaynak kısıtlamaları gelen sonuçların yavaş işlenmesine ve SQL Server bekleme türüyle ASYNC_NETWORK_IO
karşılaşmasına neden olabilir.
Çözünürlük: Bu sorunu çözmek için Performans İzleyicisi gibi araçları kullanarak uygulamayı çalıştıran sistemi tanılayın ve ardından kaynak kısıtlamalarını ortadan kaldırın. Aşağıdaki yöntemlerden biri size uygun olabilir:
Diğer uygulamaların çalışmasını durdurun.
Bu uygulamalardaki tüm kod sorunlarını düzeltin.
Uygulamalar tam olarak ayarlandıysa sistemdeki donanımı yükseltin.
NIC/Ağ
Yavaş ağ veya Ağ Arabirim Kartları (NIC), ağ trafiğinde gecikmelere neden olabilir ve sonuçların getirilip SQL Server iletişim kurma işlemini doğal olarak geciktirecektir. Ağ gecikmeleri genellikle aşağıdaki sorunlardan kaynaklanıyor:
Ağ bağdaştırıcısı sürücüsü sorunları
Ağ filtresi sürücüleri sorunları
Yanlış yapılandırılmış veya hatalı güvenlik duvarları
Yönlendirici sorunları
Trafik nedeniyle aşırı yüklenmiş ağlar (daha az yaygın)
Çözünürlük: Bu sorunları tanılamak için bir ağ izlemesi toplayabilir ve paket sıfırlamalarını ve yeniden aktarımları arayabilirsiniz. Daha sonra paket sıfırlamalarını/yeniden aktarımları ortadan kaldırmak için ağ ile ilgili sorunu çözebilirsiniz.