[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Disabilitare tutti i filesystem in ram



On 28/12/2016 20:12, Nicola Manca wrote:
On 28/12/16 18:40, Davide Prina wrote:
On 28/12/2016 12:03, Nicola Manca wrote:

riesco in nessun modo ad azzerare la voce buff/cache che ha sempre
600/900MB occupati.

non ho capito!
Ma se disabiliti la buff/cache avrai prestazioni pessime del tuo
sistema. O forse non ho capito io cosa intendi?

Da quanto ho letto buff/cache dovrebbe essere occupato in modo
flessibile, rimpicciolendosi se un programma richiede memoria.

la cache e i buffer allocati e non usati attivamente vengono sostituiti da altri dati/istruzioni che hanno bisogno di essere usati/eseguite.

Questo
non avviene e se lancio programmi un po' esosi (tipo analisi dati in
python) non posso allocare in totale più di 2.8 GB su 4 GB di RAM perchè
buff/cache non si svuota.

prima di tutto è normale che non si svuotino, perché più che svuotamento di solito è seguita la logica della sostituzione.

Poi tu dici che devi caricare 2,8GB di dati, ma da dove ricavi che sono 2,8GB?
Probabilmente vedi lo spazio occupato su disco?
Ma all'interno del programma come vengono gestiti? O meglio sono caricati in un buffer di 2,8GB o sono inseriti dentro una struttura? Nel primo caso l'occupazione reale è di poco superiore ai 2,8GB, mentre nel secondo caso potrebbe essere anche notevolmente superiore... dipende dal tipo di struttura.

Inoltre non tieni conto di:
* quanta memoria ha bisogno il tuo programma
* quanta memoria ha bisogno il tuo programma per elaborare dei dati caricati in RAM
* quanta memoria è usata da altri programmi/servizi/... in esecuzione
* quanta memoria è usata dal sistema operativo
* sono in esecuzione altri servizi che possono far uso di molta RAM?

Se hai 4GB di RAM è possibile che una fetta consistente sia già occupata prima che tu esegua il tuo programma.

Fai così:

1) avvii il PC e ti prepari per eseguire il programma, cioè fai tutti gli step necessari prima di eseguirlo (es: login, apertura di una shell, ...)

2) controlli quanta memoria hai a disposizione:
$ free -h

NOTA: guarda $ man free

Segnati:
Mem Total:
Mem Available:
Swap Total:
Swap Used:


Di questi valori il più importante per te è "Mem Available", perché con questo sai quanta RAM può occupare un programma che esegui senza che venga utilizzato lo swap.

Se hai Linux >= 3.14, allora hai un calcolo abbastanza preciso, perché tiene in conto i cache/buffer che non sono attualmente in uso.

3) esegui il tuo programma

4) riesegui il comando "$ free -h"... però io non so come funziona e quindi non so dirti bene quando eseguirlo, se eseguirlo più volte, ... in modo da capire quanta memoria necessita. Per esempio se prima si carica un'interfaccia e da questa puoi eseguire più azioni (es: caricamento dati, esecuzione elaborazione, ...), allora puoi eseguirlo prima di ogni azione

da quest'ultimo punto puoi avere più rilevazioni, segnale tutte con i dati indicati sopra.

Per ogni rilevazione puoi determinare quanta RAM necessita facendo una semplice operazione
Memoria necessaria = "Mem Available[2]"
                   + "Swap Used[4]"
                   - "Mem Available[4]"
                   - "Swap Used[2]"

dove [2] e [4] indicano i punti di rilevazione

Nota1: non devi eseguire null'altro durante questo test, altrimenti i valori potrebbero essere falsati

Nota2: se vuoi avere un valore più accurato, allora esegue questi punti:
A) avvi il PC come indicato e aspetti 15-30 minuti prima da fare qualcosa, in modo che tutti i processi all'avvio siano terminati B) termina eventuali servizi che possono eseguire qualcosa ogni tot (es: database, operazioni in cron, ...) C) esegui quanto riportato sopra per 4-10 volte (ogni volta applicando anche i passi A e B qui indicati) e poi fai una media dei valori ottenuti. Ogni volta esegui il tuo programma con gli stessi dati e facendogli fare le stesse operazioni

Infine indicaci i valori trovati

Ho provato con "echo 3 > /proc/sys/vm/drop_caches"
ma nulla

ma sai a cosa serve quel comando?

"Use of this file can cause performance problems. Since it discards
cached objects, it may cost a significant amount of I/O and CPU to
recreate the dropped objects, especially if they were under heavy use.
Because of this, use outside of a testing or debugging environment is
not recommended."

leggi qui:
https://www.kernel.org/doc/Documentation/sysctl/vm.txt

"testing" era esattamente la mia intenzione,

ma io penso che quel "testing or debugging environment" è per testare il funzionamento di quella parte di Linux... comunque

quel comando dovrebbe azzerare buff/cache ma non lo fa

ma quel comando può farlo solo per quella parte di buff/cache che è allocata, ma non attualmente usata

credo che il motivo sia lo stesso che
non permette al SO di liberarla in caso di picchi di richiesta di RAM e
che fa swappare.

No, se si comporta così è perché non ha abbastanza RAM, cioè il tuo programma richiede più RAM di quella disponibile quando lo esegui.

durante il normale utilizzo piuttosto mi si riempie la swap,

se non vuoi che venga usato lo swap puoi:
1) disabilitarlo
2) usare swappiness per regolarne l'uso

Io vorrei che prima di usare la swap si svuotasse buff/cache, cosa che
dovrebbe accadere a quanto ho letto in rete (ad sempio come mostrato da
http://www.linuxatemyram.com/play.html)

non ho letto tutto in dettaglio, ma in questo link dice il contrario di quello che sostieni tu. È anche sufficiente leggere le conclusioni "The Linux disk cache is very unobtrusive. It uses spare memory to greatly increase disk access speeds, and without taking any memory away from applications. A fully used store of ram on Linux is efficient hardware use, not a warning sign."

Ciao
Davide

--
Dizionari: http://linguistico.sourceforge.net/wiki
Fate una prova di guida ... e tenetevi la macchina!:
http://linguistico.sf.net/wiki/doku.php?id=usaooo2
Non autorizzo la memorizzazione del mio indirizzo su outlook


Reply to: