Ρύθμιση του Linux OOM Killer για VPS: Ένας πρακτικός οδηγός
12 λεπτά ανάγνωσης - 8 Ιουνίου 2026

Ρυθμίστε το Linux OOM killer στο VPS σας για να προστατεύσετε τις βάσεις δεδομένων και το SSH, να περιορίσετε τις ανεξέλεγκτες διεργασίες με cgroups και να σταματήσετε να σκοτώνεται η λάθος υπηρεσία.
Ρύθμιση του Linux OOM killer για VPS
Το Linux OOM killer είναι η τελευταία λύση του πυρήνα όταν εξαντλείται η μνήμη: επιλέγει μια διαδικασία και την τερματίζει για να διατηρήσει το σύστημα σε λειτουργία. Σε ένα VPS, όπου η μνήμη RAM είναι περιορισμένη και δεν υπάρχει εναλλακτική λύση, η προεπιλεγμένη επιλογή είναι συχνά λανθασμένη. Η βάση δεδομένων σας τερματίζεται, μια διαδικασία που εκτελείται για μεγάλο χρονικό διάστημα επιβιώνει και εσείς μένετε να ανακαλύψετε το γιατί. Αυτός ο οδηγός καλύπτει τον τρόπο με τον οποίο το OOM killer βαθμολογεί τις διαδικασίες, πώς να προσανατολίσετε αυτή τη βαθμολογία προς τις κρίσιμες υπηρεσίες σας και πώς να χρησιμοποιήσετε τα cgroups, ώστε μια μεμονωμένη διαδικασία που έχει ξεφύγει από τον έλεγχο να μην μπορεί να καταστρέψει το υπόλοιπο σύστημα μαζί της.
Πώς ο OOM killer επιλέγει ένα θύμα
Όταν ο πυρήνας δεν μπορεί να ανακτήσει αρκετή μνήμη μέσω της εκδίωξης της προσωρινής μνήμης σελίδων ή της ανταλλαγής, ενεργοποιεί τον OOM killer. Κάθε διαδικασία έχει μια oom_score βαθμολογία μεταξύ 0 και 1000, που προέρχεται κυρίως από το Resident Set Size (RSS) και τη χρήση swap. Η διαδικασία με την υψηλότερη βαθμολογία λαμβάνει ένα SIGKILL.
Το RSS κυριαρχεί στον υπολογισμό, γι' αυτό και η διακοπή σχεδόν πάντα πέφτει στον μεγαλύτερο καταναλωτή μνήμης. Αυτός είναι συχνά η βάση δεδομένων σας, ο διακομιστής εφαρμογών σας ή οποιαδήποτε διαδικασία μακράς διάρκειας που εκτελεί το πιο χρήσιμο έργο. Η διαδικασία που προκάλεσε πραγματικά την εκχώρηση, ο «invoker», σπάνια είναι αυτή που τερματίζεται.
Υπάρχουν δύο είδη συμβάντων OOM που πρέπει να διαχωρίζετε:
- Global OOM: ο κεντρικός υπολογιστής (ή το VPS σας στο σύνολό του) έχει εξαντλήσει τη μνήμη RAM και το swap. Ο πυρήνας σαρώνει κάθε διαδικασία και τερματίζει αυτή με την υψηλότερη βαθμολογία.
- Cgroup OOM: μια συγκεκριμένη cgroup έχει φτάσει στο όριο μνήμης της. Ο πυρήνας τερματίζει μόνο μέσα σε αυτή την cgroup, ακόμα και αν το υπόλοιπο σύστημα έχει μνήμη διαθέσιμη.
Εάν έχετε ρυθμίσει όρια μονάδων systemd ή εκτελείτε containers, τα περισσότερα συμβάντα OOM θα είναι cgroup OOM. Αυτό είναι θετικό: η έκταση της επίδρασης περιορίζεται.
Εντοπισμός πίεσης μνήμης πριν από τη διακοπή
Τα συμβάντα OOM σχεδόν ποτέ δεν είναι ξαφνικά. Συνήθως υπάρχει πρώτα ένα παράθυρο αυξανόμενης πίεσης και ο στόχος της παρακολούθησης είναι να το εντοπίσει μέσα σε αυτό το παράθυρο.
free -h σας δίνει την προβολή του συστήματος. Η στήλη που έχει σημασία είναι available, όχι free: αντιπροσωπεύει την ανακτήσιμη προσωρινή μνήμη σελίδων και αντανακλά το τι μπορείτε πραγματικά να εκχωρήσετε χωρίς εναλλαγή. Διατηρήστε MemAvailable πάνω από περίπου 10 έως 15 τοις εκατό MemTotal σε συνθήκες μέγιστου φορτίου.
Για κατανομή ανά διεργασία, ταξινομήστε κατά RSS:
ps aux --sort=-%mem | head -10Ή χρησιμοποιήστε htop και ταξινομήστε κατά RES. Οι τιμές που βλέπετε εδώ τροφοδοτούν απευθείας τη βαθμολογία του πυρήνα, οπότε οι κορυφαίες καταχωρήσεις είναι οι πιο πιθανές στόχοι OOM.
Στους πυρήνες 4.20 και νεότερους, οι πληροφορίες Pressure Stall είναι το σύστημα έγκαιρης προειδοποίησης που αξίζει να ενσωματωθεί στην παρακολούθηση:
cat /proc/pressure/memoryΟ some avg10 εικόνα δείχνει το ποσοστό του χρόνου που τουλάχιστον μία εργασία παρέμεινε σε αναμονή για μνήμη κατά τη διάρκεια των τελευταίων δέκα δευτερολέπτων. Κάτω από 5 τοις εκατό είναι εντάξει. Συνεχείς τιμές πάνω από 10 τοις εκατό σημαίνουν ότι το σύστημα ξοδεύει πραγματικό χρόνο μπλοκαρισμένο στην ανάκτηση μνήμης, και είναι πιθανό να συμβεί τερματισμός λόγω OOM.
Το swap thrashing εμφανίζεται στο vmstat 1 ως μη μηδενική si και so στήλες που διατηρούνται με την πάροδο του χρόνου. Μια μικρή ποσότητα μόνιμης ανταλλαγής είναι ακίνδυνη. Η συνεχής εισαγωγή και εξαγωγή δεν είναι.
Προστασία κρίσιμων διαδικασιών με το oom_score_adj
Η βαθμολογία που υπολογίζει ο πυρήνας μπορεί να προσαρμοστεί ανά διαδικασία μέσω oom_score_adj, σε μια κλίμακα από -1000 (απρόσβλητος) έως +1000 (σκότωσέ με πρώτα). Η προσαρμογή προστίθεται απευθείας στην τελική βαθμολογία.
Για μια εφάπαξ αλλαγή σε μια διαδικασία που εκτελείται:
echo -500 | sudo tee /proc/$(pidof sshd)/oom_score_adjΓια οτιδήποτε θέλετε να διατηρηθεί μετά από επανεκκινήσεις, ρυθμίστε το στη μονάδα systemd. Αυτή είναι η σωστή θέση για το sshd, τη βάση δεδομένων σας και οτιδήποτε άλλο δεν μπορείτε να χάσετε:
[Service]
OOMScoreAdjust=-900Λογικές προεπιλογές για να ξεκινήσετε:
- sshd: -1000. Εάν χάσετε την απομακρυσμένη πρόσβαση κατά τη διάρκεια μιας κρίσης μνήμης, η ανάκτηση γίνεται πολύ πιο δύσκολη.
- MySQL, PostgreSQL, Redis: -800 έως -900. Ισχυρή προστασία χωρίς να τα καθιστάτε εντελώς άθικτα σε μια πραγματικά καταστροφική κατάσταση.
- Εργαζόμενοι εφαρμογών, εργασίες παρτίδας, εργασίες cron: +100 έως +500. Αυτές είναι οι διεργασίες που προτιμάτε να τερματιστούν παρά η βάση δεδομένων σας.
Μην ορίσετε τα πάντα στο -1000. Αν τίποτα δεν μπορεί να τερματιστεί, ο πυρήνας τελικά θα πανικοβληθεί ή θα παγώσει, κάτι που είναι χειρότερο.
Περιορισμός μνήμης με cgroups και systemd
Η προσαρμογή των βαθμολογιών επηρεάζει το ποιος θα τερματιστεί. Τα cgroups επηρεάζουν το αν θα πραγματοποιηθεί ποτέ ο παγκόσμιος τερματισμός. Δίνοντας σε κάθε υπηρεσία ένα αυστηρό ανώτατο όριο, μεταφέρετε τις αστοχίες μνήμης σε ένα μόνο cgroup αντί να αφήσετε μια διαδικασία να εξαντλήσει ολόκληρο το VPS.
Σε ένα αρχείο μονάδας systemd:
[Service]
MemoryHigh=400M
MemoryMax=512M
OOMPolicy=stop
Restart=on-failure
RestartSec=5sMemoryHigh είναι ένας μαλακός περιορισμός: ο πυρήνας ανακτά επιθετικά σελίδες από το cgroup πάνω από αυτό το σημείο, αλλά δεν τερματίζει τίποτα. MemoryMax είναι το αυστηρό ανώτατο όριο. Εάν το cgroup προσπαθήσει να εκχωρήσει πέρα από αυτό, ο πυρήνας τερματίζει μια διεργασία μέσα στο cgroup. Με Restart=on-failure η υπηρεσία επανέρχεται αμέσως.
Στο cgroup v2 (Ubuntu 22.04 και νεότερες εκδόσεις, πρόσφατο Debian, RHEL 9), memory.oom.group τερματίζει όλες τις διεργασίες στο cgroup μαζί αντί να αφήνει ορφανές διεργασίες. Χρήσιμο για υπηρεσίες πολλαπλών διεργασιών όπως τα pools PHP-FPM όπου μια ομάδα που έχει τερματιστεί κατά το ήμισυ θα λειτουργεί εσφαλμένα.
Μερικές σημειώσεις για συγκεκριμένες εφαρμογές που αξίζει να εφαρμόσετε:
- PHP-FPM: ρυθμίστε
pm = ondemandσε μικρές παρουσίες VPS και ρυθμίστε το μέγεθοςpm.max_childrenανάλογα με το μέσο RSS ανά εργαζόμενο, όχι με την προεπιλογή. Μια ομάδα με μέγεθος 4 GB περιθωρίου σε ένα VPS 2 GB θα παρουσιάσει OOM την πρώτη φορά που θα γεμίσει. - Node.js: περιορίστε το V8 heap με
--max-old-space-size=512(σε MB). Χωρίς αυτό, το Node θα συνεχίσει να μεγαλώνει μέχρι να παρέμβει ο πυρήνας. - MySQL και PostgreSQL:
innodb_buffer_pool_sizeκαιshared_buffersθα πρέπει να αφήνουν ελεύθερο χώρο για την προσωρινή μνήμη σελίδων του λειτουργικού συστήματος, τη μνήμη σύνδεσης και οποιουσδήποτε άλλους χρήστες στο σύστημα. Οι προεπιλογές υποθέτουν έναν αποκλειστικό διακομιστή.
Ανάγνωση των αρχείων καταγραφής μετά από ένα συμβάν OOM
Όταν ενεργοποιείται το OOM killer, ο πυρήνας αποθηκεύει μια λεπτομερή αναφορά στο ring buffer. Ανακτήστε την με:
dmesg -T | grep -iE 'killed process|out of memory'
journalctl -k --grep='Out of memory'Το τμήμα που πρέπει να διαβάσετε προσεκτικά ξεκινά με τον καλούντα και τελειώνει με το θύμα. Ο πυρήνας εκτυπώνει μια πλήρη λίστα εργασιών με το RSS κάθε διεργασίας, τη χρήση swap και το τελικό oom_score_adj. Τρία πράγματα αξίζει να ελέγξετε:
- Ο περιορισμός.
CONSTRAINT_NONEσημαίνει ένα παγκόσμιο OOM,CONSTRAINT_MEMCGσημαίνει ότι ένα cgroup έφτασε στο όριό του. Η λύση διαφέρει σε κάθε περίπτωση. Free swap. Αν αυτό0kB, εξαντλήθηκαν τόσο η μνήμη RAM όσο και ο χώρος swap. Είτε προσθέστε χώρο swap, αυξήστεMemoryMaxστον παραβάτη, ή μειώστε τον αριθμό των ταυτόχρονων διεργασιών.- Η βαθμολογία του θύματος σε σύγκριση με όλα τα άλλα. Εάν η βαθμολογία του θύματος δεν είναι πολύ υψηλότερη από τις επόμενες διαδικασίες, οι
oom_score_adjτιμές δεν κάνουν αρκετή δουλειά. Διευρύνετε το χάσμα.
Ειδικά για τα OOM του cgroup, ο μετρητής kill βρίσκεται memory.events μέσα στο cgroup:
cat /sys/fs/cgroup/system.slice/mysql.service/memory.eventsΈνας αυξανόμενος oom_kill μετρητή σημαίνει ότι η υπηρεσία φτάνει επανειλημμένα στο όριό της. Αυτό είναι ένα σήμα για να αυξήσετε MemoryMax, να αναλύσετε το φόρτο εργασίας ή να μεταφέρετε την υπηρεσία σε ένα μεγαλύτερο πακέτο, και όχι να συνεχίζετε να την επανεκκινείτε συνεχώς.
Συνοψίζοντας
Η ρύθμιση του OOM killer δεν έχει ως στόχο να το εξαφανίσει. Έχει ως στόχο να ελέγχει ποια διαδικασία θα πληρώσει το τίμημα όταν εξαντληθεί η μνήμη και να περιορίσει την έκταση των επιπτώσεων όταν αυτό συμβεί. Το μοτίβο που ισχύει στην παραγωγή:
- Προστατέψτε τις υπηρεσίες που δεν μπορείτε να χάσετε, ειδικά το sshd και τις βάσεις δεδομένων σας.
- Περιορίστε όλα τα υπόλοιπα
MemoryMaxσε μια μονάδα systemd, ώστε μια μεμονωμένη διαφυγή να συνεπάγεται μόνο μια επανεκκίνηση και όχι διακοπή λειτουργίας. - Παρακολουθήστε το PSI και
MemAvailableαντί να περιμένετεdmesgνα σας ενημερώσει εκ των υστέρων. - Αφήστε 15 έως 20 τοις εκατό της μνήμης RAM ως περιθώριο. Η ρύθμιση δεν μπορεί να αντισταθμίσει ένα VPS που είναι απλά πολύ μικρό για το φόρτο εργασίας.
Εάν η πίεση στη μνήμη σας είναι δομική και όχι ρυθμιζόμενη, χρειάζεστε περισσότερη μνήμη RAM ή ταχύτερο χώρο αποθήκευσης με υποστήριξη swap. Τα πακέτα VPS της FDC Servers λειτουργούν σε AMD EPYC με αποθήκευση NVMe, η οποία διατηρεί τις αναγνώσεις με υποστήριξη swap αρκετά γρήγορες ώστε οι σύντομες υπερφορτώσεις μνήμης να μην εξελίσσονται σε διακοπές λειτουργίας.

Ρύθμιση του Linux OOM Killer για VPS: Ένας πρακτικός οδηγός
Ρυθμίστε το Linux OOM killer στο VPS σας για να προστατεύσετε τις βάσεις δεδομένων και το SSH, να περιορίσετε τις ανεξέλεγκτες διεργασίες με cgroups και να σταματήσετε να σκοτώνεται η λάθος υπηρεσία.
12 λεπτά ανάγνωσης - 8 Ιουνίου 2026
Έλεγχος κυκλοφορίας Linux (tc): πρακτικός οδηγός
12 λεπτά ανάγνωσης - 5 Ιουνίου 2026

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη