Saya mencoba mencari cara yang waras untuk memahami apakah max server memory (mb)
pengaturannya sesuai (baik harus lebih rendah, atau lebih tinggi, atau tetap seperti itu). Saya sadar bahwa max server memory (mb)
harus selalu cukup rendah untuk meninggalkan ruang untuk sistem operasi itu sendiri, dll.
Lingkungan yang saya cari memiliki beberapa ratus server; Saya membutuhkan formula yang andal yang dapat saya gunakan untuk menentukan apakah ukuran buffer pool saat ini tepat karena RAM dihitung biayanya per GB yang dialokasikan untuk setiap server. Seluruh lingkungan divirtualisasi, dan RAM "fisik" yang dialokasikan untuk VM dapat dengan mudah diubah ke atas atau ke bawah.
Saya punya SQL Server Instance tertentu yang saya lihat sekarang dengan PLE 1.100.052 detik, yang setara dengan 12.7 hari (jumlah waktu server telah naik). Server memiliki pengaturan memori server maks 2560MB (2.5GB), di mana hanya 1380MB (1.3GB) yang benar-benar dikomit.
Saya telah membaca beberapa item termasuk satu oleh Jonathan Keheyias ( post ) dan lainnya oleh Paul Randal ( post ), dan beberapa lainnya. Jonathan menganjurkan pemantauan untuk PLE di bawah 300 per 4GB dari buffer pool terlalu rendah. Untuk SQL Server Instance di atas, 300 * (2.5 / 4) = 187
menghasilkan PLE target yang benar-benar sangat rendah di bawah 300. Contoh ini memiliki 290GB data SQL Server (tidak termasuk file log), dan hanya digunakan untuk pengujian integrasi. Dengan asumsi 12 hari terakhir mewakili penggunaan tipikal untuk server ini, saya akan mengatakan max server memory (mb)
pengaturannya bisa diturunkan.
Di ujung lain skala, saya memiliki server uji integrasi dengan PLE 294, yang hanya memiliki max server memory (mb)
pengaturan 1GB. Server ini hanya memiliki 224MB data SQL Server yang tidak termasuk log, dan menjalankan beberapa basis data BizFlow. Server ini mungkin mendapat manfaat dari max server memory (mb)
pengaturan yang lebih tinggi .
Saya sedang memikirkan tempat awal yang baik untuk target yang mungkin ditugaskan terlalu banyak memori dapat mencakup melihat:
SELECT
RamMB = physical_memory_in_bytes / 1048576
, BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576
, BufferPoolCommitTargetMB = bpool_commit_target * 8192E0 / 1048576
, PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),bpool_committed)
/ bpool_commit_target) * 100)
FROM sys.dm_os_sys_info;
Jika BufferPoolCommitTargetMB / BufferPoolCommittedMB
lebih besar dari 1, server tidak menggunakan seluruh kumpulan buffer. Jika mesin tersebut juga memiliki PLE lebih besar dari "x" maka itu mungkin merupakan kandidat yang baik untuk penurunan max server memory (mb)
.
Karena Buffer Manager:Lazy writes/sec
penghitung kinerja melacak berapa kali SQLOS telah menulis halaman ke disk antara pos-pos pemeriksaan karena tekanan memori, ini mungkin hal lain yang baik untuk dilihat.
DECLARE @WaitTime DATETIME;
SET @WaitTime = '00:00:15';
DECLARE @NumSeconds INT;
SET @NumSeconds = DATEDIFF(SECOND, 0, @WaitTime);
DECLARE @LazyWrites1 BIGINT;
DECLARE @LazyWrites2 BIGINT;
SELECT @LazyWrites1 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
WAITFOR DELAY @WaitTime;
SELECT @LazyWrites2 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
SELECT LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds;
Kode di atas menganggap server berada di bawah beban selama 15 detik yang diperlukan untuk menjalankan, jika tidak maka akan melaporkan 0; yang mungkin salah-negatif menyesatkan.
Haruskah saya juga melihat PAGELATCHIO_*
statistik tunggu atau jenis tunggu lain sebagai indikator tekanan memori, atau kekurangannya?
Pertanyaan saya adalah, bagaimana saya dapat andal menentukan nilai target "baik" untuk PLE dan max server memory (mb)
?
sumber
max server memory (mb)
, dan karena itu saya cukup enggan untuk menurunkan ukurannya. Namun, beberapa contoh lain memiliki 1.000.000 + PLE, dan dengan demikian adalah kandidat potensial yang cukup jelas untuk penurunan RAM. Jelas, menurunkan RAM akan menyebabkan peningkatan IOPS, dan aku tidak yakin apa biaya yang akan.max server memory
pengaturan adalah semacam hal ayam dan telur; semakin rendahmax server memory
pengaturan, semakin rendah minimum "dapat diterima" PLE akan, jadi saya bisa terjebak dalam spiral yang semakin rendah. Saya yakin, seperti yang Anda sebutkan, kinerja pengguna pada suatu saat akan terpengaruh.T-SQL saat ini yang saya gunakan untuk mengevaluasi PLE vs
max server memory
adalah:Kode ini membandingkan PLE dengan PLE minimum "yang dapat diterima" untuk jumlah
max server memory
sistem yang telah dikonfigurasi. Jika PLE jauh lebih tinggi dari angka yang dapat diterima, ini menunjukkan maksimum 10% lebih rendahmax server memory
. Jika PLE lebih rendah dari PLE yang dapat diterima, itu menunjukkan maksimum 10% lebihmax server memory
.Jika jumlah aktual buffer pool yang dikomit kurang dari ukuran pool buffer target, disarankan menurunkan
max server memory
jumlah itu, ditambah beberapa memori tambahan untuk utas, tulis malas, dll.Kode ini juga melihat berbagai penghitung kinerja untuk hal-hal seperti Lazy Writes / second, Free List Stalls, dan Batch Requests.
Kode tidak sempurna, saya membagikannya di sini untuk mendapatkan masukan, dan untuk kepentingan pengguna SO di masa mendatang.
sumber