Come posso determinare in modo affidabile se una determinata istanza di SQL Server ha il diritto "Blocca pagine in memoria"?


12

Il diritto "Blocca pagine in memoria" può essere concesso all'account del servizio utilizzato da SQL Server. Ciò consente a SQL Server di impedire il paging della memoria sul disco.

Ho notato che molte delle nostre macchine SQL Server non hanno i criteri locali configurati per consentire questo diritto per l'account di servizio utilizzato da SQL Server. Poiché disponiamo di un numero elevato di server, nella migliore delle ipotesi sarà noioso controllarli manualmente utilizzando la console di gestione "Criteri di sistema locali".

Esiste una query T-SQL, una stored procedure estesa o qualche altro metodo che posso usare per determinare se il server in questione ha il diritto o no?

Vorrei non usarlo EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';poiché si basa sul controllo del registro degli errori di SQL Server corrente; e che il registro degli errori potrebbe non contenere la voce pertinente presupponendo che il registro sia stato sottoposto a rollover dall'ultimo riavvio del server. Mi rendo conto di poter controllare i registri più vecchi modificando il primo parametro da 0a 1, ecc. Tuttavia, conserviamo solo 10 registri errori e ciò potrebbe non essere sufficiente. Voglio un modo sicuro per confermare l'impostazione.

Risposte:


11

Se xp_cmdshellè un'opzione, ecco uno script che utilizza 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.exeha la capacità di segnalare tutti i diritti detenuti dall'esecuzione dell'account whoami. Questo, combinato con il xp_cmdshellfornisce un modo affidabile per determinare se l'istanza di SQL Server ha il diritto necessario per bloccare le pagine in memoria.

Se xp_cmdshellnon è abilitato, questo codice restituisce UNKNOWN. Supponendo che xp_cmdshell sia abilitato e il diritto sia abilitato per l'account SQL Server, restituisce ENABLED, altrimenti restituisce DISABLED.


9

Esistono anche altri metodi. Forse puoi usare due DMV. Si noti che entrambi funzioneranno solo per SQL Server 2008 e versioni successive.

Un valore diverso da zero locked_page_allocations_kbindica che l'account SQL Server ha pagine bloccate nel privilegio di memoria.

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'

...e:

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

Se la colonna Locked_pages_allocation_KBmostra un valore diverso da zero, anche l'account del servizio SQL Server ha le pagine bloccate nel privilegio di memoria.

...e:

La sezione "Gestione memoria" DBCC MEMORYSTATUSdell'output mostrerà un valore diverso da zero per "AWE allocato" o se l'account del servizio SQL Server ha pagine bloccate nel privilegio di memoria.

NOTA:

Se l'account del servizio SQL Server è in esecuzione con l'account di sistema locale (NT Authority \ System), per impostazione predefinita SQL Server avrà le pagine bloccate nel privilegio di memoria.

Aggiornare:

Prima di SQL Server 2012 per Standard Edition è necessario abilitare il flag di traccia t -845 per sfruttare LPIM. Anche se si esegue SQL Server con un account con privilegio LPIM, SQL Server non utilizzerà effettivamente il vantaggio LPIM a meno che il flag di traccia non sia abilitato.

Dal 2012 in poi non è necessario abilitare il flag di traccia nell'edizione standard per trarre vantaggio da LPIM.


4

Microsoft semplifica le cose nelle versioni più recenti del prodotto se ciò che si desidera veramente sapere è se SQL Server è in esecuzione con un modello di memoria che sfrutta LPIM (anziché disporre dell'autorizzazione corretta). Queste informazioni sono in sys.dm_os_sys_info a seconda della versione di SQL Server. Il miglioramento è stato annunciato in un post sul blog :

Con SQL Server 2016 SP1 e SQL Server 2012 SP4, ci sono due nuove colonne: sql_memory_model e sql_memory_model_desc aggiunte a sys.dm_os_sys_info che possono essere utilizzate per identificare se le autorizzazioni Lock Pages in Memory (LPIM) sono assegnate all'account del servizio SQL Server.

Una cosa importante da tenere presente è che le nuove colonne riportano il modello di memoria sql in uso dall'avvio dell'istanza di SQL Server che è l'informazione desiderata. Non ci sono controlli eseguiti a livello di sistema operativo per le autorizzazioni LPIM per l'account del servizio sql. Se durante l'avvio di SQL Server il privilegio LPIM è presente nel token del processo dell'account del servizio SQL Server, SQL Server utilizza pagine bloccate (non paginabili) per allocare memoria sql. Inoltre, se si esegue Enterprise Edition di SQL Server con i privilegi LPIM assegnati all'account del servizio sql e il flag di traccia 834 attivato, SQL Server utilizza pagine di grandi dimensioni per allocare memoria sql.

Per verificare se il privilegio Blocca pagine in memoria è attivo per una determinata istanza di SQL Server, è possibile eseguire una query su sql_memory_model in sys.dm_os_sys_info e cercare valori maggiori di 1.

Se nel token del processo dell'account di servizio mancano le autorizzazioni LPIM, viene utilizzato il modello di memoria convenzionale e lo stesso viene segnalato da DMV (sql_memory_model = 1). Se ora, le pagine di blocco nel privilegio di memoria sono assegnate al server SQL ma il servizio SQL non viene riavviato, DMV continuerà a riportare il modello di memoria convenzionale poiché quello è il modello di memoria attivo dall'avvio. Dopo il riavvio, SQL Server utilizza le pagine bloccate nel modello di memoria e lo stesso viene riportato da sql_memory_model e sql_memory_model_desc in sys.dm_os_sys_info.

Se eseguo la seguente query su uno dei miei server:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

Il modello di memoria attualmente in uso è CONVENTIONAL, il che significa che LPIM non è stato concesso al momento dell'avvio del server. Tuttavia, sarebbe possibile concedere LPIM ma non riavviare il servizio SQL Server, quindi questo DMV potrebbe non essere utile per te a seconda della natura esatta della tua domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.