ฉันจะทำให้ SQL Server ปล่อยหน่วยความจำได้อย่างไร


19

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

ดังนั้นฉันจึงพยายามสร้างความมั่นใจให้กับผู้ดูแลระบบ Windows ว่าปัญหาเกี่ยวกับสภาพแวดล้อมเสมือนไม่ใช่ "เพราะ SQL ใช้ RAM มากเกินไป" แต่ดูเหมือนว่าฉันไม่สามารถชักชวน SQL ให้เปิดใช้งานได้โดยไม่ต้องเริ่มบริการใหม่

เมื่อทำการประมวลผลคิวบ์บริการ SQL รับ RAM ขนาด 8GB อย่างมีความสุข แต่เนื่องจากไม่มีแรงกดดันต่อบริการจึงไม่ปล่อยสิ่งนี้มากในระหว่างวันปกติ พวก Windows กรีดร้องและมันคงจะดีกว่าถ้าให้ SQL ปล่อยรุ่นนี้

ฉันไม่ต้องการใช้การตั้งค่าหน่วยความจำสูงสุดเพราะฉันต้องการให้ SQL ใช้ RAM จำนวนมากเมื่อทำการประมวลผล ฉันแค่อยากให้มันลงไปอีกครั้งหลังจากนั้น

อาจเป็นทั้งสองอย่างของSQL Server ที่ไม่ปล่อยหน่วยความจำและการเรียกคืนหน่วยความจำจาก SQL Serverแต่ฉันสงสัยว่ามีคำตอบที่ต่างออกไปหรือไม่ รอ Windows เพื่อเรียกคืนมันจะไม่ชักชวนพวก Windows ที่นี่ การเริ่มบริการเป็นตัวเลือก แต่ฉันไม่ใช่แฟนของความคิดนั้น

ฉันต้องการทราบวิธีทำให้ Windows ขอกลับคืนมา ...


2
สิ่งที่ระบบดูแลระบบกำลังบ่นเกี่ยวกับ RAM ที่ใช้งานอยู่ ฉันได้รับความอัปยศเมื่อ RAM ไม่ได้ใช้เพราะถ้ามันไม่ได้ใช้มันจะเสีย ...
— Mark Henderson

ฉันไม่ได้รับมันเช่นกันหากเครื่องไม่ต้องการหน่วยความจำ - ปัญหาอยู่ที่ไหน นี่คือวิธีที่ระบบปฏิบัติการและแอปพลิเคชั่นทำงานตามปกติ ... เนื่องจากภาระงานที่มีบริการ SQL ที่ไม่ทำงานเก็บหน่วยความจำส่วนใหญ่เมื่อไม่มีสิ่งใดที่ต้องการมันอาจเพิ่มเวลาตอบสนองและ / หรือประสิทธิภาพ
— Oskar Duveborn

ผู้ดูแลระบบ Windows รู้สึกว่า SQL กำลังทำให้เครื่องเกิดปัญหาเนื่องจากกระบวนการมี RAM มาก ฉันรู้ว่ากล่องไม่ได้อยู่ภายใต้ความกดดันจาก SQL และสามารถสาธิตได้โดยเริ่มบริการ SQL ใหม่โดยแสดงว่ามันใช้ RAM มากเมื่อรับข้อมูลสำหรับการประมวลผล SSAS ดังนั้นฉันต้องการให้ SQL ปล่อยหน่วยความจำเพื่อแสดงจำนวน RAM ที่ SQL ใช้ในวันนั้น มันไม่ได้เกี่ยวกับการให้ RAM เพิ่มขึ้นเพียงแค่ให้พวกเขาหยุดตำหนิ SQL สำหรับสิ่งต่างๆ
— Rob Farley

2
เห็นด้วยกับ Farseeker ดูแลระบบควรมีความสุข RAM กำลังถูกใช้ หากไม่ได้ถูกเรียกคืนแสดงว่าเซิร์ฟเวอร์ไม่ต้องการ อาจขอให้ดูแลระบบเพื่อดูความผิดพลาดของหน้าเพื่อแสดงระบบไม่เครียด?
— Nick Kavadias

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

คำตอบ:


12

ฉันเชื่อว่าทางเลือกเดียวของคุณคือเริ่มบริการ SQL ใหม่หรือเรียกใช้แอปพลิเคชันที่ใช้หน่วยความจำจำนวนมากเพื่อบังคับให้ SQL เปิดใช้งาน

ฉันชอบคำแนะนำของ @Nick Kavadias: ตรวจสอบหน่วยความจำ: ตัวนับประสิทธิภาพของหน้า: ข้อบกพร่องของหน้าเว็บ / วินาทีเพื่อแสดงว่า SQL ไม่ได้ใส่หน่วยความจำของระบบปฏิบัติการไว้ภายใต้แรงกดดัน


2
ขอบคุณ Mitch ... ขอฉันพบไฟล์ข้อความ 10GB สำหรับ Notepad
— Rob Farley

lol !, จริง ๆ แล้วนั่นไม่ใช่ความคิดที่เลว!
— มิทช์ข้าวสาลี

อาจจะใช้ไฟล์ 2GB ...
— มิทช์ข้าวสาลี

5

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

(ขออภัยไม่ได้รับคำถามทั้งหมดผ่าน Twitter เห็นได้ว่ามีตัวอักษรมากกว่า 140 ตัว)


1
ฉันหวังว่าบางกระบวนการฉันสามารถใช้ที่จะขอให้ SQL สำหรับหน่วยความจำกลับ (หลังจากบัฟเฟอร์ได้รับการทำความสะอาดและลดลง) แต่ไม่ต้องพิการกล่องที่จะทำ
— Rob Farley

ฉันไม่คิดว่าจะมีวิธีการบังคับให้ตัวจัดการหน่วยความจำ Windows ถามหน่วยความจำกลับโดยไม่บังคับให้ใช้วิธีอื่น คุณอาจจะเขียนบางสิ่งที่นิยม win32 API โดยตรง แต่เท่าที่ฉันรู้วิธีเดียวที่จะกระตุ้นให้ Windows ขอหน่วยความจำกลับมาก็คือการทำให้ต้องใช้หน่วยความจำเพิ่มเติมสำหรับกระบวนการอื่น ตรวจสอบกับ Bob หรือ Paul พวกเขาอาจมีข้อมูลเพิ่มเติม
— mrdenny

3
ไดรฟ์เวอร์ของบอลลูนของ VMware ทำสิ่งนี้อย่างแน่นอน - มันขอให้ Windows มีหน่วยความจำเพิ่มขึ้นเรื่อย ๆ เพื่อรับ SQL Server (หรือแอปพลิเคชันอื่น ๆ ) เพื่อมอบหน่วยความจำ
— เบรนต์โอซาร์

ใช่ - ฉันหวังว่าฉันจะไม่ต้องทำอะไรแบบนั้น
— Rob Farley

@BrentOzar ซึ่งเป็นไดร์เวอร์ ballon ของ VMware จะทำการเรียกคืนหน่วยความจำจากแคชของระบบเท่านั้นไม่ใช่หน่วยความจำในกระบวนการจริง มันถูกออกแบบมาเพื่อบอกให้ระบบปฏิบัติการ "ไม่ใช้หน่วยความจำที่มีอยู่ทั้งหมดของคุณสำหรับสิ่งเล็ก ๆ น้อย ๆ " ไม่ทำให้มันแย่ลง
— Massimo

2

คุณพูดถึง 'คิวบ์' ดังนั้นจึงไม่ชัดเจนว่าคุณพูดถึงเครื่องยนต์ AS หรือเครื่องยนต์สัมพันธ์ เอ็นจินเชิงสัมพันธ์สามารถเพิ่มหน่วยความจำได้ตามต้องการ:

DBCC FREESYSTEMCACHE('<cache name>');

ที่ไหนชื่อแคช 'จะนำมาจากsys.dm_os_memory_clerks ข้อมูลจำเพาะของDBCC FREESYSTEMCACHEกล่าวถึงกลุ่มผู้ว่าการรัฐเท่านั้น แต่แคชจำนวนมากสามารถขับไล่ได้จริง

แต่ถ้าหน่วยความจำทั้งหมดถูกใช้โดยพูลบัฟเฟอร์ดังนั้นการหลีกเลี่ยงบัฟเฟอร์พูลทั้งหมดจะส่งผลให้ประสิทธิภาพลดลงอย่างมากและโหลด IO มาก ให้ SQL จัดการเรื่องนี้ดีกว่า


1
สวัสดี Remus แคชแคชเชิงสัมพันธ์มีขนาดใหญ่มากหลังจากการประมวลผลของคิวบ์ หลังจากนั้นฉันต้องการทำความสะอาดแคชลดลงและหน่วยความจำกลับสู่ Windows DBCC DROPCLEANBUFFERS และ FREESYSTEMCACHE ล้างแคชออก แต่ไม่ส่งคืนหน่วยความจำไปยัง Windows ดังนั้นจึงไม่ใช่สิ่งที่ฉันต้องการอย่างสมบูรณ์
— Rob Farley

2
ในทางทฤษฎีคุณสามารถสร้างแรงกดดันหน่วยความจำปลอม (เช่นคุณสามารถกระโดดแทรมโพลีน QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ) แต่ฉันจะไม่ไปที่นั่นจริงๆ หาก SQL ไม่ปล่อยหน่วยความจำที่มีข้อตกลงเนื่องจากระบบปฏิบัติการไม่ต้องการ ระบบปฏิบัติการไม่ต้องการหน่วยความจำเพราะ SQL เป็นแอปพลิเคชั่นเพียงตัวเดียวบนโฮสต์ ( stackoverflow.com/questions/1401834/… ) ใช่ไหม? หากคุณใช้งานแอพพลิเคชั่นอื่น ๆ พร้อม SQL คุณก็กำลังจะมา
— Remus Rusanu

2

ด้วยเอ็นจิ้น AS และ DS คุณสามารถใส่ฝาปิดหน่วยความจำเพื่อให้อยู่ในระดับต่ำกว่าเกณฑ์ที่ปลอดภัย แนะนำให้ใช้กับเครื่อง 64 บิตที่มี RAM จำนวนมากและ / หรือ SQL หลายอินสแตนซ์ อย่างน้อยเอ็นจิ้นฐานข้อมูลถ้าคุณเปลี่ยนฝาปิดหน่วยความจำให้ต่ำกว่าการใช้งานปัจจุบันมันจะลดปริมาณหน่วยความจำทันทีที่ไม่ต้องรีสตาร์ทบริการ แต่ไม่แน่ใจเกี่ยวกับ SSAS


การมีฝาครอบก็โอเค แต่ฉันคิดว่าฉันจะต้องการดึงหน่วยความจำสูงสุดลงหลังจากประมวลผลแล้วดันกลับออกมาเมื่อฉันต้องการล้างบัฟเฟอร์วางลงแล้วถาม Windows สำหรับความจำหน่วยความจำ
— Rob Farley

1

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

นอกจากนี้เรายังพบว่าการใช้หน่วยความจำ sql เซิร์ฟเวอร์ปริมาณมากสามารถปรับปรุงประสิทธิภาพการทำงานของเซิร์ฟเวอร์ได้จริงเพราะมันช่วยให้ Windows ram มีแคชมากขึ้นเป็นต้น

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