locked
Locks do mesmo recurso RRS feed

  • Pergunta

  • Bom dia pessoal,

    Ambiente:
     Temos um servidor Windows 2003, SQL Server 2000 SP4, 2 CPU Quad (8 core), 16GB RAM, dados em storage EMC.
     Temos um banco médio, de uns 50 GB, com muitas tabelas (2500) e em média 80 a 100 usuarios simultâneos.
     Este banco é usado por uma aplicação web java e por alguns clientes ms access.

    Problema:
     De alguns dias para cá, aumentou muito a quantidade de locks. Chegando a empilhar mais de 300 processos. Identificando o processo que iniciou a sequencia de locks, para nossa surpresa identificamos que eram clientes Access não fazendo nada, ou apenas um select numa tabela de 15 mil registros.

    As vezes temos problemas com locks, e acabamos matando o processo causador, mas são usuários que disparam algum processo realmente pesado, com transações atualizando diversas tabelas que podem levar horas e não deviam ser rodados durante o dia.

    Mas neste caso em especial, no máximo o usuario simplesmente pesquisou um nome nesta tabela.

    Verificando o status destes processos pela tabela sysprocesses, estão com o status RUNNABLE e o waittype 0x800 (NETWORKIO), e cpu e physical_io ficam inalterados. O servidor não está sobrecarregado nestes momentos.

    Verificando pelo Enterprise Manager -> ... -> Locks / Process ID ... selecionando o processo, achei algo que me pareceu interessante, 3 vezes que isto ocorreu, estes dados eram exatamente os mesmos:
    Object		LockType	Mode	Status	Owner	Index			Resource	
    -------------- -------------- ------ ------ ------ -------------- ----------------
    nome_banco DB S GRANT Sess tblAAAAA
    tblBBBBB PAG S GRANT Xact ordFuncionario03 1:4098160
    tblBBBBB TAB IS GRANT Xact tblAAAAA

    Tentando verificar o comando executado pelo processo, ou pego apenas "sp_execute;1 " ou um select simples "SELECT coluna_chave FROM dbo.tblBBBBB "

    Eu sei que saber exatamente o que as aplicações estão fazendo ajudaria, mas são produtos de terceiros e não temos direito de acesso aos fontes.

    Gostaria se possível, que alguém me ajudasse a interpretar esta situação. Não sei exatamente o que atacar, a tabela, os indices, o cliente, problemas de rede ...

    Muito obrigado
    um abraço!

    Caiut
    quinta-feira, 2 de abril de 2009 13:44

Todas as Respostas

  • Bom Dia Caiut,

    Sobre o primeiro ponto, "clientes Access não fazendo nada, ou apenas um select numa tabela de 15 mil registros", acredito que você deve verificar a string de conexão do access para seu database, ou então, disponibilizar VIEWS para os usuários. Observa que a view deve ser construida com Hints "with (nolock)", isso ajudará a evitar bloqueios no teu banco. Pode também, configurar o "isolation level" (nível de transação) destes clientes para READ UNCOMMITTED. Avalie os casos.

    Em relação a outra questão, tente utilizar o comando "DBCC INPUTBUFFER", isso poderá te dar informações adicionais sobre o comando executado pelo cliente.

    No meu ponto de vista, você tem um banco bastante acesasdo. Quanto mais usuários, mais atômicas devem ser as transações. Como há muitas transações em aberto, um simples select pode contribuir para um lock, pois mesmo o select faz um "bloqueio compartilhado" na tabela para recuperar apenas dados comitados.

    Observa a coluan MODE, não há locks exclusivos, acho que o problema não são estes processos e sim outros que acessam os mesmos recursos de forma exclusiva.

     

    Espero ter ajudado,

    Giovani Decusati

    sexta-feira, 3 de abril de 2009 14:17
  • Caiut,


    Concordo com o Giovani!!!

    Você já pensou em realizar algum tipo de monitoramento sobre este Banco de Dados?

    Utilizar o comando DBCC Inputbuffer é uma possibilidade interessante, mas acredito que poderiamos trabalhar com o Profiler.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 6 de abril de 2009 17:43
    Moderador
  • Obrigado Giovani,
    muito obrigado pelas informações.

    Eu tenho um problema sério; estes aplicativos Access são na verdade parte de um produto. Eles estão no formato MDE, logo não conseguimos acessar os códigos para alterar algum comando SQL emitido pelo programa. A saída óbvia seria passar para o fornecedor corrigir o problema, mas não temos mais contrato com eles.

    Estes aplicativos usam uma conexão ODBC com o SQL Server. Vocês sabem se eu conseguiria alterar o isolation level na configuração ODBC ? Achei na web que o driver ODBC do SQL Server possui o atributo SQL_TXN_ISOLATION que pode ser setado para SQL_TXN_READ_UNCOMMITED. Mas não sei como setá-lo!

    Também tenho problemas para usar NOLOCK ou optar por VIEWS pois não temos acesso as queries que estão compiladas dentro do MDE.

    Para pegar o comando usei o BDCC INPUTBUFFER mesmo, foi dai que peguei aquela query "SELECT coluna_chave FROM dbo.tblBBBBB "

    Realmente esse sistema é bastante acessado, mas como não foi desenvolvido por nós, não temos controle sobre como os processos foram escritos. Tanto na parte Web quanto na Access vemos muitas consultas que poderiam ser mais atômicas.

    Agradeço novamente a ajuda,
    um abraço!

    Caiut
    quarta-feira, 8 de abril de 2009 16:49
  • Boa tarde Junior,

    Monitoramos bastante este banco, mas temos muitos problemas para alterar a aplicação como dissemos pois tratar-se de um produto terceiro que não temos os fontes.

    Usamos bastante o profiler sim, mas em poucos minutos capturamos milhares de acessos ...
    Estamos tentando encontrar os problemas pelo Profiler, pelo Enterprise (locks/process id), com a sp_lock, sp_who, sp_who2, pela sysprocesses diretamente ...

    Estou tendo mais dificuldade em interpretar esses dados. Se não há nenhum processo com lock exclusivo porque os outros não terminam? Pq este processo que fica aparentemente travado, sem alteração de io e cpu, não está bloqueado por nenhum outro e não termina ...
    O que pode estar acontecendo para gerar o waittype 0x800 = NETWORKIO ...
    Pq em várias vezes que aconteceu o problema o mesmo recurso (1:4098160) estava sendo utilizado ... etc ..

    obrigado,
    até mais!
    quarta-feira, 8 de abril de 2009 17:02
  • Caiut,


    Se que esta aplicação não esta gerando algum tipo de erro?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 8 de abril de 2009 18:03
    Moderador
  • O cliente Access fica travado, aparentemente esperando o processo servidor; e o processo no SQL está com aquele status NETWORKIO esperando o cliente pegar os dados ....

    Achei alguém explicando este NETWORKIO em: http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/52344012-04ce-4d72-b179-0628e0274d28/?prof=required

    obrigado,
    até mais!
    quinta-feira, 9 de abril de 2009 19:34
  • Caiut,

    Qual é a versão do Access que você esta utilizando?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 13 de abril de 2009 17:15
    Moderador