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?
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.
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
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.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. ]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
dd
en utilisant find
et mkdir
Nous avons besoin de contourner deux problèmes:
dd
ne sait pas quoi faire avec les répertoiresdd
ne peut copier qu'un fichier à la foisCommenç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.