Giuseppe Parrello

 

Come azzerare la cache del disco su un Router


Introduzione

La prima cosa che si nota quando si acquista un router è il drastico calo di memoria RAM disponibile appena si usa un drive USB esterno. Sui forum di discussione di Internet è stato spesso discusso questo problema, soprattutto su quei router che hanno almeno 512 MB di RAM. Questo problema viene visto come un difetto del router, in realtà, come vedremo in seguito, è una caratteristica peculiare di tutti i router che possiedono un sistema operativo basato su Linux.


Gestione della memoria in Linux

Molti utenti sono abituati alla gestione della memoria in Microsoft Windows. Microsoft Windows riserva una parte minimale della memoria disponibile per la cache delle unità disco, tale quantità purtroppo non aumenta con l'aumentare delle operazioni di Input/Output sul disco, pertanto quegli utenti che hanno ad esempio 32 GB di RAM, si vedono tantissima memoria RAM disponibile non utilizzata. Linux non presenta questa anomalia, Linux infatti utilizza tutta la RAM disponibile come memoria cache del disco al fine di aumentare le prestazioni di Input/Output sul disco. La RAM utilizzata dal router come memoria cache del disco viene in seguito resa disponibile per le applicazioni e per i servizi quando questi ultimi la richiedono. Questa gestione dinamica della RAM rende tantissimi router molto veloci, poiché una parte dei dati viene conservata nella memoria RAM durante le operazioni di Input/Output.
Così come non esiste un modo per aumentare la quantità di RAM utilizzata come memoria cache del disco in Microsoft Windows, nella stessa maniera in Linux è impossibile ridurre la quantità di RAM utilizzata come memoria cache del disco. E' invece possibile in Linux liberare la memoria cache del disco con un comando apposito, che vedremo in seguito. Questa operazione è decisamente sconsigliata, poiché è un'operazione semplicemente temporanea, nulla toglie a Linux la possibilità di occupare nuovamente la memoria disponibile per usarla come memoria cache del disco per le operazioni di Input/Output. La soluzione definitiva sarebbe quella di rimuovere il disco USB esterno, in questa maniera Linux non avrebbe più bisogno di riservare buona parte della memoria disponibile per usarla come memoria cache del disco per le operazioni di Input/Output, mancando l'unità disco. Questo ovviamente impedisce all'utente di usare uno storage esterno, l'unica possibilità disponibile in un router - un router non possiede uno storage interno.


Liberare la memoria cache riservata

Per liberare la memoria cache del disco riservata alle operazioni di Input/Output, si usa il comando Linux "sync; echo 3 > /proc/sys/vm/drop_caches", questo comando è formato da due diverse istruzioni. La prima istruzione permette di sincronizzare i dati presenti ancora nei buffer del disco e di svuotare il contenuto della memoria cache del disco. La seconda istruzione permette di liberare tutti i buffer occupati e quindi di liberare la memoria cache del disco occupata. Questo permette di recuperare tutta la memoria RAM precedentemente occupata dalla memoria cache del disco.
Come detto prima è sconsigliato eseguire frequentemente queste operazioni, ma ancora di più è sconsigliato eseguirle durante le operazioni di Input/Output, soprattutto se effettuate dai servizi/daemon di Linux - una soluzione sarebbe quella di fermare i servizi di Linux avviati dall'utente, eseguire le suddette operazioni e solo dopo riavviare i servizi precedentemente fermati. L'esecuzione del suddetto comando Linux durante le operazioni di Input/Output potrebbe causare il danneggiamento dei dati, un malfunzionamento del router o peggio il riavvio del router stesso.
Per avere un'idea della memoria cache liberata, si usa il comando Linux "free", prima e dopo l'esecuzione del suddetto comando Linux per liberare la memoria cache. Un esempio del comando "free" eseguito prima e dopo è il seguente - da notare le colonne "used", "free" e "cached":

             total       used       free     shared    buffers     cached
Mem:        440420     411960      28460        828       6584     213140
-/+ buffers/cache:     192236     248184
Swap:       524284      46080     478204

             total       used       free     shared    buffers     cached
Mem:        440420     194904     245516        828        136      10892
-/+ buffers/cache:     183876     256544
Swap:       524284      46080     478204

Script per liberare la memoria cache del disco

Per liberare la memoria cache del disco, è possibile usare uno script Bash appositamente progettato per scrivere su un file .LOG all'interno del router in modo tale che l'utente possa sapere quando è stata effettuata l'operazione di svuotamento della memoria cache e quanta RAM è stata liberata - questo script può essere usato tramite uno schedule effettuato con il "crontab" di Linux. Esempio di script Bash potrebbe essere:

#!/bin/sh

CURRENTDATE="$(date +%Y%m%d_%H%M%S)"
NEWLOGFILE="/opt/var/log/drop_caches.log"

echo $CURRENTDATE
echo $NEWLOGFILE

echo "-----------------------------------------" >> $NEWLOGFILE
echo $CURRENTDATE >> $NEWLOGFILE
echo "   " >> $NEWLOGFILE
free >> $NEWLOGFILE
echo "   " >> $NEWLOGFILE
sync
sync
echo 3 > /proc/sys/vm/drop_caches
sync
free >> $NEWLOGFILE
echo "-----------------------------------------" >> $NEWLOGFILE