สาเหตุที่เป็นไปได้สำหรับ sp_reset_connection ใช้เวลานานในการดำเนินการคืออะไร?


9

ทำไมsp_reset_connectionขั้นตอนการจัดเก็บระบบจึงใช้เวลานานกว่าสองสามมิลลิวินาทีในการดำเนินการตามที่ดูผ่าน SQL Server Profiler

ฉันทำการสืบค้นกลับอย่างง่ายจากระบบการผลิตโดยใช้ SQL Server Profiler จากนั้นใช้ SqlNexus เพื่อวิเคราะห์ SqlNexus ระบุว่า sp_reset_connection มีระยะเวลาสะสมสูงสุด - 33% ของการติดตามโดยรวม ระยะเวลาที่สังเกตได้อยู่ในช่วง 0-7 วินาที (12 ถึง 6,833,270 ไมโครวินาที) แต่มีค่าเฉลี่ยที่ 0.956 วินาที

ฉันเข้าใจว่า sp_reset_connection กำลังถูกเรียกใช้เมื่อมีการใช้การเชื่อมต่อร่วมซ้ำอีกครั้ง ฉันได้เห็นข้อเสนอแนะว่าสิ่งนี้อาจเกิดขึ้นได้เนื่องจากมีร่องรอยจากภายนอกแต่ดูเหมือนจะไม่เป็นเช่นนั้น

ฉันได้อ่านสิ่งที่เซิร์ฟเวอร์ทำเมื่อเรียกว่า sproc แต่ฉันไม่เชื่อว่าสิ่งเหล่านี้จะเป็นปัญหาในกรณีนี้ - รหัสไม่ออกจากธุรกรรมเปิดหรือตารางชั่วคราวขนาดใหญ่ที่จะต้องทำความสะอาด

ฉันยังดูที่/server/199974/sp-reset-connection-taking-a-long-time-to-runแต่ก็ไม่ได้มีประโยชน์

แก้ไข (2013-12-23): ในทุกกรณีการอ่านและการเขียนคือ 0 และ CPU เกือบตลอดเวลาเป็น 0 (เพียงสองอินสแตนซ์ของ CPU ที่ไม่เป็นศูนย์เท่านั้นซึ่งทั้งสองอยู่ที่ 16ms)


คุณเห็นค่าประเภทใดสำหรับการอ่านและการเขียนในเหตุการณ์นั้น
Martin Smith

คุณสามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับแบบสอบถามชนิดใดที่คุณเรียกใช้ รายละเอียดที่น่าสนใจเช่นธุรกรรมที่ยาวหรือซับซ้อนการประมวลผล XML, ตารางชั่วคราว?
Edward Dortland

@ มาร์ตินอ่านและเขียนเป็น 0 อัปเดตคำถาม (ไม่มีการเข้าถึงข้อมูลในช่วงสุดสัปดาห์)
Holistic Developer

@EdwardDortland ข้อความค้นหาส่วนใหญ่เป็นการเลือกและอัปเดตที่ค่อนข้างง่ายโดยไม่มีธุรกรรมที่ชัดเจนหรือการใช้ตาราง temp ที่จริงแล้วคำค้นหาจริงที่ดำเนินการในการเชื่อมต่อเหล่านี้ค่อนข้างรวดเร็ว - เพียงไม่กี่มิลลิวินาที
นักพัฒนาแบบองค์รวม

@HolisticDeveloper - ฉันทดลองที่จะออกจากธุรกรรมที่เปิดอยู่และอาจเห็นการอ่านและการเขียนที่ไม่มีค่าเป็นศูนย์ดังนั้นจึงเห็นด้วยว่ามันไม่เป็นเช่นนั้น สถานการณ์นี้เป็นแบบถาวรหรือไม่? ถ้าเป็นเช่นนั้นผมจะเรียกใช้การขยายการจับภาพเหตุการณ์ร่องรอยRPC:Starting, RPC:Completedและรอชนิดในช่วงเวลาสั้นแล้วมองผ่านข้อมูลเพื่อดูสิ่งที่รอ SPIDs ประเภทที่มีการเผชิญหน้าในช่วงเวลานั้น
Martin Smith

คำตอบ:


9

ในที่สุดก็ได้เวลาเขียนคำตอบที่ละเอียดกว่านี้

โดยทั่วไปมีสามเหตุผลหลักที่ขั้นตอนง่าย ๆ เช่นsp_reset_connectionจะใช้เวลานานในการทำงาน

  1. คุณกำลังรอทรัพยากรของ CPU
  2. คุณถูกบล็อกบนล็อคบางแห่ง (อาจเป็นผลมาจาก DML หรือธุรกรรมที่แข่งขันกัน)
  3. เครือข่ายของคุณช้าและใช้เวลานานในการส่งคืนผลลัพธ์กลับไปยังไคลเอนต์

โฆษณา 1)หากคุณกำลังรอทรัพยากร CPU สิ่งนี้จะปรากฏขึ้นเมื่อสัญญาณกำลังรอ โปรดดูความคิดเห็นของฉันเกี่ยวกับคำถามของคุณเกี่ยวกับวิธีการวินิจฉัยว่าเป็นปัญหาหรือไม่

โฆษณา 2)sys.dm_os_wait_statsหากคุณกำลังรอคอยการล็อคนี้ได้รับการวินิจฉัยที่ดีที่สุดโดยเปรียบเทียบสองภาพรวมของ ดูบทความนี้เกี่ยวกับวิธีการทำสิ่งนี้:

หากคุณรอเป็นเวลานาน LCK_ [บางอย่าง] ให้ค้นหาsys.dm_tran_locksเพื่อติดตามว่าวัตถุใดที่ถูกล็อค ในกรณีของคุณฉันคาดว่าจะเห็นรูปแบบของ SCH- [Something]> ล็อคการบล็อกคุณ

โฆษณา 3)วิธีที่ง่ายที่สุดในการวิเคราะห์ปัญหาเครือข่ายเพื่อค้นหา OLEDB และ ASYNC_NETWORK_IO ก่อนรอในขั้นตอนที่ 2 (หากคุณรอเป็นเวลานานสำหรับเครือข่ายหนึ่งในนั้นจะปรากฏขึ้น) หากการรอนั้นอยู่ในระดับสูงให้ใช้xperf -on latencyหรือโปรแกรมตรวจสอบเครือข่ายเช่น netmon หรือ wireshark เพื่อตรวจสอบเวลาแฝงของคุณ หากเครือข่ายดูช้าอาจเกิดจากแอพพลิเคชั่นเซิร์ฟเวอร์ที่เรียกว่าไม่ตอบสนองเร็วพอที่การเชื่อมต่อจะถูกรีไซเคิล


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

2

ฉันเพิ่งเจอบทความ KB สำหรับข้อบกพร่องที่อาจเกี่ยวข้องกับปัญหานี้ ในการแก้ไข: ปัญหาประสิทธิภาพการทำงานเกิดขึ้นเมื่อกิจกรรมการล็อกฐานข้อมูลเพิ่มขึ้นใน SQL Server (KB 2926217) อาการอย่างใดอย่างหนึ่งที่อธิบายคือsp_reset_connectionอาจใช้เวลานานกว่าจะเสร็จสมบูรณ์ โปรแกรมแก้ไขด่วนรวมอยู่ในการปรับปรุงต่อไปนี้:

  • 17 การปรับปรุงที่สะสมสำหรับ SQL Server 2008 SP3
  • 13 การปรับปรุงที่สะสมสำหรับ SQL Server 2008 R2 SP2
  • 9 การปรับปรุงที่สะสมสำหรับ SQL Server 2012 SP1
  • การปรับปรุงที่สะสม 1 สำหรับ SQL Server 2014

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

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