DB Engine Stolen Server Memory terlalu tinggi

8

Saya mendapatkan kesalahan dari System Center Operations Manager (SCOM).

Bagaimana cara mengatasi kesalahan ini?

SQL DB 2012 Mesin Server Yang Dicuri Memori terlalu tinggi.

Saya menjalankan kueri dan mendapatkan penghitung ini:

╔═══════════════════════════════╦═════════════╗
║ Stolen Server Memory (MB)     ║ 7354.773437 ║
║ Lock Memory (MB)              ║ 106.195312  ║
║ Free Memory (MB)              ║ 64.632812   ║
║ Connection Memory (MB)        ║ 24.203125   ║
║ Log Pool Memory (MB)          ║ 14.085937   ║
║ Optimizer Memory (MB)         ║ 2.351562    ║
║ Granted Workspace Memory (MB) ║ 1.296875    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
║ Cursor memory usage           ║ 0.000000    ║
╚═══════════════════════════════╩═════════════╝
Darko Milic
sumber

Jawaban:

10

Berapa kali Anda melihat pesan seperti itu? Jika sekali atau dua kali itu bisa diabaikan.

'Memori yang dicuri' seperti yang dijelaskan dalam artikel dukungan lama ini dan Cara menggunakan DBCC MEMORYSTATUS adalah:

Memori yang dicuri menjelaskan buffer yang digunakan untuk menyortir atau untuk operasi hashing (permintaan workspace memory), atau untuk buffer yang digunakan sebagai penyimpanan memori generik untuk alokasi untuk menyimpan struktur data internal seperti kunci, konteks transaksi, dan informasi koneksi . Proses lazywriter tidak diizinkan untuk menyiram buffer yang dicuri keluar dari buffer pool.

Memori biasanya diambil dari Buffer Pool. Jika Anda menjalankan DBCC MEMORYSTATUSdan hasilnya menunjukkan Anda Halaman Dicuri tinggi , ini berarti bahwa beberapa proses mencuri memori dari buffer pool lebih dari apa yang diperlukan dan Anda perlu menemukan proses itu.

Sangat mungkin bahwa ada beberapa operasi yang berjalan yang melakukan semacam operasi besar dan pada saat yang sama SQL Server sangat memakan memori sehingga mengarah ke pesan ini. Kecuali jika Anda menghadapi masalah OOM pesan ini akan lebih dianggap sebagai peringatan .

Shanky
sumber
-1

Melihat ini dari pencarian Google saat kami menghadapi masalah yang sama (Memori dicuri ~ 50% dari total memori) tetapi kami tidak bisa

Btw, saya menemukan kode di bawah ini

select type, name, sum((pages_kb*1024)/8192) as stolen_pages
from sys.dm_os_memory_clerks
where pages_kb > 0
group by type, name
order by stolen_pages desc;

type    name    stolen_pages
MEMORYCLERK_SQLBUFFERPOOL   Default 1710360

Saya memodifikasinya lebih untuk menunjukkan% Dicuri sebagai Total memori

SELECT Now = GETDATE()
    ,StolenMemory = (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        )
    ,StolenMemoryPercent = 100.0 * (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Stolen Server Memory (KB)')
        ) / (
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE [counter_name] IN ('Total Server Memory (KB)')
        )
Jerry Hung
sumber