Jika kebuntuan Acara Pertukaran Paralelisme tidak menjadi korban, apakah ini masalah?

10

Kami melihat banyak Kebuntuan Urutan Paralel Paralel Intra-Kueri ini dalam lingkungan Produksi kami (SQL Server 2012 SP2 - ya ... Saya tahu ...), namun ketika melihat Deadlock XML yang telah ditangkap melalui Peristiwa yang Diperpanjang, daftar korban kosong.

<victim-list />

Jalan buntu tampaknya antara 4 utas, dua dengan WaitType="e_waitPipeNewRow"dan dua dengan 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>

Begitu:

  1. Daftar Korban kosong
  2. Aplikasi yang menjalankan kueri tidak kesalahan dan melengkapi kueri
  3. Sejauh yang bisa kita lihat, tidak ada masalah yang jelas, selain itu grafik ditangkap

Karena itu, apakah ini yang perlu dikhawatirkan selain kebisingan?

Sunting: Berkat jawaban Paul, saya bisa melihat di mana masalah ini terjadi dan tampaknya menyelesaikan sendiri dengan tumpahan tempdb. masukkan deskripsi gambar di sini

Mark Sinkinson
sumber

Jawaban:

11

Saya tidak akan terkejut jika ini adalah jalan buntu grafik terlihat ketika kebuntuan paralel intra-kueri diselesaikan oleh tumpahan pertukaran (jadi tidak ada korban, kecuali kinerja).

Anda bisa mengkonfirmasi teori ini dengan menangkap tumpahan pertukaran dan mencocokkannya (atau tidak) dengan jalan buntu.

Menulis pertukaran buffer ke tempdb untuk menyelesaikan jalan buntu tidak ideal. Terlihat untuk menghilangkan urutan operasi pengawetan pesanan dalam rencana eksekusi (mis. Pertukaran pesanan pengawetan yang menggabungkan gabungan gabungan paralel). Kecuali itu tidak menyebabkan masalah kinerja yang nyata, dan Anda memiliki hal lain yang perlu dikhawatirkan.

Karena ketertarikan, apakah masalah ini mungkin diperburuk oleh statistik fragmentasi / usang yang tinggi?

Fragmentasi, tidak. Statistik yang sudah ketinggalan zaman: tidak dalam arti tertentu yang dapat saya pikirkan, tidak. Tentu saja statistik yang tidak representatif jarang merupakan hal yang baik secara umum.

Masalah mendasar di sini adalah bahwa paralelisme bekerja paling baik ketika ada sedikit ketergantungan antara utas mungkin; pemesanan yang diawetkan menimbulkan ketergantungan yang tidak menyenangkan. Segala sesuatunya dapat dengan mudah dikacaukan, dan satu-satunya cara untuk menghapus kebuntuan adalah dengan menumpahkan banyak baris yang diadakan di bursa ke tempdb .

Paul White 9
sumber
-1

Untuk membedakan kebuntuan yang tidak penting, "menyelesaikan sendiri dengan tumpahan" dari kebuntuan yang lebih penting, beberapa semantik pencarian dapat diterapkan pada struktur Xdl.

Contoh Output

SP berikut tidak akan berfungsi di luar kotak karena tergantung pada ufn_ExtractSubstringsByPattern () namun metode itu dapat diganti dengan sesuatu yang mengembalikan penghitungan berbeda secara langsung.

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
crokusek
sumber