Εργάζομαι ως unix system engineer (ή ακόμα καλύτερα: I am a Linux Administrator but I am looking for a decent job) και σήμερα αντιμετώπισα ένα δύσκολο παλζ. Και λέω παλζ γιατί πλέον τα προβλήματα που “πληρώνομαι” να επιλύσω είναι off the book κι όχι by the book!
Στην διαχείρισή μου βρίσκονται και τρία (3) μηχανάκια με το εξής λειτουργικό σύστημα:
Red Hat Enterprise Linux 2.1 AS (Pensacola). Και πριν προλάβετε να πείτε την κακία σας, να αναφέρω ότι από το 2002 (ή 2003 δεν θυμάμαι) δουλεύουν μια χαρά χωρίς (πολλά) προβλήματα.
Το load λοιπόν είχε ανέβει αρκετά σε τέτοιο σημείο που ένα νέο ssh access προς αυτά ΔΕΝ ήταν εφικτό. Ο συνάδελφος που αντιλήφθηκε το πρόβλημα είχε ήδη ανοιχτό root shell κι έτσι δανείστηκα τον υπολογιστή του (και το πανάθλιο πληκτρολόγιό του - πάταγες ένα πλήκτρο έγραφε τέσσερα γράμματα μαζί!) και ξεκίνησα το οδοιπορικό προς τον παράδεισο.
Έπρεπε όμως να περάσω πρώτα από κόλαση και καθαρτήριο πριν φτάσω στον παράδεισο.
Κόλαση:
Σίγουρα λοιπόν κάποια processes έτρωγαν πόρους από το σύστημα. Αλλά ποια; Η εντολή ps είναι φυσικά αδύνατη να εκτελεστεί (too many open files) όπως επίσης κι άλλες πολλές. Ο φόβος ήρθε όταν το df δεν ολοκληρωνόταν! Τα μηχανάκια είχαν περίπου 500 μέρες uptime που σημαίνει ότι ΔΕΝ ήξερα εάν θα σηκωθούν μετά από ένα hardware reboot. Οκ, δεν έπαιζε τίποτα λοιπόν. Τι κάνουμε; Αρχικά σκέφτηκα ότι κάποιο nfs mount point είχε αποτύχει και διάφορες διεργασίες προσπαθούσαν να γράψουν ή να κλείσουν ανοιχτά αρχεία. Αλλά ούτε η lsof έπαιζε.
Καθαρτήριο:
Κι ενώ έχουμε στο τηλέφωνο συνάδελφο με το δάχτυλο στο power μου ήρθε μια ιδέα και φωνάζω:
- Μηηηηη, όχι ακόμα.
Η εντολή cat λειτουργούσε κι έτσι έκανα ένα cat /etc/fstab για να δω εάν υπήρχε κάποιο nfs mount. Δεν υπήρχε τίποτα. Κι ενώ το load είχε ανέβει πάνω από το 20 (μέσω uptime) και η ps συνέχιζε να μην δείχνει τίποτα, μία φωνή άκουγα να μου λέει: PROC …. PROC … PROC …
Μεταφέρομαι λοιπόν στο /proc και κάνω ένα ls. Χαμός κύριοι και κυρίες μου. Χαμός από καταλόγους με αριθμούς αντί για όνομα. Αρχίζω λοιπόν και ψάχνω αρχικά στα processes με μεγάλο αριθμό και με την εντολή cat να διαβάζω το αρχείο cmdline
Παράδεισος:
Κι έτσι ξεκινάμε λοιπόν να σκοτώνουμε ότι δεν χρειάζεται κι έχει κολλήσει. Δυστυχώς κάποια backup scripts ΔΕΝ είχαν ολοκληρωθεί με αποτέλεσμα να δεσμεύουν αρκετή μνήμη και δίσκο χωρίς λόγο. find, updatedb, perl scripts (πανάθεμα την perl, τίποτα δεν δουλεύει), awk (από διάφορα shell scripts) προσπαθούσαν να πάρουν τους δεσμευμένους πόρους. Σκοτώνω και το cron daemon μέχρι να πέσει το load αρκετά και να αρχίσουν να λειτουργούν τα μηχανάκια και πάλι σωστά.
Κι έτσι μετά από λίγο αυτά τα τρία πανάρχαια μηχανάκια με redhat 2.1 λειτουργούσαν και πάλι άψογα! Οπότε μην ξεχνάτε το proc. Μάθετε τι είναι και τι περιέχει. Τι είναι όλα αυτά τα αρχεία που έχει μέσα.
Έτσι την επόμενη φορά που θα βρεθείτε σε παρόμοιο πρόβλημα θα ξέρετε τι πρέπει να κάνετε.
ΥΓ: Την επόμενη φορά θα σας πω μια ιστορία για τους σηματοφόρους στον πυρήνα.