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


106

Quels outils ou techniques puis-je utiliser pour supprimer le contenu des fichiers mis en cache afin d'éviter que mes résultats de performances ne soient faussés? 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 devrait faire beaucoup de travail pour lire et écrire des fichiers que le système d'exploitation n'a pas touchés récemment et dont les blocs de disque sont peu susceptibles d'être mis en cache.

Je souhaite supprimer la variabilité que je vois dans le temps d'E / S lorsque je répète la tâche de profilage de 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 principale machine de développement, mais je peux également tester avec Linux, et je suis donc intéressé par des réponses pour cet environnement aussi.

J'ai essayé SysInternals CacheSet , mais le fait de cliquer sur "Effacer" n'entraîne pas une augmentation mesurable (restauration du timing après un démarrage à froid) du temps de relecture des fichiers que je viens de lire quelques fois.



1
Pourquoi cette question a-t-elle été supprimée ?
Dan Dascalescu

Réponses:


82

Utilisez l' application RAMMap de SysInternal .

rammap vide veille

L'option de menu Liste d'attente vide / vide effacera le cache de fichiers Windows.


2
RAMMap ne fonctionne pas sous Windows XP. Ces options de menu font-elles quelque chose de différent du bouton "Effacer" de l'application SysInternals Cacheset?
Stephen Denne

@stephen cette technique a parfaitement fonctionné pour moi sous Windows 8! Windows XP a maintenant 12 ans, quelle est la raison pour laquelle vous ne pouvez pas essayer ceci sur Vista, Windows 7 ou Windows 8?
Jeff Atwood

@Jeff Je ne travaille plus avec ces limitations. La "Liste de veille vide" entraîne donc la prochaine lecture d'un fichier récemment lu nécessitant une E / S disque?
Stephen Denne

2
Appuyez sur F5 pour actualiser la liste des fichiers après avoir cliqué sur la liste d'attente vide
JoshG

3
Pour une approche programmatique, voir ce post SO: stackoverflow.com/a/23085045/430360
snemarch

16

Pour Windows XP, vous devriez être en mesure de vider le cache d'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'accès en lecture ou en écriture a affecté cette astuce.


Fonctionne parfaitement pour moi sous Windows 7 SP1, x64. Bon conseil!
cxxl

2
Cela doit donc être répété pour chaque fichier ? Donc, si par exemple, vous copiez un répertoire contenant 100 Mo répartis sur 30 fichiers dans 10 sous-répertoires, vous devez ouvrir chacun d'eux séparément pour vous assurer de lire le disque réel au lieu du cache?
Synetech

D'autres réponses sur le site affirment que cela fonctionne également dans Win7 et 8. Je suppose que cela fonctionne sur Vista. Et oui, vous devez l'exécuter sur chaque fichier, mais cela ne prend pas si longtemps. Tout ce que vous avez à faire est d'ouvrir et de fermer chaque fichier, et lorsque vous fermez, Windows efface le cache. Après avoir fait cela, ALORS vous exécutez votre test de performance.
Mooing Duck le

1
C'était une réponse parfaite. Simple à coder, efficace et devrait fonctionner sur la plupart des systèmes d'exploitation Windows (y compris XP, je n'ai testé que sur Win7x64). J'ai ouvert les fichiers avec des privilèges de lecture et aucun partage. Je ne sais pas quel combo compte.
Rosco

Fonctionnalité similaire sur Linux (à partir de la version 2.4.10) avec l'indicateur O_DIRECT dans l'appel système open (2). Eh bien, plus précisément, d'après ce que j'ai compris, O_DIRECT ne vide pas le cache de ce fichier, il essaie de le contourner.
kaiwan

14

Une recherche rapide sur Google donne ces options pour Linux

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

2
Merci, cela semble très utile, même si je voudrais peut-être faire écho à 3 au lieu de 1. Je suis principalement intéressé par Windows XP, c'est pourquoi je n'avais pas trouvé cela dans ma recherche sur Google.
Stephen Denne

Malheureusement, l'environnement Linux dans lequel je pourrais utiliser cela a la version 2.6.9 du noyau. drop_caches a été ajouté dans le noyau 2.6.16
Stephen Denne le

Beaucoup d'autres articles que j'ai lus suggèrent que vous pouvez démonter et monter le système de fichiers pour supprimer tous les éléments déchirés, je suppose que c'était le cas avant 2.6.16 ainsi que dans les noyaux plus récents.
TafT

12

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

de la source:

EmptyStandbyList.exe est un outil de ligne de commande pour Windows (Vista et supérieur) qui peut vider:

  • ensembles de travail de processus,
  • la liste des pages modifiées,
  • les listes d'attente (priorités 0 à 7), ou
  • la liste d'attente de priorité 0 uniquement.

Usage:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

3
Réponse très sous-estimée au milieu de tout le bruit, un utilitaire simple qui fait un travail et le fait bien. Vous devriez probablement inclure plus de détails dans la réponse pour obtenir les votes positifs que vous méritez.
Prometheus


3

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

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

Ce n'est cependant pas sélectif. Idéalement, j'aimerais pouvoir effacer les parties spécifiques de la mémoire utilisées pour la mise en cache des blocs de disque de fichiers que je ne souhaite plus mettre en cache.


Cela a pour effet secondaire de pousser des éléments dans le fichier d'échange, ce qui réduira les performances pendant un certain temps par la suite. Si vous avez recours à un kludge, alors vous pouvez tout aussi bien lire un autre fichier volumineux; au moins, cela efface uniquement le cache disque et rien d'autre.
Synetech

3

Pour une bien meilleure vue du cache du système de fichiers de Windows XP - essayez ATM de Tim Murgent - il vous permet de voir à la fois la taille de l'ensemble de travail du cache du système de fichiers et la taille de la liste d'attente dans une vue plus détaillée et précise. Pour Windows XP - vous avez besoin de l'ancienne version 1 d'ATM qui est disponible au téléchargement ici puisque les versions 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 d'exister sous la forme de listes de veille à partir desquelles elles peuvent être utilisées jusqu'à ce qu'elles soient remplacées par autre chose. Pour ensuite le remplacer par quelque chose d'autre, utilisez un outil tel que MemAlloc ou flushmem de Chad Austin ou Consume.exe à partir des outils du Kit de ressources Windows Server 2003 .


0

Comme la question a également été posée pour Linux, il y a une réponse connexe ici .

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.