On 29/12/16 12:04, Davide Prina wrote:
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.
A me va bene che non si svuoti, ma mi chiedo come mai ne serva così
tanta. esiste un modo per capire come mai? la mia domanda iniziale era
dovuta al fatto che pensavo fossero dei filesystem in ram che
potessero essere spostati su disco senza troppi problemi. Magari ci
sono altre cause di questo utilizzo ma non so come capirlo.
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.
Non sono 2.8BG di dati, semplicemente quando faccio girare software
che alloca memoria vedo dal monitor del pannelo di plasma che
raggiunti i 2.8GB il SO inizia ad allocare swap, e se guardo free -h
quanto questo accade ho circa 1.1GB di RAM allocata in buffc/cache
2.8+1.1=3.9Gb che è tutta quella che ho.
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.
Il mio era un esempio, a volte capita anche se ho alcune tab di
firefox(magari con flash)+libreoffice+icedove e poche altre cose (uso
desktop 'normale' ma magari con un op' troppe cose aperte). Il fatto è
che in tutti i casi ho sempre bisogno di pochi centinaia di MB di
swap, mi chiedevo se esiste un modo di recuperarli dal buff/cache,
dato che non riesco a capire per cosa ci sia dentro.
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
il problema non è legato ed uno specifico programma (vd. sopra) ma al
funzionamento generale.
[...]
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
allora vuol dire che ho utilizzato 700MB, come posso scoprire da cosa?
[...]
Ciao
Davide
Spero di essermi spiegato, il mio problema è che non capisco COSA
occupi la cache, magari non ci posso fare nulla ma magari si, potrebbe
essere un filesystem in RAM che può essere spostato su disco, oppure
dei logfile troppo grossi come da quanto sembra qua
(http://serverfault.com/questions/288319/linux-not-freeing-large-disk-cache-when-memory-demand-goes-up
, putroppo non sembra essere il mio caso). Magari non ci posso fare
nulla ma almeno so come mai.