Parallelism Exchange Event 교착 상태가 피해자가없는 경우 문제입니까?


10

프로덕션 환경 (SQL Server 2012 SP2-예 ... 알겠습니다 ...)에서 이러한 인트라 쿼리 병렬 스레드 교착 상태 를 많이보고 있지만 확장 이벤트를 통해 캡처 된 교착 상태 XML을 보면 희생자 목록이 비어 있습니다.

<victim-list />

교착 4 개 스레드의 두 사이에 표시 WaitType="e_waitPipeNewRow"하고, 두 WaitType="e_waitPipeGetRow".

 <resource-list>
  <exchangeEvent id="Pipe13904cb620" WaitType="e_waitPipeNewRow" nodeId="19">
   <owner-list>
    <owner id="process4649868" />
   </owner-list>
   <waiter-list>
    <waiter id="process40eb498" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Pipe30670d480" WaitType="e_waitPipeNewRow" nodeId="21">
   <owner-list>
    <owner id="process368ecf8" />
   </owner-list>
   <waiter-list>
    <waiter id="process46a0cf8" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Pipe13904cb4e0" WaitType="e_waitPipeGetRow" nodeId="19">
   <owner-list>
    <owner id="process40eb498" />
   </owner-list>
   <waiter-list>
    <waiter id="process368ecf8" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Pipe4a106e060" WaitType="e_waitPipeGetRow" nodeId="21">
   <owner-list>
    <owner id="process46a0cf8" />
   </owner-list>
   <waiter-list>
    <waiter id="process4649868" />
   </waiter-list>
  </exchangeEvent>
 </resource-list>

그래서:

  1. 피해자 목록이 비어 있습니다
  2. 쿼리를 실행하는 응용 프로그램은 오류가없고 쿼리를 완료합니다
  3. 우리가 볼 수있는 한 그래프가 캡처되는 것 외에는 명백한 문제가 없습니다.

그러므로 이것이 노이즈 이외의 것에 대해 걱정할 것이 있습니까?

편집 : Paul의 답변 덕분에 문제가 어디에서 발생할 수 있으며 tempdb 유출로 자체적으로 해결되는 것처럼 보입니다. 여기에 이미지 설명을 입력하십시오

답변:


11

쿼리 유출 병렬 교착 상태가 교환 유출에 의해 해결 될 때 교착 상태 그래프가 보이는 방식이라면 놀라지 않을 것입니다 (따라서 성능을 제외하고는 희생자가 없습니다).

교환 유출을 포착하고 교착 상태와 일치 (또는 일치하지 않음)하여이 이론을 확인할 수 있습니다.

교착 상태를 해결하기 위해 교환 버퍼를 tempdb 에 작성 하는 것은 이상적이지 않습니다. 실행 계획에서 주문 보존 작업 순서를 제거하십시오 (예 : 병렬 병합 조인을 제공하는 주문 보존 교환). 눈에 띄는 성능 문제를 일으키지 않는 한 걱정할 사항이 없습니다.

관심이 없다면,이 문제는 높은 조각화 / 오래된 통계로 인해 악화 될 가능성이 있습니까?

조각화 오래된 통계 : 내가 생각할 수있는 특별한 의미는 없습니다. 물론 대표 통계는 일반적으로 좋은 일이 아닙니다.

여기서 근본적인 문제는 병렬 처리가 가능한 스레드 사이에 종속성이 적을 때 가장 잘 작동한다는 것입니다. 보존 순서는 다소 불쾌한 의존성을 유발합니다. 상황이 쉽게 구겨질 수 있으며 logjam을 지우는 유일한 방법은 tempdb와의 교환에서 유지되는 많은 행을 흘리는 것 입니다.


-1

이러한 중요하지 않은 "유출에 의한 자체 해결"교착 상태를보다 중요한 교착 상태와 구별하기 위해 일부 검색 시맨틱을 Xdl 구조에 적용 할 수 있습니다.

출력 예

다음 SP는 ufn_ExtractSubstringsByPattern ()에 의존하므로 기본적으로 작동하지 않지만 해당 메서드는 고유 카운트를 직접 반환하는 것으로 대체 될 수 있습니다.

ALTER view [Common].[DeadLockRecentHistoryView]
as
/*---------------------------------------------------------------------------------------------------------------------
    Purpose:  List history of recent deadlock events

    Warning:  The XML processing may hit a recursion limit (100), suggest using "option (maxrecursion 10000)".

    Xdl File:
        The SSMS deadlock file format .XDL format (xml) has changed with later versions of SQL Server.  This version tested with 2012.

    Ring Buffer issues:
        https://connect.microsoft.com/SQLServer/feedback/details/754115/xevents-system-health-does-not-catch-all-deadlocks
        https://www.sqlskills.com/blogs/jonathan/why-i-hate-the-ring_buffer-target-in-extended-events/

    Links:
        http://www.sqlskills.com/blogs/jonathan/multi-victim-deadlocks/
        https://www.sqlskills.com/blogs/jonathan/graphically-viewing-extended-events-deadlock-graphs/
        http://www.mssqltips.com/sqlservertip/1234/capturing-sql-server-deadlock-information-in-xml-format/
        http://blogs.msdn.com/b/sqldatabasetalk/archive/2013/05/01/tracking-down-deadlocks-in-sql-database.aspx
        http://dba.stackexchange.com/questions/10644/deadlock-error-isnt-returning-the-deadlock-sql/10646#10646        

    Modified    By           Description
    ----------  -----------  ------------------------------------------------------------------------------------------
    2014.10.29  crokusek     From Internet, http://stackoverflow.com/questions/19817951
    2015.05.05  crokusek     Improve so that the output is consumable by SSMS 2012 as "Open .xdl file"                             
    2015.05.22  crokusek     Remove special character for the cast to Xml (like '&')
    2017.08.03  crokusek     Abandon ring-buffer approach and use event log files.  Filter out internal deadlocks.
    2018.07.16  crokusek     Added field(s) like ProbablyHandledBySpill to help identify non-critical deadlocks.
  ---------------------------------------------------------------------------------------------------------------------*/
with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData         
    from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)      
   where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'       
)
select top 10000
       EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as CreatedUtc,
       --(select TimePst from Common.ufn_ConvertUtcToPst(EventData.value('(event/@timestamp)[1]', 'datetime2(7)'))) as CreatedPst,
       DistinctSpidCount,       
       HasExchangeEvent,
       IsVictimless,                  
       --
       -- If the deadlock contains Exchange Events and lists no victims, it probably occurred
       -- during execution of a single query that contained parallellism but got stuck due to 
       -- ordering issues.   /dba/197779
       -- 
       -- These will not raise an exception to the caller and will complete by spilling to tempdb
       -- however they may run much slower than they would without the spill(s).
       --
       convert(bit, iif(DistinctSpidCount = 1 and HasExchangeEvent = 1 and IsVictimless = 1, 1, 0)) as ProbablyHandledBySpill,
       len(et.XdlFileText) as LenXdlFile,
       eddl.XdlFile as XdlFile
  from XmlDeadlockReports
 cross apply 
     ( 
       select eventData.query('event/data/value/deadlock') as XdlFile 
     ) eddl
 cross apply 
     ( 
        select convert(nvarchar(max), eddl.XdlFile) as XdlFileText 
     ) as et
 cross apply 
     (
       select count(distinct Match) as DistinctSpidCount
         from common.ufn_ExtractSubstringsByPattern(et.XdlFileText, 'spid="%%"')
     ) spids
 cross apply
     (
       select convert(bit, iif(charindex('<exchangeEvent', et.XdlFileText) > 0, 1, 0)) as HasExchangeEvent,
              --
              convert(bit, iif(     charindex('<victim-list>', et.XdlFileText) = 0
                                and charindex('<victim-list/>', et.XdlFileText) > 0, 1, 0)) as IsVictimless
     ) as flags        
 order by CreatedUtc desc
GO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.