SQL Server Konfigurasi memori Maksimum dan Minimum

8

Apa pengaturan yang benar untuk min-memory dan max-memory dalam kasus penggunaan ini?

Server memiliki ram 8GB, prosesor Intel Xeon ganda, menjalankan Windows Server 2008 R2 / Sql Server 2008 Edisi Standar. Ini menjalankan beberapa database mulai dari ukuran 30GB - 5GB.

Awalnya penggunaan memori diatur ke pengaturan default (min = 0 maks = 2.147.483.647). Pada pengaturan ini sebagian besar penggunaan memori diambil oleh sqlservr.exe dan server pada akhirnya perlu di-restart setiap atau dua hari. Ini akan berjalan normal pada awalnya tetapi dalam satu hari mulai kehabisan waktu pada operasi sederhana seperti mencari catatan menggunakan kunci utama.

Saya telah mengubah min = 4.096 dan maks = 6.144. Ini menghasilkan hanya penggunaan memori 1,4GB. Namun sekarang keempat CPU berjalan pada 50-60% penggunaan CPU secara konstan. Tugas membutuhkan waktu sekitar 1/3 lebih lama untuk dieksekusi, meskipun server jauh lebih stabil.

sa555
sumber
Beli lebih banyak RAM dan biarkan maks ke standar.
Remus Rusanu
4
@RemusRusanu Saya menganggap Anda bermaksud min untuk default!
Kin Shah
Kami memiliki kasus penggunaan yang sangat mirip dan masalah serupa (OS tidak memiliki mem karena SQL meraih semuanya) ketika orang lupa praktik. Praktik kami adalah menggunakan 0 sebagai min dan setengah tersedia sebagai maks.
Paul
@ tidak, maksudku maks . Saya harus mengatakan biarkan min dan maks pada nilai default, tapi saya tidak pernah mengerti mengapa ada orang yang mengubah min ...
Remus Rusanu
1
@RemusRusanu Saya berasumsi bahwa itu salah ketik, karena dengan jumlah pengetahuan internal yang Anda miliki + jawaban bagus Anda. Meskipun saya tidak setuju dengan meninggalkan memori Max sebagai default.
Kin Shah

Jawaban:

10

Melihat ketersediaan RAM Anda untuk server khusus ini dan Anda menjalankan beberapa basis data mulai dari 30GB hingga 5 GB , Anda pasti membutuhkan lebih banyak RAM di server ini.

Anda belum menyebutkan bahwa ini adalah contoh yang berdiri sendiri atau server ini memiliki lebih dari satu contoh menjalankan sql server.

Pengaturan MAX Memory Anda tampaknya OK untuk server yang memiliki RAM 8GB. Lihat pengaturan praktik terbaik yang disarankan ini dari Glenn Berry .

Saya akan sangat menyarankan Anda untuk melakukan baseline lingkungan Anda menggunakan penghitung PERFMON di bawah ini untuk mendapatkan nilai yang baik dari konfigurasi memori Anda:

  • SQL Server: Buffer Manager \ Page Life Expectancy
  • SQL Server: Buffer Manager \ Page membaca / detik
  • Disk Fisik \ Disk Dibaca / dtk
  • Memori \ Mbytes yang Tersedia
  • SQL Server: Memory Manager - Total Server Memory
  • SQL Server: Memory Manager - Memory Server Target

Total Server Memory: Jumlah memori yang saat ini dialokasikan untuk Buffer Pool dan bukan jumlah total memori ke SQL Server

Memori Server Target: Ukuran ideal kumpulan buffer yang terkait dengan memori maks untuk instance.

Catatan: Jika Total Server Memory> Target Server memory, maka itu menunjukkan tekanan memori.

Skrip di bawah ini akan membantu Anda menemukan pemberitahuan RENDAH atau TINGGI Memori sys.dm_os_ring_buffers- sesi kesehatan sistem:

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

Beberapa referensi bagus:

Kin Shah
sumber
2
Anda memiliki perbandingan total dan target dengan cara yang salah, tetapi bagaimanapun juga ada cara yang lebih baik untuk menentukan apakah server berada di bawah tekanan memori eksternal.
Paul White 9
@ paulwhite bisakah Anda menjelaskan sedikit lebih banyak sehingga saya dapat meningkatkan jawaban saya? Terima kasih telah melihat.
Kin Shah
Ini adalah contoh yang berdiri sendiri
sa555