Πώς να αντιμετωπίσετε υψηλή χρήση μνήμης σε Linux
Πώς βρίσκετε τι καταναλώνει τη μνήμη σε έναν Linux server, και ποιες ρυθμίσεις overcommit του kernel το ελέγχουν.
Εντοπισμός της κατάστασης «Out of Memory».
Η πίεση μπορεί να έχει περάσει μέχρι να κοιτάξετε, γι' αυτό ελέγξτε πρώτα το kernel log για OOM kills: ο kernel του Linux διαχειρίζεται τη μνήμη του server τερματίζοντας διεργασίες με βάση ορισμένα κριτήρια και απελευθερώνοντας τη μνήμη που καταλάμβανε η διεργασία που τερματίστηκε.
Για κάθε διεργασία που τερματίζει ο kernel δημιουργείται μια εγγραφή στο log. Τα logs βρίσκονται συνήθως στη θέση /var/log/.
Με την παρακάτω εντολή grep αναζητάτε σφάλμα out of memory σε όλα τα αρχεία log του /var/log/.
grep -i -r 'out of memory' /var/log/
Mar 1 01:24:05 srv kernel: [3966348.114233] Out of memory: Kill process 48305 (php-cgi) score 21 or sacrifice child
Mar 1 01:24:08 srv kernel: [3966350.061954] Out of memory: Kill process 48318 (php-cgi) score 21 or sacrifice child
Τρέχουσα χρήση:
root@srv:~# free -m
total used free shared buff/cache available
Mem: 1981 720 319 138 940 916
Swap: 524 84 440
Το ιστορικό της χρήσης μνήμης για την ημέρα το βρίσκετε με την εντολή «sar».
root@server [~]# sar -r
Linux (server.example.com) 03/05/2019 _x86_64_ (2 CPU)
12:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
12:10:01 AM 1672764 1407160 45.69 100356 749140 1618364 44.90
12:20:01 AM 1289208 1790716 58.14 106580 1130096 1599588 44.38
12:30:01 AM 1248100 1831824 59.48 109184 1144680 1621332 44.98
12:40:01 AM 1267972 1811952 58.83 111460 1155828 1604104 44.51
12:50:01 AM 1254556 1825368 59.27 113888 1159632 1599480 44.38
01:00:01 AM 1092296 1987628 64.53 116020 1164540 1802228 50.00
01:10:01 AM 1212168 1867756 60.64 118204 1169516 1633940 45.33
...
Average: kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
Average: 1465222 1614702 52.43 179213 834889 1655342 45.93
Αναβάθμιση RAM είναι απαραίτητη αν ο server δείχνει σταθερά υψηλή χρήση μνήμης ή αν ο μέσος όρος της ημέρας ξεπερνά το 90%, γιατί τόσο υψηλή χρήση μπορεί κατά διαστήματα να εξαντλεί την ελεύθερη μνήμη σε έναν φορτωμένο server. Σε εικονική μηχανή, η παρατεταμένη πίεση μνήμης λύνεται με περισσότερη RAM ή με διόρθωση της εφαρμογής, ποτέ με swap.
Ένα ακόμη χρήσιμο εργαλείο για τον εντοπισμό των διεργασιών που καταναλώνουν μνήμη είναι η εντολή «top», που σας δίνει τη δυνατότητα να ταξινομήσετε τις διεργασίες με βάση τη χρήση πόρων.
root@server [~]# top -c
top - 18:41:45 up 109 days, 18:03, 5 users, load average: 1.30, 1.24, 1.24
Tasks: 544 total, 2 running, 541 sleeping, 0 stopped, 1 zombie
Cpu(s): 8.3%us, 1.4%sy, 0.2%ni, 89.8%id, 0.3%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 12296096k total, 11531800k used, 764296k free, 586732k buffers
Swap: 16777212k total, 209160k used, 16568052k free, 2471072k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2376001 root 20 0 230m 101m 4588 R 31.4 0.8 1:22.06 spamd child
2448741 root 30 10 19472 1056 792 S 2.6 0.0 0:00.08 /usr/sbin/lveps -c 1 -p -d -n -o id:10,ep:10,pno:10,pid:15,tno:5,tid:15,cpu:7,mem:15,com:256
953572 mysql 20 0 17.5g 5.3g 5336 S 1.7 44.9 102:38.10 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=server
844549 root 30 10 424m 59m 4532 S 1.3 0.5 52:13.20 /opt/alt/python27/bin/python2.7 /usr/share/lve-stats/lvestats-server.py start --pidfile /var/run/lvestats.pid
1351883 root 20 0 1127m 638m 1768 S 1.3 5.3 37:37.24 /usr/local/cpanel/3rdparty/bin/clamd
844526 root 30 10 462m 35m 1204 S 1.0 0.3 30:54.20 /opt/alt/python27/bin/python2.7 /usr/share/lve-stats/lvestats-server.py start --pidfile /var/run/lvestats.pid
3109 nscd 20 0 2725m 3956 2260 S 0.7 0.0 188:08.43 /usr/sbin/nscd
2243573 nobody 20 0 189m 78m 1140 S 0.7 0.7 4:22.20 litespeed (lshttpd - #01)
2448384 mailnull 20 0 78756 7736 3348 S 0.7 0.1 0:00.06 /usr/sbin/exim -bd -q1h -oP /var/spool/exim/exim-daemon.pid
Με την παρακάτω ακολουθία πλήκτρων ταξινομείτε τις διεργασίες με βάση τη χρήση μνήμης.
Δώστε την εντολή top. Πατήστε SHIFT+o για τις επιλογές της top. Πατήστε N και Enter.
Εντοπισμός διαρροών μνήμης
Μπορείτε να βρείτε την ώρα του server κατά την οποία αναφέρθηκε το «out of memory», εδώ είναι “Mar 1 01:24:05”. Με την grep αναζητήστε αυτή τη χρονική σήμανση στα αρχεία log των application servers σας, όπως ο Apache, η MySQL κ.λπ.
Σε έναν cPanel server, με την grep μπορείτε να ψάξετε τα access logs των websites για ύποπτη ή καταχρηστική πρόσβαση που προκάλεσε την εξάντληση πόρων.
grep -ir “01/Mar/2019:01:2” /usr/local/apache/domlogs/
Μερικές ύποπτες δραστηριότητες που αναγνωρίζονται από τα access logs:
- Μεγάλος αριθμός προσβάσεων από συγκεκριμένες διευθύνσεις IP.
- Μεγάλος αριθμός προσβάσεων σε ανύπαρκτους πόρους ή αρχεία κ.λπ.
- Μεγάλος αριθμός αιτημάτων HTTP POST.
- Μεγάλος αριθμός αποτυχημένων προσπαθειών πρόσβασης, όπως login.
Με την εντολή mysqladmin proc stat εντοπίζετε ερωτήματα MySQL που μένουν σε εκκρεμότητα για πολλή ώρα και προκαλούν υψηλή χρήση μνήμης.
root@server [~]# mysqladmin proc stat
+--------+------+-----------+----+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+--------+------+-----------+----+---------+------+-------+------------------+----------+
| 137324 | root | localhost | | Query | 0 | init | show processlist | 0.000 |
+--------+------+-----------+----+---------+------+-------+------------------+----------+
Uptime: 370827 Threads: 1 Questions: 20484133 Slow queries: 0 Opens: 1456 Flush tables: 1 Open tables: 747 Queries per second avg: 55.239
Ελέγξτε τις στήλες Time, db και State, βρείτε τα ερωτήματα με υψηλή τιμή «Time» και εξετάστε τα με τον developer του website σας.
Ενεργοποιήστε το «Slow Query Logging» στη MySQL και διορθώστε τα αργά ερωτήματα με τον developer του website σας.
Memory overcommit
Συνήθως ο Linux server επιτρέπει να δεσμευτεί για μια διεργασία περισσότερη μνήμη από όση πραγματικά χρειάζεται, με την παραδοχή ότι καμία διεργασία δεν θα χρησιμοποιήσει όλη τη μνήμη που της επιτρέπεται, ώστε αυτή να μπορεί να χρησιμοποιηθεί από άλλες διεργασίες. Μπορείτε να ρυθμίσετε πώς χειρίζεται το σύστημα το memory overcommit, και η ρύθμιση εφαρμόζεται με το εργαλείο sysctl.
Όλες οι παράμετροι του sysctl εμφανίζονται με την εντολή sysctl -a. Η παράμετρος που μας ενδιαφέρει είναι η vm.overcommit_memory.
[root@srv ~]# sysctl -a | grep vm.overcommit_memory
vm.overcommit_memory = 0
Η vm.overcommit_memory παίρνει 3 τιμές: 0, 1 και 2.
- 0 Επιτρέπει overcommit με βάση την εκτίμηση «αν έχουμε αρκετή RAM»
- 1 Επιτρέπει πάντα overcommit
- 2 Απορρίπτει overcommit αν το σύστημα δεν έχει τη μνήμη.
Μια ακόμη παράμετρος sysctl που πρέπει να λάβετε υπόψη είναι η overcommit_ratio, που ορίζει ποιο ποσοστό της φυσικής μνήμης, επιπλέον του χώρου swap, μπορεί να ληφθεί υπόψη όταν επιτρέπεται στις διεργασίες να κάνουν overcommit.
Αν θέσουμε την vm.overcommit_memory σε 2, ο kernel δεν θα επιτρέψει overcommit πέρα από τον χώρο swap συν το vm.overcommit_ratio της συνολικής RAM: vm.overcommit_memory=2 vm.overcommit_ratio=50% RAM=8GB SWAP=4GB
Με την παραπάνω ρύθμιση, το overcommit είναι δυνατό για 4GB SWAP + 50% των 8GB RAM.
sysctl -w vm.overcommit_memory=2
sysctl -w vm.overcommit_ratio=100
Το sysctl -w δεν επιβιώνει σε επανεκκίνηση. Βάλτε τις ίδιες δύο γραμμές στο /etc/sysctl.conf.
Από τις συχνές ερωτήσεις της EuroVPS.
Περισσότερα στην κατηγορία «Οδηγοί»Ο επόμενος συνεργάτης σας στην υποδομή
Έχετε ακόμη
μια ερώτηση;
Πείτε μας τι προσπαθείτε να κάνετε. Ένας μηχανικός θα το διαβάσει και θα απαντήσει.
+357 222 32280
Ας ξεκινήσουμε από την υποδομή σας.
Λίγο πλαίσιο μάς βοηθά να ξεκινήσουμε τη σωστή συζήτηση.
