Bagaimana saya dapat menentukan andal jika contoh SQL Server yang diberikan memiliki "Kunci Halaman di Memori" yang benar?

12

Hak "Kunci Halaman di Memori" dapat diberikan ke akun layanan yang digunakan oleh SQL Server. Ini memungkinkan SQL Server untuk mencegah paged memori ke disk.

Saya perhatikan beberapa mesin SQL Server kami tidak memiliki kebijakan lokal yang dikonfigurasi untuk memungkinkan hak ini untuk akun layanan yang digunakan oleh SQL Server. Karena kami memiliki sejumlah besar server, akan sangat membosankan untuk memeriksa masing-masing secara manual menggunakan konsol manajemen "Kebijakan Sistem Lokal".

Apakah ada kueri T-SQL, prosedur tersimpan yang diperluas, atau metode lain yang dapat saya gunakan untuk menentukan apakah server tersebut memiliki hak atau tidak?

Saya ingin tidak menggunakan EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';karena ini bergantung pada memeriksa log kesalahan SQL Server saat ini; dan log kesalahan itu mungkin tidak mengandung entri yang relevan dengan asumsi log telah digulirkan sejak server terakhir kali dimulai ulang. Saya menyadari bahwa saya dapat memeriksa log yang lebih lama dengan mengubah parameter pertama dari 0menjadi 1, dll, namun kami hanya menyimpan 10 log kesalahan, dan itu mungkin tidak cukup. Saya ingin cara yang gagal-aman untuk mengonfirmasi pengaturan.

Max Vernon
sumber

Jawaban:

11

Jika xp_cmdshellada pilihan, berikut ini skrip yang memanfaatkan whoami:

DECLARE @LockPagesInMemory VARCHAR(255);
SET @LockPagesInMemory = 'UNKNOWN';
DECLARE @Res TABLE
(
    [output] NVARCHAR(255) NULL
);

IF (SELECT value_in_use
    FROM sys.configurations c
    WHERE c.name = 'xp_cmdshell'
    ) = 1
BEGIN
    INSERT INTO @Res
    EXEC xp_cmdshell 'WHOAMI /PRIV';

    IF EXISTS (SELECT *
        FROM @Res 
        WHERE [output] LIKE 'SeLockMemoryPrivilege%'
        )
        SET @LockPagesInMemory = 'ENABLED';
    ELSE
        SET @LockPagesInMemory = 'DISABLED';
END

SELECT LockPagesInMemoryEnabled = @LockPagesInMemory;

whoami.exememiliki kemampuan untuk melaporkan semua hak yang dimiliki oleh pelaksana akun whoami. Ini, dikombinasikan dengan xp_cmdshellmenyediakan cara yang dapat diandalkan untuk menentukan apakah instance dari SQL Server memiliki hak yang diperlukan untuk mengunci halaman dalam memori.

Jika xp_cmdshelltidak diaktifkan, kode ini kembali UNKNOWN. Dengan asumsi xp_cmdshell ini diaktifkan, dan hak diaktifkan untuk account SQL Server, ia mengembalikan ENABLED, jika tidak maka kembali DISABLED.

FilamentUnities
sumber
9

Ada metode lain juga. Mungkin Anda bisa menggunakan dua DMV. Harap dicatat bahwa keduanya hanya akan berfungsi untuk SQL Server 2008 dan di atasnya.

Nilai bukan nol untuk locked_page_allocations_kbakan memberi tahu Anda bahwa akun SQL Server telah Mengunci halaman dalam hak istimewa memori.

select osn.node_id, 
osn.memory_node_id, 
osn.node_state_desc, 
omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

...dan:

select
(physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Jika kolom Locked_pages_allocation_KBmenunjukkan nilai bukan nol maka akun layanan SQL Server juga telah Mengunci halaman dalam hak istimewa memori.

...dan:

Bagian "Memory Manager" dari DBCC MEMORYSTATUSoutput akan menampilkan nilai bukan nol untuk "AWE Allocated" atau jika akun layanan SQL Server memiliki Halaman Terkunci dalam hak istimewa memori.

CATATAN:

Jika akun layanan SQL Server berjalan dengan akun Sistem Lokal (NT Authority \ System), secara default SQL Server akan memiliki halaman Terkunci dalam hak istimewa memori.

Memperbarui:

Sebelum SQL Server 2012 untuk Edisi Standar, kita perlu mengaktifkan jejak flag t -845 untuk memanfaatkan LPIM. Bahkan jika Anda menjalankan SQL Server dengan akun yang memiliki hak LPIM, SQL Server tidak akan benar-benar menggunakan keunggulan LPIM kecuali tanda jejak diaktifkan.

Mulai 2012 dan selanjutnya kita tidak perlu mengaktifkan jejak bendera dalam edisi standar untuk mengambil keuntungan LPIM.

Shanky
sumber
4

Microsoft membuat ini lebih mudah dalam versi produk yang lebih baru jika apa yang Anda benar-benar ingin tahu adalah apakah SQL Server berjalan dengan model memori yang memanfaatkan LPIM (sebagai lawan memiliki izin yang tepat). Informasi ini ada di sys.dm_os_sys_info tergantung pada versi SQL Server Anda. Peningkatan diumumkan dalam posting blog :

Dengan SQL Server 2016 SP1 dan SQL Server 2012 SP4, ada dua kolom baru yaitu sql_memory_model dan sql_memory_model_desc ditambahkan ke sys.dm_os_sys_info yang dapat digunakan untuk mengidentifikasi apakah izin Halaman Kunci di Memori (LPIM) ditugaskan ke akun layanan SQL Server.

Satu hal penting yang harus diperhatikan adalah, kolom-kolom baru melaporkan model memori sql yang digunakan sejak dimulainya instance SQL Server yang merupakan informasi yang diinginkan. Tidak ada pemeriksaan yang dilakukan pada level OS untuk izin LPIM untuk akun layanan sql. Jika selama startup SQL Server, LPIM hak istimewa hadir dalam token proses akun layanan server SQL, SQL Server menggunakan halaman yang dikunci (non-pageable) untuk mengalokasikan memori sql. Lebih lanjut, jika Anda menjalankan SQL Server edisi perusahaan dengan hak LPIM yang ditugaskan untuk akun layanan sql dan melacak bendera 834 yang dinyalakan, SQL Server menggunakan halaman besar untuk mengalokasikan memori sql.

Untuk memeriksa apakah Halaman Kunci dalam hak istimewa memori berlaku untuk contoh SQL Server yang diberikan, Anda dapat meminta sql_memory_model di sys.dm_os_sys_info dan mencari nilai yang lebih besar dari 1.

Jika izin LPIM tidak ada dalam token proses akun layanan, model memori konvensional digunakan dan hal yang sama dilaporkan oleh DMV (sql_memory_model = 1). Jika sekarang, mengunci halaman dalam hak istimewa memori ditugaskan ke server SQL tetapi layanan SQL tidak direstart, DMV akan terus melaporkan model memori konvensional karena itu adalah model memori yang berlaku sejak startup. Setelah restart, SQL Server menggunakan halaman terkunci dalam model memori dan hal yang sama dilaporkan oleh sql_memory_model dan sql_memory_model_desc di sys.dm_os_sys_info.

Jika saya menjalankan kueri berikut di salah satu server saya:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

Model memori yang sedang digunakan adalah CONVENTIONAL, yang berarti bahwa LPIM tidak diberikan pada saat startup server. Namun, dimungkinkan untuk memberikan LPIM tetapi tidak memulai kembali layanan SQL Server, jadi DMV ini mungkin tidak berguna untuk Anda tergantung pada sifat pertanyaan Anda.

Joe Obbish
sumber