เหตุใดการรอคอยของ async_network_io จึงเป็นประเภท


10

สัปดาห์ที่แล้วมีสิ่งผิดปกติเกิดขึ้นในฐานข้อมูลของเรา ทั้งหมดในทันทีแอปพลิเคชันที่ถูกบล็อกสำหรับผู้ใช้ของเราที่ไม่สามารถบันทึกเอนทิตีใหม่ ฯลฯ หลังจากดูการตรวจสอบกิจกรรมของ SQL Server (2008 ด้วยโหมดความเข้ากันได้ 2005) ฉันเห็นสามรายการต่อไปนี้:

async_network_io รอประเภท

หลังจากระยะเวลาหนึ่งผู้ใช้จะได้รับการหมดเวลาเชื่อมต่อ เมื่อฉันฆ่ากระบวนการ 64 พวกเขาสามารถบันทึกได้ตามปกติอีกครั้ง

ปัญหาคือเอนทิตีที่พวกเขาพยายามบันทึกระหว่างบล็อกถูกแทรกลงในฐานข้อมูลมากกว่าหนึ่งครั้ง (สูงสุด 3 ครั้ง) แม้ว่าจะมีรหัสที่ควรป้องกันไม่ให้เกิดขึ้น (คอลัมน์หมายเลขที่ต้องไม่ซ้ำกัน แต่ไม่มีข้อ จำกัด ) ... การตรวจสอบเกิดขึ้นในรหัส)

เราใช้ Entity Framework 6.0

  • มีใครบ้างที่รู้ว่าทำไมและเมื่อ ASYNC_NETWORK_IO รอประเภทเกิดขึ้นและจะหลีกเลี่ยงได้อย่างไร
  • และพวกเขาหมายถึงอะไรกันแน่?

1
อ่านบทความนี้จาก Doug Lane: brentozar.com/archive/2015/07/.. นี่อาจกล่าวถึงสิ่งที่คุณเห็นกับ EF
Kris Gruttemeyer

บทความที่น่าสนใจมาก! ขอบคุณฉันจะดูมัน :)
xeraphim

1
ตรวจสอบพื้นที่เก็บข้อมูลสถิติการรอคอย - ASYNC_NETWORK_IO ใช้สคริปต์ที่ Paul จัดเตรียมไว้เพื่อดูว่ามีปัญหาอื่น ๆ
Kin Shah

คำตอบ:


12

ASYNC_NETWORK_IOอย่างใดบ่งชี้ว่าแอปพลิเคชันไคลเอนต์ไม่ได้ประมวลผลผลลัพธ์เร็วเท่ากับ SQL Server ดึงข้อมูลเหล่านั้น ปัญหานี้อาจเกิดจากปัญหาเกี่ยวกับแอปพลิเคชันไคลเอนต์หรือการเชื่อมต่อเครือข่ายระหว่างเซิร์ฟเวอร์และแอปพลิเคชันไคลเอนต์

โปรดอ้างอิงโพสต์โดยThomas LaRock

การรอ ASYNC_NETWORK_IO บ่งชี้ว่าหนึ่งในสองสถานการณ์ที่เกิดขึ้น สถานการณ์แรกคือเซสชัน (เช่น SPID) กำลังรอให้แอปพลิเคชันไคลเอนต์ประมวลผลชุดผลลัพธ์และส่งสัญญาณกลับไปยัง SQL Server ว่าพร้อมที่จะประมวลผลข้อมูลเพิ่มเติม ประการที่สองคืออาจมีปัญหาประสิทธิภาพเครือข่าย

หรือโพสต์นี้โดย Joe Sack

ตามที่คุณอาจทราบอยู่แล้วชนิดของการรอ ASYNC_NETWORK_IO (เห็นใน SQL 2005) และ NETWORKIO (เห็นใน SQL 2000) เกี่ยวข้องกับแอปพลิเคชันการโทรที่ไม่ประมวลผลผลลัพธ์อย่างรวดเร็วเพียงพอจาก SQL Server หรือเกี่ยวข้องกับปัญหาประสิทธิภาพเครือข่าย .

เนื่องจากคุณใช้entity framework โพสต์นี้โดยเบรนต์โอซาร์อาจมีประโยชน์เช่นกัน

เมื่อดูสถิติการรอคอยสำหรับข้อความค้นหาเหล่านี้ฉันเห็นว่ามี ASYNC_NETWORK_IO จำนวนมากซึ่งมักจะมีมากกว่า 1,000 มิลลิวินาที แต่นั่นก็ไม่ได้ทำให้ความรู้สึกใด ๆ ! คิวรีที่มีเวลา CPU เพียงเล็กน้อยและการอ่านเพียงไม่กี่ครั้งนั้นใช้เวลานานเท่าใดจึงจะเสร็จสมบูรณ์ ไม่ใช่ว่าแอปพลิเคชันร้องขอแถวเป็นล้าน ๆ แถวและไม่สามารถใช้ผลลัพธ์ได้เร็วพอ


6

มีความเข้าใจผิดบางประการเกี่ยวกับประเภทการรอ ASYNC_NETWORK_IO ส่วนใหญ่เป็นเพราะชื่อที่บ่งบอกถึงปัญหาเครือข่าย แต่ค่อนข้างหายากสำหรับเหตุผลประเภทการรอนี้

การรอ ASYNC_NETWORK_IO มากเกินไปอาจเกิดขึ้นได้ในสองสถานการณ์:

  1. เซสชันต้องรอให้ไคลเอ็นต์แอปพลิเคชันประมวลผลข้อมูลที่ได้รับจาก SQL Server เพื่อส่งสัญญาณไปยัง SQL Server ว่าสามารถรับข้อมูลใหม่เพื่อการประมวลผลได้ นี่เป็นสถานการณ์ทั่วไปที่อาจสะท้อนถึงการออกแบบแอปพลิเคชันที่ไม่ดีและเป็นสาเหตุของค่าประเภทการรอ ASYNC_NETWORK_IO ที่มากเกินไป

    สิ่งนี้เกี่ยวข้องกับการตรวจสอบแอปพลิเคชันที่ทำให้ค่าประเภท ASYNC_NETWORK_IO มากเกินไปรอและมักจะประสานงานกับผู้พัฒนาแอปพลิเคชันที่สร้างมันขึ้นมา

  2. แบนด์วิดท์เครือข่ายสูงสุด อีเธอร์เน็ตที่อุดตันจะทำให้การส่งข้อมูลช้าไปมาจากแอปพลิเคชัน ซึ่งในตัวมันเองจะลดประสิทธิภาพของการใช้งาน

รายละเอียดเพิ่มเติมสามารถพบได้ในหน้านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.