Nếu một bế tắc Sự kiện trao đổi song song là nạn nhân ít hơn, đó có phải là một vấn đề?


10

Chúng tôi đang thấy rất nhiều các Bế tắc chủ đề song song truy vấn nội bộ này trong môi trường sản xuất của chúng tôi (SQL Server 2012 SP2 - vâng ... tôi biết ...), tuy nhiên khi nhìn vào Deadlock XML đã được ghi lại thông qua các sự kiện mở rộng, danh sách nạn nhân trống rỗng.

<victim-list />

Sự bế tắc dường như nằm giữa 4 luồng, hai với WaitType="e_waitPipeNewRow"và hai với 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>

Vì thế:

  1. Danh sách nạn nhân trống
  2. Ứng dụng chạy truy vấn không có lỗi và hoàn thành truy vấn
  3. Theo như chúng ta có thể thấy, không có vấn đề rõ ràng nào, ngoài việc đồ thị được chụp

Vì vậy, điều này có gì đáng lo ngại ngoài tiếng ồn?

Chỉnh sửa: Nhờ câu trả lời của Paul, tôi có thể thấy vấn đề có thể xảy ra và xuất hiện để tự giải quyết với sự cố tràn tempdb. nhập mô tả hình ảnh ở đây

Câu trả lời:


11

Tôi sẽ không ngạc nhiên nếu đây là cách biểu đồ khóa chết nhìn khi một bế tắc song song truy vấn nội bộ được giải quyết bằng một sự cố tràn trao đổi (vì vậy không có nạn nhân, ngoại trừ hiệu suất).

Bạn có thể xác nhận lý thuyết này bằng cách nắm bắt các sự cố tràn và trao đổi chúng (hoặc không) với bế tắc.

Viết bộ đệm trao đổi vào tempdb để giải quyết bế tắc là không lý tưởng. Tìm cách loại bỏ các chuỗi các hoạt động bảo quản trật tự trong kế hoạch thực hiện (ví dụ: trao đổi duy trì trật tự cho phép nối song song). Trừ khi nó không gây ra vấn đề hiệu suất đáng chú ý và bạn có những thứ khác phải lo lắng.

Không quan tâm, vấn đề này có khả năng bị trầm trọng hơn bởi số liệu thống kê phân mảnh / lỗi thời cao không?

Phân mảnh, không. Thống kê lỗi thời: không theo bất kỳ ý nghĩa cụ thể nào tôi có thể nghĩ ra, không. Tất nhiên các số liệu thống kê không đại diện hiếm khi là một điều tốt nói chung.

Vấn đề cơ bản ở đây là tính song song hoạt động tốt nhất khi có càng ít phụ thuộc giữa các luồng càng tốt; bảo quản đặt hàng giới thiệu phụ thuộc khá khó chịu. Mọi thứ có thể dễ dàng bị dồn nén, và cách duy nhất để xóa logjam là làm đổ một loạt các hàng được tổ chức tại các sàn giao dịch với tempdb .


-1

Để phân biệt các bế tắc không quan trọng này, "tự giải quyết bằng cách tràn" khỏi các bế tắc quan trọng hơn, một số ngữ nghĩa tìm kiếm có thể được áp dụng cho cấu trúc Xdl.

Ví dụ đầu ra

SP sau sẽ không hoạt động ngoài hộp vì nó phụ thuộc vào ufn_ExtractSubstringsByPotype () tuy nhiên phương thức đó có thể được thay thế bằng thứ gì đó trả về số đếm khác biệt trực tiếp.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.