2012-03-04 22 views

Respuesta

39

Parece que desea el comando sync, o la función sync().

Si quieres disco caché de descarga: echo 3 | sudo tee /proc/sys/vm/drop_caches

+6

'sync' es 100% no relacionado. Estoy hablando de cachés de lectura de varios GB de larga duración, cantidades no triviales de datos no escritos de corta duración con los que 'sync' trata (y que se escriben en el disco cada 10 segundos aproximadamente). – taw

+7

¿Estás hablando de cachés de disco? Prueba 'echo 3 | sudo tee/proc/sys/vm/drop_caches' –

+0

Acepto su comentario, pero eso no es posible. – taw

1

Desmontando y volver a montar el disco bajo prueba se restablecerá todas las cachés y tampones.

+2

No siempre. Ejemplo: 'mount/dev/sda1/mnt', mire ahora la partición que abre'/dev/sda' (observe el '1' faltante), luego modifique un archivo bajo'/mnt'. Puede ver que esto no se refleja en '/ dev/sda', ya que utiliza diferentes cachés. 'umount/mnt' no ayuda en ese caso, ya que no afecta'/dev/sda', incluso eso es físicamente la misma unidad. – Tino

23

Puede hacerlo de esta manera:

# 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 

Es posible utilizar strace para ver que estos son tres llamadas al sistema diferentes

Además, puede ser deseable para desactivar la memoria caché del disco duro usando hdparm, no está seguro qué cosa estás evaluando

De ninguna manera, no puede evitar que HDD almacene en caché los últimos 64/32/16 MB de datos utilizados recientemente. Para matar ese caché, solo escriba una cierta cantidad de ceros (y purgue) + lea algún lugar no relacionado del HDD. Esto es necesario ya que la memoria caché se puede dividir en parte de lectura y parte de escritura. Después de eso, puedes comparar el HDD.

+1

+1 'blockdev' era exactamente lo que estaba buscando. – Tino

+3

'blockdev --flushbufs/dev/sda' funciona con mi unidad USB, pero no tiene ningún efecto con la unidad SATA SSD. 'echo 3 | sudo tee/proc/sys/vm/drop_caches' funciona con ambas unidades. –

+0

El último comando elimina el disco del kernel. Definitivamente no podrá comparar el disco después (o utilizar el disco de ninguna manera) y si el disco está en uso, es peligroso. No hay ninguna razón para incluirlo junto con los otros comandos. Aquí hay un ejemplo de cuándo usar este comando y qué hace: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Online_Storage_Reconfiguration_Guide/removing_devices.html – ndemou

17

disco caché purga: documentación echo 3 | sudo tee /proc/sys/vm/drop_caches

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

Escribiendo a esto hará que el kernel para caer en memoria caché limpias, dentries y ínodos de la memoria, haciendo que la memoria para ser libre.

Para pagecache libre:

echo 1 > /proc/sys/vm/drop_caches

Para dentries y tres inodos:

echo 2 > /proc/sys/vm/drop_caches

Para memoria intermedia de páginas libres, dentries y ínodos:

echo 3 > /proc/sys/vm/drop_caches

Como esta es una operación no destructiva, y los objetos sucios no son liberables, el usuario debe ejecutar primero la "sincronización" para asegurarse de que se liberen todos los objetos en caché.

3

Breve respuesta bastante buena: (copiar y pegar amigable)

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

Explicación:

sync: Desde la página del manual: amortiguadores del sistema de archivos de descarga. Fuerza los bloques cambiados a disco, actualiza el superbloque.

echo 3 > /proc/sys/vm/drop_cache: from the kernel docsEsto hará que el núcleo descarte cachés limpias

blockdev --flushbufs /dev/sda: desde la página del manual: ioctl de dispositivos de bloque llamada [a] amortiguadores de descarga.

hdparm -F /dev/sda: desde la página del manual: Vaciar el búfer de caché de escritura en la unidad de disco (unidades más antiguas no pueden poner en práctica este)

Aunque los comandos blockdev y hdparm un aspecto similar según an answer above emiten diferentes ioctls a el dispositivo.

largo probablemente mejor manera:

(voy a suponer que usted ha formateado el disco, pero se puede adaptar estos comandos si desea escribir directamente en el disco)

Ejecutar sólo una vez antes de la primera referencia:

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

Ejecutar esto cada vez que desea vaciar la caché:

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 

Ejecuta esto cuando termines.

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

Explicación:

El HDD puede tener H caches/W que no se borrará por los comandos anteriores. Estoy escribiendo y leyendo datos pseudoaleatorios para llenarlos de basura. La cantidad de datos depende de qué tan grande sea la memoria caché de HDD. Estoy usando/dev/urandom porque es rápido y no nos importa verdadero aleatoriedad. Estoy creando /mnt/test/temp-hddread.tmp desde el principio y lo uso cada vez que quiero leer suficientes datos aleatorios. Estoy creando y eliminando /mnt/test/temp-hddwrite.tmp cada vez que quiero escribir suficientes datos aleatorios.

Créditos

He escrito esta respuesta basada en las mejores partes de las respuestas existentes.

Cuestiones relacionadas