ฉันจะทำให้ 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.