Μετάβαση στο περιεχόμενο
EuroVPSEuroVPS
Περιοχή πελατών

Πώς να αντιμετωπίσετε υψηλή χρήση μνήμης σε Linux

Συχνές ερωτήσεις EuroVPS

Ενημερώθηκε 6 λεπτά ανάγνωσης

Πώς βρίσκετε τι καταναλώνει τη μνήμη σε έναν 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:

  1. Μεγάλος αριθμός προσβάσεων από συγκεκριμένες διευθύνσεις IP.
  2. Μεγάλος αριθμός προσβάσεων σε ανύπαρκτους πόρους ή αρχεία κ.λπ.
  3. Μεγάλος αριθμός αιτημάτων HTTP POST.
  4. Μεγάλος αριθμός αποτυχημένων προσπαθειών πρόσβασης, όπως 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
Μηχανικός της EuroVPS μεταφέρει έναν κόμβο server στον χώρο του datacenter
Μια συζήτηση με τους ανθρώπους που θα φροντίζουν την υποδομή σας.

Ας ξεκινήσουμε από την υποδομή σας.

Λίγο πλαίσιο μάς βοηθά να ξεκινήσουμε τη σωστή συζήτηση.

Θα χρησιμοποιήσουμε τα στοιχεία σας για να απαντήσουμε στο αίτημά σας. Πολιτική απορρήτου