¿Puedo copiar archivos grandes más rápido sin usar el caché de archivos?

19

Después de agregar el preloadpaquete, mis aplicaciones parecen acelerarse, pero si copio un archivo grande, el caché del archivo aumenta en más del doble del tamaño del archivo.

Al transferir una sola imagen de virtual box de 3-4 GB o un archivo de video a una unidad externa, este enorme caché parece eliminar todas las aplicaciones precargadas de la memoria, lo que aumenta los tiempos de carga y las caídas de rendimiento en general.

¿Hay alguna manera de copiar archivos grandes de varios gigabytes sin almacenarlos en caché (es decir, sin pasar por el caché de archivos)? ¿O una forma de incluir en la lista blanca o en la lista negra las carpetas específicas de la caché?

Veazer
fuente

Respuestas:

19

Existe la nocacheutilidad, que puede anteponerse a un comando como ionicey nice. Funciona precargando una biblioteca que se agrega posix_fadvisecon la POSIX_FADV_DONTNEEDbandera a cualquier llamada abierta.

En términos simples, informa al núcleo que el almacenamiento en caché no es necesario para ese archivo en particular; el núcleo normalmente no almacenará en caché el archivo. Vea aquí los detalles técnicos.

Hace maravillas para cualquier trabajo de copia enorme, por ejemplo, si desea hacer una copia de seguridad de un disco de varios terabytes en segundo plano con el menor impacto posible en su sistema en ejecución, puede hacer algo nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Un paquete estará disponible en Ubuntu 13.10 y superior. Si está en una versión anterior, puede instalar el paquete 13.10 u optar por este backport 12.04 de François Marier.

Gunther Piez
fuente
Esperaba algo que pudiera hacerse a través de la GUI, así como una forma de simplemente poner en la lista negra las carpetas 'sin caché', pero esto tendrá que hacer por ahora.
Veazer
12

Para archivos grandes individuales, use ddcon E / S directa para omitir el caché de archivos:

Si desea transferir uno (o algunos) archivos grandes de varios gigabytes, es fácil hacerlo con dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Las directbanderas le indican ddque use la opción de E / S directa del núcleo ( O_DIRECT) mientras lee y escribe, evitando por completo el caché del archivo.
  • La bsopción de tamaño de bloque debe establecerse en un valor razonablemente grande ya que para minimizar el número de operaciones físicas de disco dddeben realizarse, ya que las lecturas / escrituras ya no se almacenan en caché y demasiadas operaciones directas pequeñas pueden provocar una desaceleración grave.
    • Siéntase libre de experimentar con valores de 1 a 32 MB; la configuración anterior es de 4 MB ( 4M).

Para copias de directorios múltiples / recursivas , desafortunadamente, no hay herramientas fácilmente disponibles; lo habitual cp, etc. no admiten E / S directas.

/ e iflags y oflags cambiaron al iflag y oflag correctos

ish
fuente
1
Recursivo podría hacerse con zshel **operador de. zshnecesita ser instalado manualmente desde los repositorios.
Restablece a Monica - ζ--
1
En realidad no. ddLa extraña sintaxis ensucia al oprtador **. Aún se podía utilizar un script de shell que tiene argumentos normalmente ( dd.sh in.file out.filecon ** en los nombres de archivo) y dio los nombres de archivo a ddutilizar $1, $2etc, que no debe ser una falta de sintaxis extraña de dd.
Restablece a Monica - ζ--
1
La creación directa es muy lenta, ya que AFAIK también deshabilita los cachés de lectura anticipada, que probablemente no es lo que desea, y tampoco es realista en un escenario de evaluación comparativa. Utilice "iflag = nocache oflag = nocache" en su lugar, que le dice exactamente al sistema operativo que no necesita el archivo en caché o el archivo en caché.
stolsvik
1

Se puede copiar un directorio de forma recursiva con ddel uso findymkdir

Necesitamos solucionar dos problemas:

  1. dd no sabe qué hacer con los directorios
  2. dd solo puede copiar un archivo a la vez

Primero definamos los directorios de entrada y salida:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Ahora vamos cdal directorio de origen para findinformar directorios relativos que podemos manipular fácilmente:

cd "$SOURCE"

Duplicar el árbol de directorios de $SOURCEa$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Los archivos duplicados de $SOURCEque $TARGETla omisión de caché de escritura (pero utilizando caché de lectura!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Tenga en cuenta que esto no preservará los tiempos de modificación del archivo, la propiedad y otros atributos.

unfa
fuente