Domanda Come eliminare le cache I / O del disco su Linux


Ho bisogno di farlo per un benchmarking più prevedibile.


44
2018-03-04 02:35


origine


risposte:


Sembra che tu voglia il sincronizzare comando, o il sync () funzione.

Se si desidera il flushing della cache del disco: echo 3 | sudo tee /proc/sys/vm/drop_caches


45
2018-03-04 02:38



Puoi farlo in questo modo:

# sync # (move data, modified through FS -> HDD cache) + flush HDD cache
# echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt)
# blockdev --flushbufs /dev/sda
# hdparm -F /dev/sda

# NEXT COMMAND IS NOT FOR BENCHMARKING:
# should be run before unplug, flushes everything possible guaranteed.
# echo 1 > /sys/block/sdX/device/delete

Puoi usare strace per vedere che si tratta di tre diverse syscall

Inoltre, potrebbe essere preferibile disattivare la cache dell'HDD utilizzando hdparm, non so quale cosa si benchmarking.

In alcun modo, non è possibile impedire all'HDD di memorizzare nella cache gli ultimi 64/32/16 MB di dati utilizzati di recente. Per uccidere quella cache, basta scrivere una certa quantità di zeri (e flush) + leggere un posto non correlato dall'HDD. Questo è richiesto poiché la cache può essere divisa in parti di lettura e di scrittura. Successivamente è possibile eseguire il benchmark dell'HDD.


27
2018-01-30 21:45



Eliminazione cache del disco: echo 3 | sudo tee /proc/sys/vm/drop_caches 

Documentazione di comando: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Scrivere su questo farà sì che il kernel elimini cache, dentinature e inode puliti dalla memoria, facendo in modo che quella memoria diventi libera.

Per liberare il pagecache:

echo 1 > /proc/sys/vm/drop_caches

Per liberare dentips e inode:

echo 2 > /proc/sys/vm/drop_caches

Per liberare pagecache, dentries e inode:

echo 3 > /proc/sys/vm/drop_caches

Poiché si tratta di un'operazione non distruttiva e gli oggetti sporchi non sono liberi, l'utente deve prima eseguire "sync" per assicurarsi che tutti gli oggetti memorizzati nella cache vengano liberati.


18
2017-08-16 01:43



Breve risposta abbastanza buona: (copia incolla amichevole)

DISK=/dev/sdX # <===ADJUST THIS===
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK

Spiegazione:

sync: Dalla pagina man: svuotare i buffer del file system. Forza i blocchi modificati su disco, aggiorna il super blocco.

echo 3 > /proc/sys/vm/drop_cache: dai documenti del kernel  questo farà sì che il kernel lasci cadere delle cache pulite

blockdev --flushbufs /dev/sda: dalla pagina man: ioctls di dispositivo di blocco di chiamata [per] svuotare i buffer.

hdparm -F /dev/sda: dalla pagina man: Svuota il buffer della cache di scrittura su disco (le unità meno recenti potrebbero non implementarlo)

Anche se i comandi blockdev e hdparm sembrano simili secondo una risposta sopra emettono ioctl diversi sul dispositivo.

Molto probabilmente molto meglio: 

(Suppongo che tu abbia formattato il disco ma puoi adattare questi comandi se vuoi scrivere direttamente sul disco)

Esegui questa operazione solo una volta prima del 1 ° benchmark:

MOUNT=/mnt/test # <===ADJUST THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16

Esegui questo ogni volta che vuoi svuotare le cache:

DISK=/dev/sdX # <===ADJUST THIS===
MOUNT=/mnt/test # <===AND THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16
rm $MOUNT/temp-hddwrite.tmp
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
dd if=$MOUNT/temp-hddread.tmp of=/dev/null

Esegui questo quando hai finito.

MOUNT=/mnt/test # <===ADJUST THIS===
rm $MOUNT/temp-hddread.tmp

Spiegazione:

L'HDD potrebbe avere cache H / W che non verranno cancellate dai comandi sopra. Sto scrivendo e leggendo dati pseudo-casuali saltellanti per riempirli di spazzatura. Quanti dati dipendono dalla grandezza della cache dell'HDD. Sto usando / dev / urandom perché è veloce e non ci interessa vero casualità. Sto creando /mnt/test/temp-hddread.tmp dall'inizio e lo uso ogni volta che voglio leggere abbastanza dati casuali. Sto creando e cancellando /mnt/test/temp-hddwrite.tmp ogni volta che voglio scrivere abbastanza dati casuali.

Crediti

Ho scritto questa risposta sulla base delle parti migliori delle risposte esistenti.


4
2018-05-30 15:44



Smontando e rimontando il disco in prova si ripristineranno tutte le cache e i buffer.


1
2018-03-04 02:45