Deadlocks in einer BizTalk-HV-Umgebung

23.02.2017

In einer hochverfügbaren BizTalk Server 2013 Enterprise Installation mit abgesetztem SQL Server 2012 Cluster kam es sporadisch zu rätselhaften Deadlocks (allem Anschein nach immer bei hoher Last). In diesem quiTeq zeigt Arda, Support Engineer in Stuttgart, worin das Problem besteht und wie man es löst.

Problem

In der HV-Installation suspenden sich sporadisch Nachrichten und können nur manuell wieder resumed werden. Nicht gerade sehr erfreulich - v.a. bei hoher Last ;-( Die Ursache: Deadlocks. Eine typische Fehlermeldung im Eventlog lautete:

A message sent to adapter "HTTP" on send port "kunde.AS2.ORDERS-DESADV" with URI "http://80.149.96.170:4080" is suspended.
Error details: There was a failure executing the send pipeline:
edihub.kunde.pipelines.as2.AS2EdiSendRemoveTestIndicator, edihub.kunde.pipelines.as2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b0b82818d5063765" Source: "AS2 encoder" Send Port: "kunde.AS2.ORDERS-DESADV" URI: "http://80.149.96.170:4080" Reason: Unable to create the entry in the AS2 EDIINT MIC table. This could be caused by duplicate AS2-From, AS2-To and MessageID combinations being written to the table. Error: Transaction (Process ID 242) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

MessageId: {51079E0C-5031-438A-82AD-75CAB624D3A2}
InstanceID: {CDB378BA-8360-41EB-AA2A-5E90FA9BC4C7}

Da der Fehler nur sporadisch auftrat, konnte er nicht in der Anwendung liegen. Wir mussten tiefer graben und wurden schließlich in den DB-Einstellungen des BizTalk Servers für Parallelität fündig. Bei fehlerhafter Konfiguration werden bestimmte Nachrichtenvorgänge so parallel abgearbeitet, dass sie Ressourcen gegenseitig blockieren. Es kommt zu Deadlocks, welche die Nachrichtenverarbeitung auf einen Fehler laufen lassen. 

Lösung

Die Konfiguration für den Wert 'Max Degree of Parallelism' war nicht korrekt gesetzt.

Auf der Maschine, auf welcher der SQL Server mit der BizTalkMsgBoxDb läuft, müssen der Max Degree of Parallelism-run_value und -config_value beide auf den Wert '1' gesetzt sein. Andernfalls kann es tatsächlich bei höherer Last zu Deadlocks aufgrund falscher, paralleler Verarbeitung kommen.

Um herauszufinden, welchen Wert die Max Degree of Parallelism settings haben, kann man die folgende stored procedure auf der Master db im SQL Server ausführen:

exec sp_configure 'max degree of parallelism'

Wenn der run_value and config_value nicht beide den Wert '1' haben, kann man die folgende stored procedure im SQL Server ausführen, um diese auf '1' zu setzen:

exec sp_configure 'max degree of parallelism', '1'

reconfigure with override

Dann muss der SQL server neu gestartet werden. Und die Deadlocks sind erfolgreich ausgesperrt.

zurück

© 2017 QUIBIQ GmbH · AGB und Nutzungsbedingungen