SQL Server ไม่ได้ใช้หน่วยความจำทั้งหมด


10

ฉันมี SQL Server 2014 โดยมีหน่วยความจำสูงสุดตั้งไว้ที่ 6GB (หน่วยความจำกายภาพคือ 8GB)

เซิร์ฟเวอร์เป้าหมายหน่วยความจำบางครั้ง 6GB แล้วลดลงกลับไปรวมเซิร์ฟเวอร์หน่วยความจำ (ประมาณ 5.3GB ไม่เคยถึง 6GB) ผมใช้committed_kbในsys.dm_os_sys_infoเพื่อตรวจสอบหน่วยความจำที่ใช้โดย SQL Server

เมื่อฉันตรวจสอบsys.dm_os_buffer_descriptorsฉันเห็นว่าหน้าเว็บหลุดจากแคช - แต่ยังมีหน่วยความจำเหลืออยู่ 700MB หากไม่มีสิ่งใดต้องการหน่วยความจำคุณจะอธิบายข้อเท็จจริงที่ว่าหน้าถูกลบออกจากแคชได้อย่างไร ฉันคาดหวังว่า SQL Server จะลบหน้าเมื่อต้องการหน่วยความจำเท่านั้น

ตาราง temp ที่จัดสรรคืนไม่มีปัญหาบนเซิร์ฟเวอร์นี้ My PLE คือ 3632 แคชโพรซีเดอร์คือ 2182 MB

ฉันคาดว่าหน้าเว็บจะลดลงเมื่อไม่มีหน่วยความจำเหลือ แต่ฉันมี 700MB ฟรีหรือฉันเข้าใจผิด

ใครช่วยกรุณาลองอธิบายพฤติกรรมนี้ได้ไหม

SQL Server กำลังอ่านจากดิสก์ด้วยดังนั้นฉันคิดว่าฉันอาจสรุปได้ว่าไม่ใช่ทุกหน้าที่ต้องการอยู่ในหน่วยความจำ

ฉันทำการค้นคว้าเพิ่มเติมและฉันอ่านหน้าจำนวนมากจากดิสก์ลงในหน่วยความจำและสังเกตเห็นบางสิ่งใน taskmanager ระหว่างการอ่าน:

  • หน่วยความจำที่ใช้ไปเพิ่มขึ้นจาก 7.0GB -> 7.2GB -> 7.0GB -> 7.2GB -> ...
  • Sqlservr.exe เปลี่ยนจาก 5.3GB -> 5.5GB -> 5.3GB -> 5.5GB -> ...

มันก็เหมือนกับที่ Windows ไม่ให้sqlservr.exeโตขึ้นเป็น 6GB

ฉันเรียกใช้แบบสอบถามโดย Shanky:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

สิ่งนี้ให้ผลลัพธ์ต่อไปนี้:

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

สิ่งที่ฉันไม่เข้าใจคือเหตุผลที่Total_Memory_in_MBไม่เท่ากับ 6144 (หน่วยความจำสูงสุด)

ในsys.dm_os_ring_buffersฉันพบRESOURCE_MEMPHYSICAL_LOWดังนั้นฉันคิดว่า Windows มีหน่วยความจำเหลือน้อยและ SQL Server ต้องคืนค่าบางอย่าง แต่มีหน่วยความจำประมาณ 1GB => เหตุใด Windows จึงบอกว่าหน่วยความจำเหลือน้อย

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

อัปเดต
หลังจากทำการวิจัยเพิ่มเติมว่าทำไมมีหน่วยความจำ 1GB อยู่เสมอฉันคิดว่าฉันพบบางสิ่ง
เป็นไปได้หรือไม่ที่ SQL Server สามารถจัดสรรหน่วยความจำว่างได้เท่านั้นและหน่วยความจำที่มีอยู่นั้นจะถูกละเว้น? เมื่อเรียกใช้ Process Explorer (Sysinternals) ฉันเห็นหน่วยความจำว่างคือ 0

คำตอบ:


3

เริ่มต้นด้วยฉันต้องบอกว่าคุณได้ตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุดเป็น 6 GB และหน่วยความจำทั้งหมดคือ 8 GB ดังนั้นคุณเหลือ 2 GB สำหรับระบบปฏิบัติการซึ่งในหลาย ๆ กรณีแม้ว่าจะไม่มีอะไรติดตั้งนอกเหนือจาก SQL Server บนเครื่อง Windows มีหน่วยความจำน้อยเกินไปที่มอบให้กับระบบปฏิบัติการ เพื่อให้ทำงานได้อย่างถูกต้องบนระบบที่ติดตั้งโปรแกรมป้องกันไวรัสระบบปฏิบัติการจะต้องได้รับอย่างน้อย 4 GB ฉันปล่อย 2GB สำหรับระบบปฏิบัติการทันทีและ 1.5 G สำหรับ AV

หน่วยความจำเซิร์ฟเวอร์เป้าหมายบางครั้งมีขนาด 6GB จากนั้นปล่อยกลับไปที่หน่วยความจำเซิร์ฟเวอร์รวม (ประมาณ 5.3GB ไม่ถึง 6GB)

หน่วยความจำเซิร์ฟเวอร์เป้าหมายหมายถึงจำนวนที่ SQL Server ต้องการให้ทำงานได้อย่างถูกต้องในกรณีที่เหมาะสม หน่วยความจำเซิร์ฟเวอร์เป้าหมายพยายามเป็น 6 GB เนื่องจากคุณตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุดเป็น 6 GB กำลังพยายามใช้หน่วยความจำทั้งหมดที่ได้รับอนุญาต

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

SQL Server พยายามที่จะเพิ่มปริมาณการใช้หน่วยความจำ แต่หลังจากถึง 5.3 หรือ 5.5 GB ระบบปฏิบัติการจะขอให้ SQL Server ไม่ขยายปริมาณการใช้หน่วยความจำเพิ่มเติมและอาจจริงแจ้งสถานะหน่วยความจำเหลือน้อย สิ่งนี้เกิดขึ้นเพราะระบบปฏิบัติการอาจเผชิญกับหน่วยความจำเหลือน้อยดังที่ได้กล่าวไปแล้วข้างต้น SQLOS ตอบสนองว่าระบบปฏิบัติการ Windows เผชิญกับแรงกดดันหน่วยความจำหรือไม่ คุณสามารถค้นหา Ring Bufferเพื่อตรวจสอบว่ามีการส่งสัญญาณเตือนความจำเหลือน้อยหรือไม่ ฉันต้องเพิ่ม DMV sys.dm_os_ring_bufferไม่มีเอกสาร แต่ปลอดภัย

ฉันเห็นว่าหน้าเว็บหลุดจากแคช - แต่ยังมีหน่วยความจำเหลืออยู่ 700MB หากไม่มีสิ่งใดต้องการหน่วยความจำคุณจะอธิบายข้อเท็จจริงที่ว่าหน้าถูกลบออกจากแคชได้อย่างไร ฉันคาดหวังว่า SQL Server จะลบหน้าเมื่อต้องการหน่วยความจำเท่านั้น

หากคุณกำลังมองหาหน่วยความจำฟรีผมจะไม่ขอแนะนำให้คุณดูที่ DMV sys.dm_os_buffer_descriptors ตัวนับ OS Available Mbytesจะบอกจำนวนหน่วยความจำกายภาพที่มีหน่วยเป็นไบต์สำหรับกระบวนการทำงานบนคอมพิวเตอร์ ฉันขอแนะนำให้คุณดูด้วยวิธีการกำหนดค่าสำหรับการประเมินขนาดบัฟเฟอร์พูลที่เหมาะสมคืออะไร และอ่านด้วยว่าSQL Server ต้องการ RAM มากกว่านี้เพื่อค้นหาว่า RAM SQL Server นั้นต้องการและถ้า SQL Server เผชิญกับแรงกดดันของหน่วยความจำ จากสิ่งที่คุณกล่าวถึงถ้าคุณแน่ใจว่าเพจถูกลบออกจากบัฟเฟอร์พูลใช่แล้ว SQL Server รู้สึกว่าต้องย้ายหน้าเพราะต้องการพื้นที่เพื่อรองรับหน้าใหม่ ฉันไม่แน่ใจว่าคุณคำนวณฟรี 700 MB ได้อย่างไร

โปรดอย่ามองที่ Task Manager สำหรับการใช้หน่วยความจำของ SQL Server มันไม่ได้ให้คุณค่าที่ถูกต้องเสมอไปโดยเฉพาะเมื่อบัญชีบริการ SQL Server มีหน้าล็อคในสิทธิ์ของหน่วยความจำ ในกรณีของคุณแม้ว่า SQL Server จะมีหน่วยความจำเซิร์ฟเวอร์สูงสุด 6 GB ระบบปฏิบัติการจะได้รับเพียง 2 GB ซึ่งเป็นการบังคับให้ SQL Server ไม่เพิ่มการสิ้นเปลืองเนื่องจาก 2 GB นั้นต่ำสำหรับ SQL Server มีอะไรนอกเหนือจาก SQL Server ที่ทำงานบนระบบหรือไม่?

หากคุณต้องการคำนวณปริมาณการใช้หน่วยความจำของเซิร์ฟเวอร์ SQL กรุณาใช้:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

สิ่งที่ฉันไม่เข้าใจคือสาเหตุที่Total_Memory_in_MBไม่เท่ากับ 6144 (หน่วยความจำสูงสุด)

คอลัมน์Total_Memory_in_MBหมายถึงหน่วยความจำทั้งหมดที่ใช้โดย SQL Server (ไฟล์หน้า RAM +) RAM เป็นหน่วยความจำกายภาพที่ใช้จริงหรือหน่วยความจำที่กำหนด บางส่วนของกระบวนการ SQL Server ถูกทำเพจไว้บนดิสก์ด้วยซึ่งถือว่าเป็นหน่วยความจำเสมือนหรือไฟล์หน้าดังนั้นถ้าคุณจะเห็นหน่วยความจำ TOTAL ที่ใช้โดย SQL Server มันจะเป็นผลรวมของหน่วยความจำกายภาพและไฟล์หน้า

ในขณะที่คอลัมน์Physical_Memory_usedby_Sqlserver_MBเป็นเพียงหน่วยความจำกายภาพ (หน่วยความจำที่สนับสนุนโดย RAM จริงหรือหน่วยความจำที่กำหนด) ที่ใช้ นี่คือเหตุผลว่าทำไมทั้งสองจึงแตกต่างกัน หากคุณเห็นคอลัมน์จริงอันดับแรกคือหน่วยความจำกายภาพที่ใช้และอีกคอลัมน์หนึ่งคือหน่วยความจำเสมือนที่คอมมิท

หากคุณต้องการที่จะเห็นหน่วยความจำเพจที่จะเป็นความแตกต่างระหว่างTotal_Memory_in_MBและPhysical_Memory_usedby_Sqlserver_MB

หมายเหตุ:หน่วยความจำทั้งหมดที่ใช้จะมากกว่าหน่วยความจำกายภาพที่ใช้


5

SQL Server ใช้แคชอื่น ๆ อีกมากมายนอกเหนือจากบัฟเฟอร์แคชแม้ว่าจะอยู่ไกลและไกลที่สุด (ตัวอย่างที่ชัดเจนคือแคชแผน) คุณสามารถตรวจสอบหน่วยความจำได้อย่างละเอียดDBCC MEMORYSTATUSและ DMV ที่หลากหลาย หน่วยความจำเป้าหมายและหน่วยความจำทั้งหมดอ้างอิงถึงบัฟเฟอร์พูล / แคชโดยเฉพาะ

ตัดตอนมาจากคริสเตียนโบลตัน 's น้ำเชื้อมืออาชีพ SQL Server 2008 Internals และการแก้ไขปัญหา :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    สิ่งนี้ระบุขนาดปัจจุบันของพูลบัฟเฟอร์
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    นี่เป็นการระบุขนาดที่เหมาะสมสำหรับพูลบัฟเฟอร์ ยอดรวมและเป้าหมายควรใกล้เคียงกันบนเซิร์ฟเวอร์ที่ไม่มีความกดดันหน่วยความจำที่ใช้งานมาระยะหนึ่ง ถ้าผลรวมน้อยกว่าเป้าหมายเป็นอย่างมากเป็นไปได้ว่า SQL Server จะไม่สามารถขยายพูลบัฟเฟอร์ได้เนื่องจากแรงกดดันหน่วยความจำซึ่งในกรณีนี้คุณสามารถตรวจสอบเพิ่มเติมได้

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

"ยอดรวมและเป้าหมายควรเกือบจะเหมือนกันบนเซิร์ฟเวอร์ที่ไม่มีความกดดันหน่วยความจำที่ใช้งานมาระยะหนึ่ง" ลองคิดกันดู ฉันตั้งค่า SQL Server ใหม่ด้วย RAM ขนาด 128 GB และฉันสร้างฐานข้อมูลขนาด 1 GB ขึ้นมา ปล่อยให้มันวิ่งไปหนึ่งเดือน ฉันเชื่อจริง ๆ หรือไม่ว่ายอดรวมและเป้าหมายจะใกล้เคียงกันเมื่อสิ้นเดือน หากพวกเขาไม่ได้ฉันจะเชื่อว่าเซิร์ฟเวอร์อยู่ภายใต้ความกดดันของหน่วยความจำ? ฉันพบว่ามันยากที่จะเชื่อ
Mike Sherrill 'Cat Recall'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.