จะเกิดอะไรขึ้นเมื่อไม่มีหน่วยความจำกายภาพเหลืออยู่สำหรับ SQL Server


16

ในขณะที่ Google กำลังค้นหาข้อมูลที่ขัดแย้งกัน

บางเว็บไซต์ระบุว่าเมื่อไม่มีหน่วยความจำกายภาพเหลืออยู่สำหรับข้อมูล SQL Server จะย้ายข้อมูลที่มีอยู่แล้วลงใน TEMPDB (ดู: SQL Server: Demystifying TempDb และคำแนะนำ )

แต่เว็บไซต์อื่น ๆ ระบุว่าเมื่อมีหน่วยความจำกายภาพเหลืออยู่ไม่เพียงพอระบบปฏิบัติการสามารถใช้ PAGE FILE และย้ายข้อมูลจากหน่วยความจำกายภาพไปยังมัน (ดูหน้าไฟล์สำหรับ SQL Server )

ฉันสงสัยว่า SQL Server เขียนข้อมูลเมื่อใดหน่วยความจำกายภาพหมด? หากต้องการ tempdb หรือไปยังไฟล์หน้า OS? หรืออาจจะทั้งคู่?

คำตอบ:


28

เมื่อไม่มีหน่วยความจำกายภาพเหลืออยู่สำหรับข้อมูล SQL Server จะย้ายข้อมูลที่มีอยู่แล้วลงใน TEMPDB

บทความที่คุณเชื่อมโยงกับทำให้เข้าใจผิดอย่างดีที่สุดและไม่ถูกต้องในบางสถานที่ ฉันคิดว่าผู้เขียนพยายามที่จะทำให้สิ่งที่ซับซ้อนบางอย่างซับซ้อนมากเกินไปและในการทำเช่นนั้นไปไกลเกินไปเล็กน้อย

SQL Server จะไม่ย้ายข้อมูลจากหน่วยความจำ (พูลบัฟเฟอร์) ไปที่ tempdb ในวิธีนั้น จะใช้กลยุทธ์การแคช "อย่างน้อยที่สุดเมื่อเร็ว ๆ นี้" (โดยทั่วไป) ดังนั้นหากมีแรงกดดันหน่วยความจำและข้อมูลใหม่จะต้องถูกดึงเข้าไปในหน่วยความจำ SQL Server จะเริ่มต้นข้อมูล LRU จากบัฟเฟอร์พูลเพื่อรองรับข้อมูลใหม่ พฤติกรรมนี้มักถูกตรวจสอบโดยตัวนับ perfmon ที่เรียกว่า"Page Life Expectancy" (PLE) :

คำจำกัดความของ PLE คือเวลาที่คาดหวังเป็นวินาทีที่หน้าไฟล์ข้อมูลที่อ่านเข้าไปในบัฟเฟอร์พูล (แคชในหน่วยความจำของหน้าไฟล์ข้อมูล) จะยังคงอยู่ในหน่วยความจำก่อนที่จะถูกผลักออกจากหน่วยความจำเพื่อให้มีข้อมูลที่แตกต่างกัน หน้าไฟล์ อีกวิธีในการคิดถึง PLE คือการวัดความดันในบัฟเฟอร์พูลทันทีเพื่อสร้างพื้นที่ว่างสำหรับเพจที่กำลังอ่านจากดิสก์ สำหรับคำจำกัดความทั้งสองนี้จำนวนที่สูงขึ้นจะดีกว่า

ในระหว่างการดำเนินการแบบสอบถาม SQL Server สามารถใช้ tempdb สำหรับการดำเนินการบางอย่าง ซึ่งมักจะทำหากการประมาณการไม่ดี แต่หน่วยความจำที่มีอยู่ในระดับต่ำอาจมีผลต่อพฤติกรรมนี้

การดำเนินการบางอย่างที่สามารถ "หก" ไปยัง tempdb ด้วยวิธีนี้คือการแฮชแถว (สำหรับการรวมหรือการรวม ฯลฯ ) การเรียงลำดับแถวในหน่วยความจำและบัฟเฟอร์แถวระหว่างการดำเนินการแบบสอบถามแบบขนาน

แบบสอบถามผู้ใช้ยังสามารถใช้ tempdb อย่างชัดเจน (ด้วยตารางชั่วคราวทั่วโลกหรือท้องถิ่น) และใช้ tempdb (ด้วยสแนปชอตหรืออ่านระดับการแยกสแน็ปช็อตที่กำหนด)

สถานการณ์เหล่านี้ดูเหมือนจะไม่สอดคล้องกับข้อความที่คุณยกมา

เมื่อเหลือหน่วยความจำกายภาพไม่เพียงพอระบบปฏิบัติการสามารถใช้ PAGE FILE และย้ายข้อมูลจากหน่วยความจำกายภาพไป

สิ่งนี้สามารถเกิดขึ้นได้อย่างแน่นอนและอยู่นอกเหนือการควบคุมของ SQL Server เป็นส่วนใหญ่ มีปุ่มที่คุณสามารถเปิดเพื่อพยายามป้องกันการเพจจิ้งระดับ OS บางประเภท ได้แก่ การเปิด"ล็อคหน้าในหน่วยความจำ" (LPIM) :

นโยบาย Windows นี้กำหนดบัญชีที่สามารถใช้กระบวนการในการเก็บข้อมูลในหน่วยความจำกายภาพป้องกันระบบจากการสลับหน้าข้อมูลไปยังหน่วยความจำเสมือนบนดิสก์

ดังนั้นสิ่งที่เราสามารถป้องกันไม่ให้เพจเป็นดิสก์

ก่อนหน้า SQL Server 2012 หน้าที่ได้รับการจัดสรรผ่านส่วนประกอบที่เรียกว่า "Single Page Allocator" ถูกล็อคในหน่วยความจำ (ไม่สามารถทำเพจได้) ซึ่งรวมถึงบัฟเฟอร์พูล (หน้าฐานข้อมูล), โพรซีเดอร์แคชและพื้นที่อื่น ๆ ของหน่วยความจำ

ดูรายละเอียดสนุกกับหน้าล็อค, AWE, ตัวจัดการงานและชุดการทำงาน ...โดยเฉพาะในส่วน "4. ตอนนี้ฉันรู้แล้วว่า SQL Server บน x64 สามารถใช้“ หน้าล็อค” สิ่งที่ถูกล็อคอย่างแน่นอน? การอ่านที่เกี่ยวข้องเพิ่มเติมสามารถพบได้ที่นี่: ยิ่งใหญ่ของเซิร์ฟเวอร์ SQL อภิปราย: ล็อคหน้าในหน่วยความจำ

ใน SQL Server 2012 และใหม่กว่าไม่มี "ตัวจัดสรรหน้าเดียว" (ตัวจัดสรรเดี่ยวและหน้าหลายหน้าถูกรวมเข้าด้วยกันต่อการมองในเชิงลึกของหน่วยความจำ - SQL Server 2012/2014 ) รายละเอียดของสิ่งที่สามารถและไม่สามารถทำเพจได้ไม่ถูกบันทึกไว้ในรายละเอียดทุกที่ที่ฉันเห็น คุณสามารถใช้แบบสอบถามเช่นนี้จะเห็นสิ่งที่ถูกล็อก

select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

จากบทความสนับสนุน MS เดียวกันคุณสามารถใช้DBCC MEMORYSTATUSเพื่อดูว่า "ล็อก" หน่วยความจำมากแค่ไหน

จากบันทึกด้านข้างคุณสามารถเห็นหลักฐานของชุดการทำงานของ SQL Server ที่กำลังทำเพจโดยระบบปฏิบัติการในบันทึกข้อผิดพลาด จะมีข้อความที่มีลักษณะเช่นนี้:

2019-09-02 10: 19: 27.29 spid11s ส่วนสำคัญของหน่วยความจำกระบวนการเซิร์ฟเวอร์ sql ได้รับการเพจออก สิ่งนี้อาจส่งผลให้ประสิทธิภาพลดลง ระยะเวลา: 329 วินาที Working set (KB): 68780, commit (KB): 244052, การใช้งานหน่วยความจำ: 28%


0

เซิร์ฟเวอร์ SQL รุ่นใหม่มีโอกาสน้อยมากที่จะต้องอยู่ด้วยกัน SQL Server โหลด. NET Framework ลงในพื้นที่ที่อยู่และใช้ภายใต้การทำงานปกติ หากหน่วยความจำกายภาพและไฟล์หน้าหมดลง Windows จะพยายามขยายไฟล์หน้า อย่างไรก็ตามถึงแม้ว่ามันจะสามารถขยายไฟล์หน้านี้ไม่ได้เป็นการดำเนินการทันทีและการจัดสรรหน่วยความจำล้มเหลวในขณะที่ไฟล์หน้ากำลังเติบโต มีข้อบกพร่องในตัวจัดการ I / O .NET Asynchronous ซึ่งจะจัดสรรหน่วยความจำเพื่อตอบสนองต่อการแจ้งเตือน APC ถ้าโทรไปnewล้มเหลวมันจะโยนOutOfMemoryException. ข้อยกเว้นนี้ติดอยู่ในเนทีฟภายในตัวจัดตารางงาน อย่างไรก็ตาม I / O อะซิงโครนัสจะไม่ปรากฏว่าเสร็จสิ้น เธรด finalizer สำหรับ FileStream จะบล็อกการรอ I / O ให้เสร็จสิ้นเพื่อให้สามารถเลิกตรึงบัฟเฟอร์ได้ดังนั้นจึงวางเธรดสุดท้ายของ Finalizer สิ่งนี้ทำให้. NET Framework ใช้หน่วยความจำเพิ่มมากขึ้นเรื่อย ๆ จนกว่าจะไม่มีการจัดสรรหน่วยความจำเพิ่มเติม ณ จุดนี้เซิร์ฟเวอร์ SQL จะไม่ตอบสนองเนื่องจาก winsock ไม่สามารถจัดสรรบัฟเฟอร์ได้อีกต่อไปดังนั้นแม้การเชื่อมต่อการเข้าถึงของผู้ดูแลระบบ

ฉันได้เข้าชมแฮงค์รวมตัวจัดกำหนดการงานจริงในแอปพลิเคชัน. NET เนื่องจากหน่วยความจำไม่เพียงพอ โชคดีที่กระบวนการเสียชีวิตเนื่องจากการขว้างปาOutOfMemoryExceptionบนเธรดบางตัวที่ไม่ได้จับมันหลังจากความล้มเหลวหลายครั้ง

เมื่อฉันรู้ว่าฉันกำลังมองหาอะไรการค้นหาข้อผิดพลาดในการวิเคราะห์แบบคงที่นั้นเป็นเรื่องง่าย

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