none
Monitorar Bloqueios RRS feed

  • Pergunta

  • Pessoal,

    Gostaria de uma saida para monitora bloqueios, mas não online. Tipo deixar um trace no banco capturando os bloqueios mais demorados e no final do dia analisar. Posso fazer isso pelo profiler ?..quais eventos usar ?

    Obrigado !!!!


    quinta-feira, 3 de julho de 2008 14:42

Respostas

  • Olá LPJ,

     

    Você pode utilizar tanto o Acquired quanto o Released afinal em tese todo lock adquirido deverá ser liberado. A IDE realmente pesa mais. Existem formas de gerar o Trace sem utilizar a interface gráfica e a redução da carga pode chegar a 70%. O problema é que gerar o trace apenas via SP é um pouco chato e demanda conhecer vários códigos de eventos.

     

    Como a idéia é monitorar bloqueios, acredito que o Blocker Script seja mais efetivo. O profiler só seria mais interessante para esse tipo de situação se você fosse correlacioná-lo com o Performance Monitor. Assim você poderia ver como o servidor se comporta no momento de um bloqueio e (ou) liberação específica, mas ainda assim acho que o Blocker Script é mais negócio.

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 3 de julho de 2008 18:03

Todas as Respostas

  •  

    Cara,

     

    Eu uso essa consultinha direto e me auxilia direto:

     


       declare @comando varchar(700)

       --BLOQUEADOS
       set @comando = 'select ' + '''' + 'bloqueado' + '''' + ' processo, spid, banco = left(db_name(dbid), 20), blocked, equipamento = left(hostname, 20), '
       set @comando = @comando + 'programa = left(program_name, 20), tempo_de_espera = convert(int, waittime/1000), '
       set @comando = @comando + 'open_tran, status from master.dbo.sysprocesses '
       set @comando = @comando + 'where blocked > 0 union '  
       --BLOQUEADORES
       set @comando = @comando + 'select ' + '''' + 'bloqueante' + '''' + ' processo, spid, banco = left(db_name(dbid),20) , blocked, equipamento = left(hostname, 20), '
       set @comando = @comando + 'programa = left(program_name, 20), tempo_de_espera = convert(int, waittime/1000), '
       set @comando = @comando + 'open_tran, status from master.dbo.sysprocesses '
       set @comando = @comando + 'where blocked = 0 and spid in (select blocked from master.dbo.sysprocesses where blocked > 0) '
       set @comando = @comando + ' order by spid'

       exec(@comando)

     

    Cria um job talvez...que salve em uma tabela. Mas atende para o custo dessa sua automação (disco...).

    quinta-feira, 3 de julho de 2008 15:56
  • POde crer, eu tb tenho uma consultinha parecida com essa. O que eu não queria esra justamente isso. Num ambiente "busy", colocar esse cara pra rodar num job a cada n segundos o I/O com certeza vai me atrapalhar. Eu tinha olhado o evento lock no profiler, mas não achei uma coluna como avg wait time/sec. O que me interessa são os blocks com um waittime acima de n segundos. Pelo perfom e ate pelo alerta do sql server eu consigo esse carinha, mas primeiro não sei se seria o contador/alerta certo e segundo não consigo logar isso para verificar depois. Mas valeu véio
    quinta-feira, 3 de julho de 2008 16:15
  • Boa Tarde,

     

    A idéia do comando é interessante, mas já existe uma solução similar no site da Microsoft.

     

    How to monitor blocking in SQL Server 2005 and in SQL Server 2000

    http://support.microsoft.com/kb/271509/en-us

     

    Support WebCast: Microsoft SQL Server: Rapid Blocker Script Analysis

    http://support.microsoft.com/kb/324885/en-us

     

    Se existe a preocupação com o ambiente "Busy" adianto que o Profiler onera mais que uma consulta na sysprocesses (principalmente se o trace for rodado localmente). Você pode utilizar a coluna Duration como parâmetro para duração de um lock.

     

    Se a idéia é obter informações em um nível mais macro tente utilizar o System Monitor. Se você realmente deseja investigar consultas que provoquem locks só temos o Profiler e os Blocker Scripts.

     

    Vale a pena lembrar que locks são normais e fazem parte das rotinas normais do banco de dados. Tome cuidado para aplicar os filtros devidos e não monitorar bloqueios desnecessários.

     

    [ ]s,

     

    Gustavo

    quinta-feira, 3 de julho de 2008 17:15
  • Eu estava justamente dando uma olhadinha no Blocker script da MS..bem interessante.
    Quanto ao Profiler Gustavo, na verdade eu iria gerar traces server side.Realmente ele pode me onerar bastante se eu for pela IDE. cara.mas qual dos locks eu pego ?..o Acquired ?..É justamente isso que eu não sei, se o trace vai me dar a informação correta que eu estou querendo, na verdade eu não quero locks demorados..eu posso ter um shared lock demorado e este provavelmente não irá escalonar e eu posso ter essa informação erronea (posso estar verifcando isso depois), mas eu queria os processos bloqueados acima de n segundos e o bloqueador destes.

    Acho que o blocker script vai me ajudar mais...

    Valeu cara

    Brigadão
    quinta-feira, 3 de julho de 2008 17:24
  • Olá LPJ,

     

    Você pode utilizar tanto o Acquired quanto o Released afinal em tese todo lock adquirido deverá ser liberado. A IDE realmente pesa mais. Existem formas de gerar o Trace sem utilizar a interface gráfica e a redução da carga pode chegar a 70%. O problema é que gerar o trace apenas via SP é um pouco chato e demanda conhecer vários códigos de eventos.

     

    Como a idéia é monitorar bloqueios, acredito que o Blocker Script seja mais efetivo. O profiler só seria mais interessante para esse tipo de situação se você fosse correlacioná-lo com o Performance Monitor. Assim você poderia ver como o servidor se comporta no momento de um bloqueio e (ou) liberação específica, mas ainda assim acho que o Blocker Script é mais negócio.

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 3 de julho de 2008 18:03