OVH VPS 2016: risoluzione problemi occupazione RAM

Nelle ultime settimane ho iniziato ad avere parecchi problemi con i VPS 2016 di OVH.

Improvvisamente dopo alcuni mesi di lavoro, senza riscontrare problematiche particolari, alcuni server hanno iniziato a collassare ed arrancare.

Dopo un po’ di debug ho capito che il problema era la RAM, di fatto alcuni processi sotto certi carichi di lavoro non avevano risorse libere.

La questione strana era che i VPS dalla macchina Linux, tramite il comando top, mi segnava occupati 300MB di ram (su 2GB), dal pannello di controllo di OVH invece, mi indicava che la ram utilizzata era di 1,7GB, quindi i conti non tornavano.

Tramite il comando free -m ho scoperto l’arcano di questa discrepanza, una parte della ram è occupata dalla cache (che è corretto, di fatto linux tende ad occupare tutta la ram che ha disponibile, per ridurre gli accessi al disco), nel mio caso quindi avevo

RAM Totale = 2000 MB
RAM utilizzata = 300 MB
Cache = 1400 MB
RAM libera = 300 MB

Come vediamo in questo caso la ram effettivamente libera è di SOLO 300 MB, capite bene anche voi che vedendo il problema da questo lato, se le chiamate che vengono fatte non trovano i dati in cache, devono andare ad usare i 300 MB liberi che ci restano.

La domanda che vi pongo a questo punto è: cosa succede se inizio ad avere più 300MB di dati da allocare quando sono sotto alti carichi di lavoro?

Molto semplicemente la macchina finisce la RAM (chiaramente inzierà ad ottimizzare la memoria, scaricando la cache, se possibile, ma se i dati sono in cache probabilmente sono dati acceduti di frequente e quindi non verranno scaricati) e di conseguenza inizierà l’attività di SWAP.

E qui che arriva il nostro problema: di default i VPS 2016 di OVH non sono dotati di partizione di swap, a causa di questo le mie macchine iniziavano a rispondere male e per non collassare definitivamente, Linux inizia a killare i processi (il famoso oom-killer), uccidendo di fatto processi di apache e di mysql…

Soluzione

Ed eccoci alla soluzione, che almeno fino ad ora, mi ha arginato il problema.

Non possiamo creare delle partizioni di swap, di fatto il tipo di sistema non ce lo permette, ma possiamo creare lo swap in un file, un po’ come fa Windows per intenderci.

Con il comando seguente creiamo un file vuoto da 1 GB

dd if=/dev/zero of=/swapfile1 bs=2048 count=524288

procediamo poi con

chown root:root /swapfile1
chmod 0600 /swapfile1

formattiamo ed attiviamo lo swap

mkswap /swapfile1
swapon /swapfile1

ed infine editiamo il file /etc/fstab

nano /etc/fstab

ed aggiungiamo

/swapfile1 none swap sw 0 0

A questo punto con il comando free -m di cui sopra, vederemo anche lo swap.

Con questa tecnica estendiamo ulteriormente una parte di memoria che permetterà alle nostre macchine di sopportare di più i carichi di lavoro.

Questa guida può essere usata su quelunque sistema, tra l’altro lo swap su file funzionerà molto bene se avete dischi SSD.

Author: Matteo Temporini

Nato nel 1979 a Udine (Italia), ho conseguito il diploma di scuola superiore come Programmatore. Ho proseguito gli studi ottenendo nel 2006 la Laurea in Informatica, presso l'università degli studi di Udine. Da sempre appassionato al mondo del Web, ho maturato un esperienza decennale come sistemista Linux e Windows presso varie aziende. Quello che state leggendo su questo sito è frutto della mia esperienza diretta, che continua a crescere grazie ad amici e colleghi.

Share This Post On

1 Comment

  1. Ciao Matteo, non mi sembra del tutto giusto quello che dici su come linux gestisce la ram (se hai 300m occupati e 1400m di cache con 2000m di ram e vengono richiesti es. 800m, allora il sistema risulterà con 1100m occupati, ~900m di cache e ~0m “liberi”, perché anche i file nella cache sono tutti con un accesso recente non hanno cmq precedenza sull’uso della ram). Comunque, il discorso in generale lo condivido: un po’ di swap può essere utile in ogni caso.

    Detto questo, volevo dare il mio piccolo contributo alla discussione con due miglioramenti pensati per i dischi SSD. Il primo è quello di cancellare e ricreare il file di swap ad ogni avvio così che i blocchi relativi si liberino (in modo che i blocchi utilizzati dallo swap non siano sempre gli stessi, favorendo la longevità dei dischi SSD). Il secondo è, per velocizzare l’avvio (nell’ipotesi del punto appena descritto) ma anche per evitare una scrittura inutile, quello di utilizzare fallocate al posto di dd. fallocate alloca lo spazio senza inizializzarlo. Quindi non serve aspettare il tempo di “azzeramento”, tanto i blocchi poi verranno cmq sovrascritti qualsiasi sia il suo contenuto.

    Alla fine, ho messo uno script che ad ogni avvio esegue:

    swapoff /$NAME
    rm -f /$NAME
    fallocate -l $(($SIZE*1024*1024*1024)) /$NAME
    chmod 600 /$NAME
    mkswap /$NAME
    swapon /$NAME

    dove, ovviamente, $NAME è il nome del file e $SIZE è la dimensione in giga da allocare (n.b. non c’è il chown perché lo script viene eseguito da root).

    Spero sia utile!
    Ciao,
    CDF

    p.s. ti segnalo che ho avuto problemi con il CAPTCHA sotto CHROME, sono dovuto passare a FIREFOX per poter postare …

Submit a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Per postare il commento, risolvi il quesito sottostante * Time limit is exhausted. Please reload CAPTCHA.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

All original content on these pages is fingerprinted and certified by Digiprove