使用阻塞进程报告诊断阻塞问题

ret*_*ala 2 sql-server profiler locking session

我有一个应用程序由于超时而关闭。在这些时间里,我们看到保存 ASP 会话状态的数据库的响应时间大幅增加。

为了诊断问题,我使用SP_CONFIGURE'blocked process threshold',15并运行跟踪以捕获任何触发的事件。在下一个事件期间,跟踪捕获会话状态数据库中的一些阻塞事件。

我已经确定了主要拦截器,可以看到它已暂停并等待。

<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>
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 时间单位是waittime="1046"干什么用的?
  2. 等待的是什么资源?
  3. 然后去哪儿?

Rem*_*anu 6

waitresource="KEY: 10:72057594039238656 (594b17b7493c)" waittime="20631"
             ownerId="9710782702" transactionname="UPDATE" 
Run Code Online (Sandbox Code Playgroud)

被阻塞的进程正在等待一个 KEY(因此在一行上),持续 20631 毫秒(~20 秒)。

阻塞事务仍在执行语句,可能是导致阻塞的 UPDATE。它没有被阻塞,如果它会被阻塞,那么它就不是等待链的尖端。正在执行,现在被挂起(没有被阻塞!)意味着它只是让出 CPU。

看起来您有一个长时间运行的 UPDATE 语句,很可能它缺少索引并触发阻止所有读取器的表扫描。sys.dm_exec_sql_text在句柄0x03000a00210f020741a1be0058a000000100000000000000上使用以检索正在执行的确切语句。

顺便说一句,您被阻止的进程是完全相同的 UPDATE(相同的句柄、相同的过程、相同的偏移量),这一点也不奇怪。看起来您的对象 ID 为 117575457 的存储过程包含未优化的 UPDATE。