2013-10-31 22 views
7

In Linux, come è possibile azzerare le pagine di memoria liberate per ridurre le dimensioni delle istantanee VM ?Come azzerare la memoria non utilizzata per ridurre le dimensioni dell'istantanea VM

La memoria non azzerata viene memorizzata nell'istantanea anche se tale memoria è stata liberata e non viene più utilizzata. Ad esempio, le pagine di memoria liberati dalla cache file system con

sync && echo 3 > /proc/sys/vm/drop_caches 

sono inutilmente immagazzinate nella snapshot perché non sono state azzerate.

Aggiornamento Una soluzione veramente orribile che sembra funzionare è quello di memoria memset malloc + in un ciclo fino a quando il killer OOM calci. Questo riduce la dimensione di uno snapshot VM ho testato da circa 800 MB a circa 400 MB. C'è una soluzione migliore?

+0

(risposta eliminato poiché dopo la modifica, a quanto pare ho frainteso quello che si voleva davvero) – Damon

+0

credo che questo non è ancora possibile. Linux ha una sola pagina COW zero che restituisce su una nuova allocazione e che copia sul primo accesso in scrittura (creando una pagina piena di zeri, ma tecnicamente non è più una pagina zero). Potresti quindi azzerare tutta la memoria fisica (in teoria) allocando una grande quantità di memoria e scrivendo ''\ 0'' all'inizio di ogni pagina, ma queste saranno in seguito pagine contenenti dati (zero, come succede), non zero pagine. E se li liberi di nuovo, saranno uguali alle pagine liberate non zero che avevi comunque - solo che contengono zero. – Damon

+0

Sebbene si possa provare a fare ciò (allocare molta memoria e renderlo fisicamente azzerato), e quindi 'MADV_MERGEABLE' su tutto il lotto. Forse la fusione del kernel samepage farà il trucco. Si noti che non si tratta precisamente di un'operazione libera (CPU-wise). – Damon

risposta

1

Per ridurre le dimensioni di una macchina virtuale:

  1. Accedere alla macchina virtuale; aprire un terminale e digitare

    cd /home/ 
    
    sudo dd if=/dev/zero of=foo bs=4096 
    
    sudo rm foo 
    
  2. Spegnere la macchina virtuale, accedere al menu VmWare/VMPlayer e andare a

    vmware -> impostazioni della macchina virtuale -> HD -> Utility -> compatta

    e compatta la macchina virtuale

Se si desidera ridurre ulteriormente le dimensioni, utilizzare 7-zip. Per esempio, su Linux, è possibile digitare:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z directory 
+1

Questo riguarda il disco rigido virtuale, non la RAM virtuale. La domanda riguarda le istantanee, che includono dati del disco rigido e dati RAM. – glglgl

3

Qualcosa del genere consentirà di liberare la cache del disco, quindi Alloc & memset la quantità di memoria libera (meno 32 MB, come headroom per evitare di colpire swap) usando dd. Effettuerà temporaneamente la memoria un-CoW della VM in caso, ad esempio, di KSM, ma lascerà (non allocati) blocchi di memoria pieni di zeri, che potranno poi essere condivisi/deduplicati con altre VM (con KSM) o facilmente compressi.

#!/bin/bash 

echo 3 > /proc/sys/vm/drop_caches 
memfree=$(free -m | awk '/^Mem/ {print $4-32}') 
if [ $memfree -gt 0 ]; then 
     dd if=/dev/zero of=/dev/null bs=${memfree}M count=1 
fi 
Problemi correlati