Saya memiliki SQL Server 2014 dengan memori maks diatur ke 6GB (memori fisik 8GB).
The Sasaran Server Memory kadang-kadang 6GB dan kemudian turun kembali ke Jumlah Server Memory (kira-kira 5.3GB, tidak pernah mencapai 6GB). Saya menggunakan committed_kb di sys.dm_os_sys_info untuk memeriksa memori yang digunakan oleh SQL Server.
Ketika saya memonitor sys.dm_os_buffer_descriptors , saya melihat bahwa halaman-halaman dijatuhkan dari cache - tetapi masih ada sisa memori 700MB. Jika tidak ada yang membutuhkan memori, bagaimana Anda menjelaskan fakta bahwa halaman dihapus dari cache? Saya berharap bahwa SQL Server hanya menghapus halaman ketika membutuhkan memori.
Tabel temp yang tidak dialokasikan bukan masalah di server ini. PLE saya adalah 3632. Cache prosedur adalah 2182 MB.
Saya berharap bahwa halaman hanya akan turun ketika tidak ada memori yang tersisa, tetapi saya memiliki 700MB gratis atau saya salah paham tentang ini?
Bisakah seseorang mencoba menjelaskan perilaku ini?
SQL Server juga membaca dari disk, jadi saya pikir saya dapat menyimpulkan bahwa tidak semua halaman yang dibutuhkan ada di memori.
Saya melakukan penelitian lebih lanjut dan saya membaca sejumlah besar halaman dari disk ke memori dan melihat sesuatu di taskmanager selama membaca:
- Memori yang digunakan mulai dari 7.0GB -> 7.2GB -> 7.0GB -> 7.2GB -> ...
- Sqlservr.exe berubah dari 5.3GB -> 5.5GB -> 5.3GB -> 5.5GB -> ...
Ini seperti Windows yang tidak membiarkan sqlservr.exe tumbuh hingga 6GB.
Saya menjalankan kueri yang disediakan oleh 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
Ini memberikan hasil sebagai berikut:
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
Yang tidak saya mengerti adalah mengapa Total_Memory_in_MB tidak sama dengan 6144 (memori maks)?
Dalam sys.dm_os_ring_buffers saya temukan RESOURCE_MEMPHYSICAL_LOW
, jadi saya pikir Windows kehabisan memori dan SQL Server harus mengembalikan beberapa. Tetapi ada sekitar 1GB memori yang tersedia => mengapa Windows mengatakan kehabisan memori?
<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>
Pembaruan
Setelah beberapa penelitian lebih lanjut mengapa selalu ada memori 1GB yang tersedia, saya pikir saya menemukan sesuatu.
Apakah mungkin SQL Server hanya dapat mengalokasikan memori bebas dan memori yang tersedia diabaikan? Saat menjalankan Process Explorer (Sysinternals) saya melihat memori bebasnya adalah 0.