2013-02-08 12 views
11

Il mio progetto corrente invierà costantemente query a un server sql e potrebbe utilizzare il 100% della memoria o della CPU.Rilevamento dell'utilizzo di SQL Server con una query

  • Come posso verificare se il server è in fase di pieno utilizzo in una stored procedure in modo che possa decidere se eseguire le query o meno o salvare alcune impostazioni in una tabella in modo che le seguenti query possono conoscere il carico di lavoro è alto e decide cosa fare

  • In caso contrario, come posso impedire al server SQL di raggiungere il pieno utilizzo?

Maggiori informazioni sul caso: In questo momento so che il nostro server di test in corso in grado di elaborare 40-50 query al secondo (una specifica procedura archiviata). E ora decideremo quante query vengono inviate al server ogni secondo. Se impostiamo l'importo anche 1 più alto del previsto, a lungo termine, le query riempiranno la memoria virtuale e il client dovrà riavviare periodicamente l'istanza del server sql.

risultati attesi (per i cacciatori di taglie):

@memory_usage float, @cpu_usage float; /* in percentage */ 

Tutte le idee sono i benvenuti. Grazie.

+9

L'ottimizzazione prematura è la radice di tutto il male. – Andomar

+1

Sulla base della tua domanda, penso che farei un passo indietro e guardare un approccio alternativo. –

+1

Prima se si sta utilizzando la memoria virtuale sul server, assicurarsi che l'istanza abbia le impostazioni di memoria massima impostate. SQL Server è abbastanza bravo a gestire la memoria cache in modo da non dover mai ricominciare l'istanza (per questo particolare problema) a meno che non si stia prendendo in considerazione la memoria necessaria al sistema operativo. Ci sono molti articoli là fuori su quanta memoria lasciare il sistema operativo, ma potresti iniziare guardando BOL qui: http://msdn.microsoft.com/en-us/library/ms178067.aspx. È il 2012 ma non sono sicuro di quale versione stai usando. –

risposta

5

per tale uso intensivo di SQL Server e sforzo per sintonizzare, ho supporre che la macchina (virtuale) è dedicato a SQL Server.

Detto questo, ottenendo attuali percentuali della macchina di CPU e di memoria utilizzata dovrebbe fare il trucco:

CREATE PROCEDURE dbo.p_GetSystemUsage 
    @cpuUsage float out, -- % CPU usage 
    @memoryUsage float out -- % memory usage 
AS 
BEGIN 
    SET NOCOUNT ON; 

    /* 
    * % CPU usage 
    */ 

    SELECT TOP 1 
     @cpuUsage = 100 - r.SystemIdle 
    FROM (
     SELECT 
      rx.record.value('(./Record/@id)[1]', 'int') AS record_id, 
      rx.record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle 
     FROM (
      SELECT CONVERT(XML, record) AS record 
      FROM sys.dm_os_ring_buffers 
      WHERE 
       ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND 
       record LIKE '%<SystemHealth>%') AS rx 
     ) AS r 
    ORDER BY r.record_id DESC 

    /* 
    * % memory usage 
    */ 

    SELECT 
     @memoryUsage = 
      (((m.total_physical_memory_kb - m.available_physical_memory_kb)/
       convert(float, m.total_physical_memory_kb)) * 
      100) 
    FROM sys.dm_os_sys_memory m 
END 

Un paio di cose da notare:

  • sys.dm_os_sys_memory è una buona fonte per la macchina del utilizzo della memoria fisica. Fornisce informazioni simili sull'utilizzo del file di paging della macchina. Nella mia esperienza, le sue informazioni cambiano frequentemente - domande multiple contro di esso in un secondo producono risultati diversi.
  • sys.dm_os_ring_buffers è una buona fonte per l'utilizzo della CPU della macchina, ma non viene aggiornato frequentemente - ogni minuto da quello che ho visto. Forse puoi influire su questo se hai bisogno di più informazioni in tempo reale.
  • Il valore di utilizzo della CPU in sys.dm_os_ring_buffers è un numero intero, ma ho apportato @cpuUsage a float in base alle specifiche. Poiché il processo memorizzato utilizza due parametri float, è possibile eseguire il refactoring della determinazione dell'utilizzo della CPU per fornire una parte frazionaria senza modificare i chiamanti.
+2

l'utilizzo della cpu non ha funzionato - sys.dm_os_sys_memory è utile –

+0

Felice di sentire che il controllo dell'utilizzo della memoria aiuta, @ Uğur Gümüşhan. In che modo il controllo dell'utilizzo della CPU non funziona? Hai sbagliato? Forse è necessario un semplice adeguamento perché funzioni nel tuo ambiente. Inoltre, questo mi ricorda - quali versioni di SQL Server e OS stai usando? (Secondo '@@ VERSION', ho controllato il proc memorizzato su Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) Jun 17 2011 00:57:23 Copyright (c) Edizione Microsoft Corporation Express con servizi avanzati su Windows NT 6.1 (Build 7601: Service Pack 1).) – J0e3gan

+2

abbiamo sql server 2008r2 nella società .. cpuusage restituisce 1 ogni volta –

Problemi correlati