Best Practices für Deadlocks

7

Wir führen Postgres 9.3 aus und haben gelegentlich Deadlock-Probleme. Derzeit bemerkt jemand die Prozesse und beendet sie manuell. Gibt es eine bewährte Methode, um mit diesen umzugehen, wenn sie auftreten? Ich weiß, dass es eine gibt statement_timeout, lock_timeoutund deadlock_timeoutdie meisten Stellen, die ich lese, geben an, dass Sie dies nicht in der postgres.confDatei festlegen möchten .

Ich wollte nur sehen, ob es dafür eine typische / Best-Practice-Methode gibt. Es sieht so aus, als würde es ausreichen, deadlock_timeout auf ungefähr 10 Minuten zu setzen, aber ich wollte sicherstellen, dass mir kein Schlüssel fehlt, warum das eine schlechte Idee wäre.

Toolman21
quelle
Wenn IIRC alle diese Einstellungen auf ihren jeweiligen Standardeinstellungen belässt, lösen sich Deadlocks ziemlich schnell von selbst auf. Schauen Sie sich unsere Protokolle genauer an, um etwas Konkreteres zu sagen. Der Umgang mit Deadlocks ist jedoch immer besser, wenn sichergestellt wird, dass alle Abfragen ihre Eingaben in derselben Reihenfolge verarbeiten. Dies bedeutet, dass Sie nicht versuchen, die Deadlocks zu beheben, wenn sie auftreten, sondern sie verhindern .
Dekso
1
@dezso Ich vermute ein Missverständnis zwischen Long Running Block und Deadlock. Deadlocks geben dem Support Desk normalerweise keine Zeit, um den (ausgewählten) Blocker zu töten, und zeigen dem Benutzer normalerweise einen Fehler an. Lang laufende Blocker sind etwas anderes
Tom V - versuchen Sie topanswers.xyz
Das Durchgehen des Codes ist etwas, das auf jeden Fall erledigt werden muss und wenn auch langsam. Ich suchte kurzfristig nach etwas, das die Sitzungen beenden würde, wenn sie hängen bleiben. Ich spreche möglicherweise von einem Block mit langer Laufzeit, die beiden Aussagen hängen und keine wird ohne die andere enden. Der Benutzer bekommt nur ein sich drehendes Rad, wenn das passiert.
Toolman21
Im Falle eines echten Deadlocks tötet Postgres einen von ihnen automatisch. Ich stimme Tom zu, dass Sie höchstwahrscheinlich keine Deadlock-Situation haben, wenn Sie die Sitzungen selbst beenden müssen.
a_horse_with_no_name

Antworten:

5

10 Minuten ist eine extrem hohe Einstellung für deadlock_timeout, was auch erklären kann, warum Sie sogar die Möglichkeit haben, manuell einzugreifen. Der Standardwert ist 1 Sekunde und das Handbuch empfiehlt :

Der Standardwert ist eine Sekunde ( 1s), was wahrscheinlich dem kleinsten Wert entspricht, den Sie in der Praxis wünschen würden. Auf einem stark ausgelasteten Server möchten Sie ihn möglicherweise erhöhen. Idealerweise sollte die Einstellung Ihre typische Transaktionszeit überschreiten, um die Wahrscheinlichkeit zu verbessern, dass eine Sperre aufgehoben wird, bevor der Kellner entscheidet, auf Deadlock zu prüfen. Nur Superuser können diese Einstellung ändern.

Ich erwarte nicht, dass Ihre typischen Transaktionen 10 Minuten überschreiten . Versuchen Sie es mit etwa 20 Sekunden, wenn Sie lange laufende Abfragen haben.

Die beste Verteidigung gegen Deadlocks ist auch hier dokumentiert :

Die beste Verteidigung gegen Deadlocks besteht im Allgemeinen darin, sie zu vermeiden, indem sichergestellt wird, dass alle Anwendungen, die eine Datenbank verwenden, Sperren für mehrere Objekte in einer konsistenten Reihenfolge erwerben.

Wenn Sie dies konsequent tun, besteht keine Chance auf einen Deadlock.

Erwin Brandstetter
quelle