Puis-je copier des fichiers volumineux plus rapidement sans utiliser le cache de fichiers?

19

Après avoir ajouté le preloadpackage, mes applications semblent accélérer mais si je copie un gros fichier, le cache de fichiers augmente de plus du double de la taille du fichier.

En transférant une seule image ou fichier vidéo Virtualbox de 3 à 4 Go sur un disque externe, cet énorme cache semble supprimer toutes les applications préchargées de la mémoire, ce qui entraîne une augmentation des temps de chargement et une baisse générale des performances.

Existe-t-il un moyen de copier des fichiers volumineux de plusieurs gigaoctets sans les mettre en cache (c'est-à-dire en contournant le cache de fichiers)? Ou un moyen de mettre sur liste blanche ou sur liste noire des dossiers spécifiques à mettre en cache?

Veazer
la source

Réponses:

19

Il y a l' nocacheutilitaire, qui peut être ajouté à une commande comme ioniceet nice. Il fonctionne en préchargeant une bibliothèque qui s'ajoute posix_fadviseavec l' POSIX_FADV_DONTNEEDindicateur à tous les appels ouverts.

En termes simples, il informe le noyau que la mise en cache n'est pas nécessaire pour ce fichier particulier; le noyau ne mettra alors normalement pas le fichier en cache. Voir ici pour les détails techniques.

Cela fait des merveilles pour tous les gros travaux de copie, par exemple si vous voulez sauvegarder un disque de plusieurs téraoctets en arrière-plan avec le moins d'impact possible sur votre système en cours d'exécution, vous pouvez faire quelque chose nice -n19 ionice -c3 nocache cp -a /vol /vol2 .

Un package sera disponible dans Ubuntu 13.10 et versions ultérieures. Si vous êtes sur une version précédente, vous pouvez soit installer le package 13.10 ou opter pour ce backport 12.04 de François Marier.

Gunther Piez
la source
J'espérais quelque chose qui pourrait être fait via l'interface graphique, ainsi qu'un moyen de simplement mettre sur liste noire les dossiers «sans cache», mais cela devra faire pour l'instant.
Veazer
12

Pour les fichiers volumineux uniques, utilisez ddavec des E / S directes pour contourner le cache de fichiers:

Si vous souhaitez transférer un (ou quelques) fichiers volumineux de plusieurs gigaoctets, c'est facile à faire avec dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Les directindicateurs indiquent ddd'utiliser l'option d'E / S directes du noyau (O_DIRECT ) pendant la lecture et l'écriture, contournant ainsi complètement le cache de fichiers.
  • L' bsoption de taille de bloc doit être définie sur une valeur raisonnablement élevée car pour minimiser le nombre d'opérations sur le disque physiquedd , car les lectures / écritures ne sont plus mises en cache et trop de petites opérations directes peuvent entraîner un ralentissement grave.
    • N'hésitez pas à expérimenter avec des valeurs de 1 à 32 Mo; le paramètre ci-dessus est de 4 Mo ( 4M).

Pour les copies de répertoires multiples / récursives , malheureusement, il n'y a pas d'outils facilement disponibles; l'habituel cp, etc. ne prend pas en charge les E / S directes.

/ e iflags & oflags modifiés en iflag & oflag correct

ish
la source
1
Récursif pourrait être fait avec zshl' **opérateur de. zshdoit être installé manuellement à partir du référentiel.
Rétablir Monica - ζ--
1
En fait non. ddLa syntaxe étrange de l 'encrasse l' oprtateur **. Vous pouvez toujours utiliser un script shell qui a obtenu des arguments normalement ( dd.sh in.file out.fileavec ** dans les noms de fichiers) et a donné les noms de fichiers à l' ddaide $1, $2etc., qui ne devrait pas être encrassé par la syntaxe bizarre de dd.
Rétablir Monica - ζ--
1
La création directe est très lente, car l'AFAIK désactive également les caches de lecture anticipée, ce qui n'est probablement pas ce que vous voulez et n'est pas réaliste non plus dans un scénario d'analyse comparative. Utilisez "iflag = nocache oflag = nocache" à la place, ce qui indique exactement au système d'exploitation que vous n'avez pas besoin de mettre en cache le fichier entrant ou sortant.
stolsvik
1

Vous pouvez copier un répertoire récursivement en ddutilisant findetmkdir

Nous devons contourner deux problèmes:

  1. dd ne sait pas quoi faire des répertoires
  2. dd ne peut copier qu'un seul fichier à la fois

Définissons d'abord les répertoires d'entrée et de sortie:

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

Entrons maintenant cddans le répertoire source afin de findrapporter les répertoires relatifs que nous pouvons facilement manipuler:

cd "$SOURCE"

Dupliquez l'arborescence de répertoires de $SOURCEà$TARGET

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

Dupliquer des fichiers de $SOURCEà $TARGETomettre le cache d'écriture (mais en utilisant le cache de lecture!)

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

Veuillez noter que cela ne préservera pas les délais de modification des fichiers, la propriété et d'autres attributs.

unfa
la source