SQL Server tidak menggunakan semua memori

10

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.

Frederik Vanderhaegen
sumber

Jawaban:

3

Untuk mulai dengan saya harus mengatakan Anda telah mengatur memori server maks ke 6 GB dan total memori adalah 8 GB sehingga Anda baru saja meninggalkan 2 GB untuk OS, yang dalam banyak kasus, bahkan jika tidak ada yang diinstal terpisah dari SQL Server pada mesin Windows , terlalu sedikit memori yang disediakan untuk OS. Agar berfungsi dengan benar, pada sistem dengan antivirus yang diinstal, OS harus diberi setidaknya 4 GB. Saya langsung meninggalkan 2GB untuk OS dan 1,5 G untuk AV.

Memori Server Target terkadang 6GB dan kemudian turun kembali ke Total Server Memory (sekitar 5.3GB, tidak pernah mencapai 6GB).

Memori server target menandakan berapa banyak memori yang diperlukan oleh SQL Server untuk berfungsi dengan baik dalam kasus yang ideal. Memori server target berusaha menjadi 6 GB karena Anda telah menetapkan nilai memori server maks ke 6 GB. Mencoba menghabiskan semua memori yang diizinkan.

Total memori server adalah apa yang sebenarnya dapat dikonsumsi SQL Server saat ini. Ini adalah memori yang dikomit dan didukung oleh RAM fisik. Ini adalah 5,5 GB maks untuk Anda.

SQL Server sedang mencoba meningkatkan konsumsi memorinya tetapi setelah mencapai 5,3 atau 5,5 GB, OS meminta SQL Server untuk tidak meningkatkan konsumsi memorinya dan mungkin sebenarnya menandai pemberitahuan kehabisan memori yang rendah. Ini terjadi karena OS mungkin menghadapi memori rendah seperti yang sudah disebutkan di atas. SQLOS merespons jika OS Windows menghadapi tekanan memori dengan meminta cache-nya mengurangi konsumsi mereka. Anda dapat Meminta Penyangga Dering untuk memeriksa apakah ada pemberitahuan kehabisan memori rendah. Saya harus menambahkan DMV sys.dm_os_ring_buffer tidak berdokumen tetapi aman.

Saya melihat bahwa halaman dijatuhkan dari cache - tetapi masih ada 700MB memori tersisa. 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.

Jika Anda mencari memori bebas, saya tidak akan menyarankan Anda untuk melihat DMV sys.dm_os_buffer_descriptors . The OS kontra Available Mbytes akan memberitahu Anda jumlah memori fisik, dalam byte, tersedia untuk proses yang berjalan pada komputer. Saya sarankan Anda untuk juga melihat Apa metode deterministik untuk mengevaluasi ukuran buffer pool yang masuk akal? dan juga membaca Apakah SQL Server memerlukan lebih banyak RAM untuk mengetahui berapa banyak RAM yang dibutuhkan oleh SQL Server dan jika SQL Server menghadapi tekanan memori. Dari apa yang Anda sebutkan, jika Anda yakin halaman dihapus dari buffer pool maka ya SQL Server merasa bahwa halaman harus dipindahkan karena membutuhkan ruang untuk mengakomodasi halaman baru. Saya tidak yakin bagaimana Anda menghitung 700 MB gratis.

Satu hal lagi, tolong jangan lihat Task Manager untuk konsumsi memori SQL Server. Itu tidak selalu memberi Anda nilai yang benar terutama ketika akun layanan SQL Server memiliki halaman kunci dalam hak istimewa memori . Dalam kasus Anda, bahkan jika SQL Server memiliki memori server maks 6 GB, OS yang diberikan hanya 2 GB, yang memaksa SQL Server untuk tidak meningkatkan konsumsi karena 2 GB rendah untuk SQL Server. Apakah ada hal lain selain SQL Server yang berjalan pada sistem?

Jika Anda ingin menghitung konsumsi memori SQL Server, silakan gunakan:

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

Yang tidak saya mengerti adalah mengapa Total_Memory_in_MB tidak sama dengan 6144 (memori maks).

Kolom Total_Memory_in_MB menandakan total memori yang digunakan oleh SQL Server (RAM + file halaman). RAM sebenarnya adalah memori fisik yang digunakan atau memori yang dilakukan. Beberapa bagian dari proses SQL Server juga dipetakan ke disk dan yang merupakan memori virtual atau file halaman dan jadi jika Anda akan melihat memori TOTAL dikonsumsi oleh SQL Server itu akan menjadi jumlah memori fisik dan file halaman.

Sedangkan kolom Physical_Memory_usedby_Sqlserver_MB hanya memori fisik (memori yang didukung oleh RAM fisik atau memori yang digunakan) yang digunakan. Inilah alasan mengapa keduanya berbeda. Jika Anda melihat kolom yang sebenarnya pertama adalah memori Fisik yang digunakan dan yang lainnya adalah memori Virtual berkomitmen.

Jika Anda ingin melihat memori halaman yang akan menjadi perbedaan antara Total_Memory_in_MB dan Physical_Memory_usedby_Sqlserver_MB .

CATATAN: Total memori yang digunakan akan lebih besar daripada memori fisik yang digunakan.

Shanky
sumber
5

SQL Server menggunakan lebih banyak Cache selain Cache Penyangga meskipun itu adalah yang terbesar dan jauh (contoh yang jelas adalah cache rencana). Anda dapat melihat lebih dekat pada memori melalui DBCC MEMORYSTATUSdan berbagai DMV. Memori target dan total memori merujuk secara khusus ke Buffer Pool / Cache.

Kutipan dari mani SQL Professional 2008 Server Internal Christian Bolton dan Pemecahan Masalah :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Ini menunjukkan ukuran kolam penyangga saat ini.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Ini menunjukkan ukuran ideal untuk buffer pool. Total dan Target harus hampir sama pada server tanpa tekanan memori yang telah berjalan untuk sementara waktu. Jika Total secara signifikan kurang dari Target , maka kemungkinan SQL Server tidak dapat menumbuhkan kumpulan buffer karena tekanan memori, dalam hal ini Anda dapat menyelidiki lebih lanjut.
Tandai Broadbent
sumber
Hanya untuk menambahkan bahkan jika total dan memori server target sama, kami tidak dapat 100% yakin bahwa tidak ada tekanan memori. Dalam hal ini kita perlu menjalankan beberapa penghitung memori lebih banyak dan mendapatkan data mereka juga untuk mencapai kesimpulan.
Shanky
"Total dan Target harus hampir sama pada server tanpa tekanan memori yang telah berjalan untuk sementara waktu." Mari kita pikirkan tentang ini. Saya membuat SQL Server baru dengan 128 GB RAM, dan saya membuka basis data 1 GB. Biarkan berjalan selama sebulan. Apakah saya benar-benar percaya bahwa Total dan Target akan hampir sama pada akhir bulan itu? Jika tidak, apakah saya harus percaya bahwa server berada di bawah tekanan memori? Saya merasa sulit untuk percaya.
Mike Sherrill 'Cat Recall'