Apa Yang Jadi
Node jira-dc-node2 (10.82.17.94) dalam Jira Data Center preprod cluster crash pada 2025-11-30 pukul 20:31:38 PST. Service terminated dengan signal=KILL. Tiada graceful shutdown logs, tiada OutOfMemoryError dalam app logs.
Terus check /var/log/messages. OS OOM killer yang bunuh Java process:
Out of memory: Killed process 1321858 (java) total-vm:50707132kB, anon-rss:32845268kB
Java guna ~31.3 GB RAM masa tu. Tapi heap usage cuma ~4 GB dari 30 GB limit. So masalah bukan heap leak. Ia off-heap memory, specifically thread stacks yang melambung.
Timeline (18:00 – 20:31)
- ~18:00 — DVCS (GitHub Enterprise) activity senyap 49 minit sebelum crash. Bukan punca.
- ~18:30 — LocalQ cache replication mula blocking teruk. Total blocking time cumulative: 50,913,288 ms (~14 jam).
- ~19:00 — Cluster authentication makin slow. Dari ~1ms naik ke 5+ saat per request.
- ~19:45 — Structure plugin failover: “other node jira-dc-node1 is now responsible for effector!”
- ~20:31 — OOM killer trigger. SIGKILL. Node mati.
Root Cause
Satu JVM parameter yang salah:
-Djava.rmi.server.hostname=10.82.19.201
IP sebenar node ni adalah 10.82.17.94. Dalam cluster.properties dah betul:
ehcache.listener.hostName=10.82.17.94
Tapi java.rmi.server.hostname point ke 10.82.19.201, IP yang tak wujud dalam cluster. Node announce wrong address untuk RMI connections. Other nodes cuba connect ke IP tu, fail, retry, pile up.
Chain of Events
- RMI hostname salah: other nodes tak boleh reach
jira-dc-node2untuk cache replication. - LocalQ queue pile up: blocking threads accumulate.
- Thread count naik: native memory (thread stacks) grows unchecked.
- Total memory exceed system limit: OS OOM killer trigger.
- SIGKILL: Jira process mati tanpa graceful shutdown.
Fix
Betulkan JVM parameter supaya match actual node IP:
-Djava.rmi.server.hostname=10.82.17.94
Pastikan semua nodes dalam cluster ada RMI hostname yang betul. Verify dengan:
ps aux | grep java.rmi.server.hostname
Output patut tunjuk IP yang sama dengan node tu sendiri. Kalau lain, kena betulkan sebelum restart.
Lesson
Satu misconfigured IP boleh cascade jadi full node crash. RMI hostname kena match actual node IP. Kalau tak, cache replication block, threads pile up, memory explode, OOM killer masuk.
Bukan semua crash sebab code bug atau memory leak. Kadang ia config yang salah copy-paste dari node lain dan tak di-update.