Effacer le cache de fichiers pour répéter les tests de performances

Quels outils ou techniques puis-je utiliser pour supprimer le contenu des fichiers mis en cache afin d’éviter que mes performances ne soient faussées? Je crois que je dois soit complètement effacer, soit supprimer sélectivement les informations mises en cache sur le contenu des fichiers et des répertoires.

L’application que je développe est un utilitaire de compression spécialisé, et il est censé effectuer beaucoup de travail de lecture et d’écriture de fichiers que le système d’exploitation n’a pas encore touché récemment et dont les blocs de disque risquent de ne pas être mis en cache.

Je souhaite supprimer la variabilité que je vois dans IO time lorsque je répète la tâche de profiler différentes stratégies pour effectuer le travail de traitement de fichiers.

Je suis principalement intéressé par les solutions pour Windows XP, car c’est ma machine de développement principale, mais je peux également tester avec Linux, et je suis donc intéressé par les réponses pour cet environnement également.

J’ai essayé SysInternals CacheSet , mais cliquer sur “Effacer” n’entraîne pas d’augmentation mesurable (restauration du délai après un démarrage à froid) dans le temps de relire les fichiers que je viens de lire.

Utilisez l’ application RAMMap de SysInternal.

veille rammap vide

L’option de menu Vider / Vider la liste d’attente efface le cache de fichiers Windows.

Un rapide googling donne ces options pour Linux

  1. Démonter et monter la partition contenant les fichiers
  2. sync && echo 1 > /proc/sys/vm/drop_caches

Pour Windows XP, vous devriez pouvoir effacer le cache pour un fichier spécifique en ouvrant le fichier à l’aide de CreateFile avec les options FILE_FLAG_NO_BUFFERING, puis en fermant le handle. Ce n’est pas documenté, et je ne sais pas si cela fonctionne sur les versions ultérieures de Windows, mais je l’ai utilisé il y a longtemps lors de l’écriture de code de test pour comparer les bibliothèques de compression de fichiers. Je ne me souviens pas si l’access en lecture ou en écriture a affecté cette astuce.

J’ai trouvé une technique (autre que le redémarrage) qui semble fonctionner:

  1. Exécuter quelques copies de MemAlloc
  2. Avec chacun, allouez de gros morceaux de mémoire à quelques resockets
  3. Utilisez Process Explorer pour observer la taille du cache système à des niveaux très bas
  4. Quittez les programmes MemAlloc

Ce n’est pas sélectif si. Idéalement, je voudrais pouvoir effacer les parties spécifiques de la mémoire utilisée pour mettre en cache les blocs de fichiers de fichiers que je ne souhaite plus mettre en cache.

  #include  int posix_fadvise(int fd, off_t offset, off_t len, int advice); 

avec avis option POSIX_FADV_DONTNEED :
Les données spécifiées ne seront pas accessibles dans un avenir proche.

Pour une meilleure vue du cache du système de fichiers de Windows XP – essayez ATM de Tim Murgent – il vous permet de voir la taille de l’ensemble de travail et la taille de la liste d’attente du système de fichiers de manière plus détaillée et précise. Pour Windows XP, vous avez besoin de l’ancienne version 1 d’ATM disponible en téléchargement ici, car V2 et V3 nécessitent Server 2003, Vista ou supérieur.

Vous remarquerez que bien que Sysinternals Cacheset réduise le “Cache WS Min” – les données réelles continuent à exister sous la forme de listes d’attente à partir desquelles elles peuvent être utilisées jusqu’à ce qu’elles soient remplacées par quelque chose d’autre. Pour le remplacer ensuite par autre chose, utilisez un outil tel que MemAlloc ou flushmem par Chad Austin ou Consume.exe à partir des outils du Kit de ressources Windows Server 2003 .

Un utilitaire de ligne de commande peut être trouvé ici

Comme la question demandait également Linux, il y a une réponse connexe ici .

L’outil de ligne de commande vmtouch permet, entre autres, d’append et de supprimer des fichiers et des répertoires du cache de fichiers système.