Eu tenho um aplicativo que está indo para baixo como resultado de tempos limite. Durante esses períodos, vemos um aumento maciço nos tempos de resposta do banco de dados que contém o estado da sessão ASP.
Em um esforço para diagnosticar o problema, usei SP_CONFIGURE'blocked process threshold',15
e executei um rastreamento para capturar todos os eventos disparados. Durante o próximo incidente, o rastreamento captura alguns eventos de bloqueio no banco de dados do estado da sessão.
Identifiquei o bloqueador de chumbo e posso ver que está suspenso e esperando.
<blocked-process-report>
<blocked-process>
<process id="process53fb4c8"
taskpriority="0" logused="0"
waitresource="KEY: 10:72057594039238656 (594b17b7493c)" waittime="20631"
ownerId="9710782702" transactionname="UPDATE"
lasttranstarted="2013-06-27T17:29:38.130" XDES="0xc429df950" lockMode="U"
schedulerid="14" kpid="6912" status="suspended" spid="359" sbid="0" ecid="0"
priority="0" trancount="2" lastbatchstarted="2013-06-27T17:29:38.130"
lastbatchcompleted="2013-06-27T17:29:38.107"
clientapp=".Net SqlClient Data Provider" hostname="WEB03" hostpid="7520"
loginname="State" isolationlevel="read committed (2)" xactid="9710782702"
currentdb="10" lockTimeout="4294967295"
clientoption1="536870944" clientoption2="128056">
<executionStack>
<frame line="18" stmtstart="1114" stmtend="4494"
sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
</executionStack>
<inputbuf>
Proc [Database Id = 10 Object Id = 117575457]
</inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="suspended" waittime="1046" spid="217" sbid="0" ecid="0"
priority="0" trancount="1" lastbatchstarted="2013-06-27T17:29:29.113"
lastbatchcompleted="2013-06-27T17:29:29.010"
clientapp=".Net SqlClient Data Provider" hostname="WEB02" hostpid="6236"
loginname="CState" isolationlevel="read committed (2)" xactid="9710776428"
currentdb="10" lockTimeout="4294967295" clientoption1="536870944"
clientoption2="128056">
<executionStack>
<frame line="18" stmtstart="1114" stmtend="4494"
sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
</executionStack>
<inputbuf>
Proc [Database Id = 10 Object Id = 117575457]
</inputbuf>
</process>
</blocking-process>
</blocked-process-report>
minhas perguntas são
- Para que serve a unidade de tempo
waittime="1046"
? - Em que recurso está a espera?
- Para onde ir a partir daqui?
O processo bloqueado está esperando por uma CHAVE (portanto em uma linha), por 20631 ms (~20s).
A transação de bloqueio ainda está executando uma instrução, provavelmente o UPDATE que causa o bloqueio. Não está bloqueado, se estivesse bloqueado, não seria a ponta da cadeia de espera. Está em execução, agora está suspenso (não bloqueado!) Significando que apenas cedeu CPU.
Parece que você tem uma instrução UPDATE de execução longa, provavelmente tem um índice ausente e aciona uma verificação de tabela que bloqueia todos os leitores. Use
sys.dm_exec_sql_text
no identificador0x03000a00210f020741a1be0058a000000100000000000000
para recuperar a instrução exata que está sendo executada.BTW, seu processo bloqueado é exatamente o mesmo UPDATE (mesmo identificador, mesmo proc, mesmos deslocamentos), o que não é surpreendente. Parece que seu procedimento armazenado com ID de objeto 117575457 contém uma ATUALIZAÇÃO que não está otimizada.