Runbook: LongTransaction
Source of truth:
tools/observability/alerts/angarabase_alerts.yaml. Backed by: RM-0.6.3.8 S7, RM-0.6.4.4 (SSI).
Что означает
angarabase_txn_oldest_snapshot_age_seconds > 300 — самая старая открытая транзакция
живёт уже более 5 минут. Это блокирует MVCC GC и приводит к bloat.
Для SERIALIZABLE транзакций: длительное удержание транзакции также блокирует очистку (GC) SIREAD-блокировок и графа конфликтов SSI, что может привести к росту ложных прерываний (false positive aborts 40001) для новых транзакций из-за эскалации блокировок.
Severity
warning. При 30+ минутах превращается в реальный блокер для GC.
Для SSI workloads — критично для производительности (throughput) из-за абортов.
Initial response
- Grafana Overview v2 → row “GC / MVCC”.
- Найти PID транзакции:
SELECT pid, age(now(), xact_start) AS age, state, query
FROM angara_stat_activity
WHERE state IN ('idle in transaction', 'active')
ORDER BY xact_start ASC LIMIT 5;
Diagnostics
curl -sf http://127.0.0.1:9898/metrics | rg -E 'txn_(oldest_snapshot|active|idle)'
curl -sf http://127.0.0.1:9898/metrics | rg gc_
Mitigation
| Причина | Действие |
|---|---|
Клиент завис в idle in transaction | Включить idle_in_transaction_session_timeout |
| Долгая аналитическая выборка | Перенести на read-replica; разбить на batched |
| Pgbouncer пул | Проверить server_idle_timeout, рестартовать pool |
| Application bug | Исправить на стороне клиента (transaction scope) |
Принудительный abort (последняя мера):
SELECT pg_terminate_backend(<pid>);
Escalation
Если транзакция > 1 часа и блокирует GC до bloat > 30% — рассмотреть terminate + escalation, документировать инцидент.