The 3:00 AM Outage Drills: Linux & Docker Production Emergency Response Cheatsheet
Οδηγός άμεσης επέμβασης σε νυχτερινές βλάβες παραγωγής: 100% γεμάτος δίσκος από Docker logs, εξάντληση PIDs από zombie διεργασίες και starvation του connection pool της PostgreSQL.
Χωρίς πρόσφατο έλεγχο περιεχομένου. Οι εντολές και τα παραδείγματα ενδέχεται να έχουν αλλάξει από τη δημοσίευση.
Οδηγός άμεσης επέμβασης σε νυχτερινές βλάβες παραγωγής: 100% γεμάτος δίσκος από Docker logs, εξάντληση PIDs από zombie διεργασίες και starvation του connection pool της PostgreSQL.
The 3:00 AM Outage Drills: Production Emergency Response
Όταν χτυπάει το pager στις 3:00 π.μ., η ψυχραιμία και η μεθοδικότητα κάνουν τη διαφορά ανάμεσα σε 5 λεπτά downtime και 5 ώρες καταστροφής.
Drill 1: 100% Disk Full από Docker JSON Logs
Σύμπτωμα: No space left on device, τα services αρνούνται να γράψουν logs ή sessions.
bash# 1. Έλεγχος διαθέσιμου χώρου ανά partition df -h # 2. Εντοπισμός των μεγαλύτερων καταλόγων στο /var/lib/docker du -sh /var/lib/docker/containers/* | sort -rh | head -n 5 # 3. ΑΣΦΑΛΗΣ εκκαθάριση του log χωρίς επανεκκίνηση του container truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log # 4. Μόνιμη πρόληψη στο /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
Drill 2: Zombie Processes & PID Table Exhaustion
Σύμπτωμα: fork: Resource temporarily unavailable. Η εντολή top δείχνει ελάχιστη χρήση CPU/RAM, αλλά καμία νέα διεργασία δεν ξεκινά.
bash# 1. Εντοπισμός zombie διεργασιών (<defunct>) ps aux | grep 'Z' # 2. Εύρεση του Parent Process ID (PPID) που δεν κάνει wait() ps -o ppid= -p <zombie-pid> # 3. Αποστολή SIGHUP ή τερματισμός του γονέα kill -HUP <parent-pid>
Drill 3: PostgreSQL Connection Pool Starvation
Σύμπτωμα: FATAL: remaining connection slots are reserved for non-replication superuser connections.
sql-- Εντοπισμός idle connections που κρατούνται ανοιχτά SELECT pid, usename, client_addr, state, age(clock_timestamp(), query_start) FROM pg_stat_activity WHERE state = 'idle in transaction' ORDER BY age DESC; -- Τερματισμός κολλημένων sessions SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle in transaction' AND age(clock_timestamp(), query_start) > interval '5 minutes';
terminal:incident{ "exerciseId": "ex-incident-pgpool-starvation", "version": 1, "title": "3:00 AM Incident: PostgreSQL Connection Pool Starvation", "task": "Η βάση επιστρέφει σφάλματα κορεσμού συνδέσεων. Επανεκκινήστε το PgBouncer ή απελευθερώστε τα idle sessions.", "objective": { "type": "incident-resolved", "scenario": "postgres-conn-exhaustion" }, "hints": [ "Ελέγξτε τα logs με 'cat /var/log/postgresql/postgresql.log' ή 'systemctl status pgbouncer'.", "Επανεκκινήστε το connection pooler με 'systemctl restart pgbouncer'." ] }
4. Live Interactive Drill: 100% Full Docker Logs Emergency
Δοκιμάστε τώρα ζωντανά στο διαδραστικό τερματικό παρακάτω. Ο δίσκος /var/lib/docker έχει φτάσει στο 100% και τα web services κρασάρουν. Εντοπίστε το πρόβλημα με df -h και du -sh και απελευθερώστε χώρο μηδενίζοντας το log με truncate -s 0 /var/lib/docker/containers/web-1234/web-1234-json.log ή εκτελώντας docker system prune -f!
terminal:incident{ "exerciseId": "ex-incident-docker-disk-full", "version": 1, "title": "3:00 AM Incident: Docker Runaway Logs", "task": "Απελευθερώστε χώρο στο σύστημα αρχείων που έφτασε στο 100% capacity.", "objective": { "type": "incident-resolved", "scenario": "disk-full" }, "hints": [ "Ελέγξτε τη χρήση του δίσκου με την εντολή 'df -h'.", "Εντοπίστε το μέγεθος του log με 'du -sh /var/lib/docker/containers/web-1234/web-1234-json.log'.", "Μηδενίστε το αρχείο με 'truncate -s 0 /var/lib/docker/containers/web-1234/web-1234-json.log' ή τρέξτε 'docker system prune -f'." ] }