web-dev-qa-db-fra.com

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

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

En transférant un seul fichier image ou vidéo virtualbox de 3 à 4 Go sur un lecteur externe, cet énorme cache semble supprimer toutes les applications préchargées de la mémoire, ce qui entraîne des temps de chargement plus longs et des pertes de performances générales.

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

19
Veazer

Il existe l'utilitaire nocache , qui peut être ajouté à une commande telle que ionice et Nice. Cela fonctionne en préchargeant une bibliothèque qui ajoute posix_fadvise avec l'indicateur POSIX_FADV_DONTNEED à tous les appels ouverts.

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

Il fait des merveilles pour tous les gros travaux de copie, e. g. Si vous souhaitez sauvegarder un disque de plusieurs téraoctets en arrière-plan avec le moins d'impact possible sur votre système d'exploitation, vous pouvez effectuer une opération le long de Nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Un paquet sera disponible dans Ubuntu 13.10 et plus. Si vous utilisez une version précédente, vous pouvez installer le package 13.1 ou opter pour ce backport 12.04 de François Marier.

18
Gunther Piez

Pour les gros fichiers simples, utilisez dd avec E/S directes pour contourner le cache de fichiers:

Si vous souhaitez transférer un (ou plusieurs) fichier volumineux de plusieurs gigaoctets, il est facile de le faire avec dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Les indicateurs direct indiquent à dd d'utiliser l'option d'E/S directe du noyau (O_DIRECT) lors de la lecture et de l'écriture, ignorant ainsi complètement le cache de fichiers.
  • L'option bs blocksize doit être définie sur une valeur raisonnablement grande car, pour minimiser le nombre d'opérations sur disque physique, dd doit être exécuté, car les lectures/écritures ne sont plus mises en cache et que trop nombreuses petites opérations directes peuvent entraîner un ralentissement important. ]
    • N'hésitez pas à expérimenter avec des valeurs comprises entre 1 et 32 ​​Mo; le paramètre ci-dessus est 4 Mo (4M).

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

/ e iflags & oflags a été remplacé par le correct iflag & oflag

11
ish

Vous pouvez copier un répertoire de manière récursive avec dd en utilisant find et mkdir

Nous avons besoin de contourner deux problèmes:

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

Commençons par définir les répertoires d’entrée et de sortie:

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

Maintenant, prenons cd dans le répertoire source afin que find rapporte les répertoires relatifs que nous pouvons facilement manipuler:

cd "$SOURCE"

Dupliquer l'arborescence de $SOURCE à $TARGET

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

Doubler les fichiers de $SOURCE à $TARGET en omettant le cache en écriture (mais en utilisant le cache en lecture!)

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

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

1
unfa