เรียกคืนหน่วยความจำจาก SQL Server


10

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

มีวิธีที่ฉันสามารถโน้มน้าวให้ SQL Server ปล่อยหน่วยความจำที่ไม่ต้องการอีกต่อไป (นอกเหนือจากการเริ่มบริการใหม่)?

แก้ไข:
ฉันใช้ SQL Server 2000 SQL Server 8.00.2039 - SP4 (รุ่นมาตรฐาน)

ฉันสามารถค้นหาโดยใช้แบบสอบถามต่อไปนี้:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'

คำตอบ:


19

นี่คือวิธีที่ SQL Server ควรทำงาน

หากคุณมีบริการอื่น ๆ ในเครื่องนั้นและไม่ต้องการให้ SQL ใช้หน่วยความจำที่มีอยู่ทั้งหมดคุณจะต้องตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุด ดูตัวเลือกหน่วยความจำเซิร์ฟเวอร์ SQLบน MSDN


1
ฟังดูเหมือนแมลงมากกว่าคุณลักษณะ ... มันเกิดขึ้นกับฉัน SQL Server ใช้ 95% ของ RAM ที่มีอยู่เพื่อทำบางสิ่งบางอย่างและล้มเหลวในการเผยแพร่เมื่อเสร็จสิ้น
เล่นแร่แปรธาตุ

1
@Alchemical ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย " สมบูรณ์ " SQL Server สามารถใช้ RAM ทั้งหมดในคอมพิวเตอร์ ใช้มันเป็นแคชดิสก์ มันไม่ " สมบูรณ์ " โดยใช้เป็นดิสก์แคชจนกว่าคุณจะใช้ SQL Server ได้
เอียนบอยด์

8

โปสเตอร์อื่น ๆ นั้นถูกต้องซึ่งเป็นผลจากการออกแบบ แต่คุณต้องการ จำกัด หน่วยความจำสูงสุดให้น้อยกว่า RAM ในเซิร์ฟเวอร์ของคุณเล็กน้อย คิดเกี่ยวกับลำดับเหตุการณ์:

  • SQL 2000 ทำงานได้อย่างมีความสุขใช้ RAM ของเซิร์ฟเวอร์ทั้งหมด
  • บางคน RDPs หรือคุณต้องดึง IE ขึ้นมาเพื่อดาวน์โหลด patch หรือการสำรองข้อมูลของคุณเริ่มต้นขึ้น
  • SQL ต้องทำการจัดสรรคืนและเพิ่มหน่วยความจำให้เพียงพอสำหรับระบบปฏิบัติการ
  • ประสิทธิภาพจะแย่ขณะที่เพิ่มหน่วยความจำและเพจไปยังดิสก์
  • ทุกอย่างไปได้ดีพอเมื่อมันมั่นคง
  • การดำเนินการอื่นเสร็จสมบูรณ์และ SQL ค่อย ๆ เรียกคืนแรมที่ว่าง
  • ทำซ้ำ

เพื่อหลีกเลี่ยงปัญหานี้ให้กำหนดค่าขีด จำกัด หน่วยความจำสูงสุดของเซิร์ฟเวอร์เป็นประมาณ 80-90% ของหน่วยความจำกายภาพจริงของคุณ คำแนะนำสำหรับ SQL 2000 ที่: http://msdn.microsoft.com/en-us/library/ms178067.aspx


โปรดจำไว้ว่าพฤติกรรมนี้คือปี 2005 และ 2008 - 2000 ไม่ได้ปล่อยหน่วยความจำตามความต้องการไปยังระบบปฏิบัติการ
Paul Randal

2
ไม่ตรงตามความต้องการ แต่จะปล่อยหน่วยความจำกลับไปที่ระบบปฏิบัติการ จากลิงค์ที่ฉันโพสต์: "เมื่อ SQL Server ใช้หน่วยความจำแบบไดนามิกมันจะทำการสอบถามระบบเป็นระยะเพื่อกำหนดจำนวนหน่วยความจำกายภาพฟรีภายใต้ Microsoft Windows 2000, SQL Server เติบโตหรือลดขนาดแคชบัฟเฟอร์เพื่อเก็บหน่วยความจำกายภาพระหว่าง 4 MB และ 10 MB ขึ้นอยู่กับกิจกรรมของเซิร์ฟเวอร์การบำรุงรักษาหน่วยความจำที่ว่างนี้ทำให้ Windows 2000 ไม่สามารถจัดเพจถ้าหน่วยความจำน้อยลง SQL Server จะปล่อยหน่วยความจำเป็น Windows 2000 หากมีหน่วยความจำว่างมากขึ้น SQL Server จะจัดสรรหน่วยความจำ
sh-beta

อ่า - จริง - ใช้กลอุบายในการถอดรหัสหน่วยความจำกายภาพนิดหน่อย - คุณพูดถูก!
Paul Randal

4

มันจะปล่อยเฉพาะเมื่อระบบปฏิบัติการส่งสัญญาณว่าเป็น RAM ที่หิวโหยหรือถ้าคุณหยุดและเริ่มบริการใหม่ สิ่งที่ต้องทำคือ จำกัด จำนวนเงินสูงสุดที่ SQL จะใช้โดยการกำหนดค่า 'หน่วยความจำเซิร์ฟเวอร์สูงสุด' หากไม่มีสิ่งใดบนเซิร์ฟเวอร์ที่ต้องการ RAM (และหวังว่าจะไม่มี) ฉันจะไม่กังวลเกี่ยวกับมัน


4

ดังนั้นเพื่อสรุปคำตอบ:

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


3

SQL Server จะใช้หน่วยความจำและไม่ให้กลับมาจนกว่าจะมีการบอกโดยระบบปฏิบัติการว่ามีแรงกดดันหน่วยความจำ ดังที่ Portman ระบุไว้สิ่งนี้เกิดจากการออกแบบและหากคุณต้องการ จำกัด ปริมาณการใช้หน่วยความจำคุณต้องตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุดที่ SQL Server จะใช้


2

โปรดจำไว้ว่าพฤติกรรมที่คุณกำลังอธิบายทั้งหมดนั้นมาจาก SQL Server 2005 เป็นต้นไปเมื่อตัวจัดการหน่วยความจำถูกเขียนใหม่ไปยัง (ตอบสนองความต้องการหน่วยความจำจากระบบปฏิบัติการ)

สำหรับ SQL Server 2000 และก่อนหน้านี้เมื่อหน่วยความจำคว้ามันจะไม่คืนให้ไม่ว่า OS จะส่งเสียงมากแค่ไหนก็ตาม

CodeSlave - คุณใช้งานในปี 2000, 2005 หรือ 2008 หรือไม่


อาฮ่า ... ใช่แน่นอน SQL 2000
BIBD

3
มันไม่ได้ให้มันคืนเมื่อ OS ตะโกนสำหรับมัน แต่มันจะให้มันกลับมาถ้ามันเห็นว่าระบบปฏิบัติการนั้นต่ำกว่าขีด จำกัด ที่แน่นอนสำหรับหน่วยความจำกายภาพฟรี ดูmsdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta

และเพื่อเสริมสิ่งที่ sh-beta กล่าว SQL Server 2000 จะเปิดหน่วยความจำเท่านั้นเมื่อพบว่าระบบปฏิบัติการมีหน่วยความจำกายภาพเหลือน้อยเพราะมันไม่ได้จนกว่า Windows XP (2001) ที่ Windows เพิ่ม API เพื่ออนุญาตให้ " OS ตะโกนเพื่อ it "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ) SQL Server 2005 ใช้ประโยชน์จากคุณลักษณะใหม่ของ Windows แต่เมื่อมีการเขียน SQL Server 2000 ไม่มีทางที่ OS จะตะโกนเรียกให้บังคับให้ SQL Server ตรวจสอบความดันหน่วยความจำเป็นระยะ
เอียนบอยด์

0

คำถามเก่าฉันรู้ แต่วิธีการบังคับ (ใหม่กว่าอย่างน้อย) SQL เพื่อปล่อยหน่วยความจำคือการเขียนแอปพลิเคชันที่จัดสรรหน่วยความจำให้มากที่สุดเท่าที่จะทำได้ในหน่วยรอ 15 วินาที (เช่น Sleep (15000)) และการปลดปล่อยหน่วยความจำที่จัดสรรและออก; ฉันลองสิ่งนี้และ SQL จะปล่อยหน่วยความจำเพื่อให้ระบบรับ RAM กลับคืน การเขียนโค้ดอย่างที่กล่าวมาข้างต้นนั้นแทบจะเป็นเรื่องเล็กน้อยโดยใช้ C / C ++ เพียงแค่การตั้งค่า chain ของ stucts เพื่อเก็บ chain block memory (ตัวชี้และขนาด) ลดขนาดลงเมื่อ "malloc ()" ล้มเหลวจนกว่าจะถึง ขั้นต่ำ (พูดน้อยกว่า 1024) จากนั้นเข้าไปในรายการที่เชื่อมโยงเพื่อปลดบล็อกที่จัดสรรกลับให้ว่าง

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