Comment chronométrer les commandes grep avec précision?

9

Je veux comparer la vitesse de ces deux commandes:

grep pattern1 files* 
grep pattern2 files* 

Malheureusement, le premier grep lit une grande partie des fichiers * dans des tampons de mémoire, donc le deuxième grep s'exécute très rapidement, mais pour une mauvaise raison.

Comment puis-je dire à Linux (Fedora 11): "veuillez arrêter de mettre en cache les lectures de disque car je teste quelque chose."

barrycarter
la source
Il y a probablement une réponse plus intelligente ... mais vous pouvez dupliquer la structure du répertoire, donc vous n'aurez pas affaire au même fichier et vous n'aurez pas de problèmes de mise en cache!
nico
1
Soit dit en passant: Fedora 11 est arrivé en fin de vie en juin 2010. Il est temps de mettre à niveau. La prochaine version de Fedora 15 est vraiment sympa. Ou, si vous avez besoin de quelque chose de plus stable sur une durée de vie plus longue (et il semble que vous pourriez le faire puisque vous êtes toujours sur 11), il y a RHEL6 ou CentOS 6. de tous les
jours
Il m'a fallu une éternité pour passer de RH 7.3 à ça! Les mises à niveau cassent les choses et me font peur.
barrycarter
2
En désactivant la mise en cache, vous évaluerez non pas la vitesse de correspondance des modèles, mais la vitesse de votre lecteur. Comme d'autres le suggèrent - il suffit d'exécuter la première commande deux fois: d'abord pour amorcer le cache, ensuite pour comparer.
alex
Je vais l'essayer, mais mon principal problème est la vitesse du disque ... le disque dur devient fou lorsque j'exécute le grep. Hmmm, ok, donc cela peut signifier que l'optimisation de la grep peut ne pas aider du tout ... J'ai besoin d'optimiser la quantité de données que je tire.
barrycarter

Réponses:

11

Je ne pense pas que vous puissiez facilement lui dire "arrêter temporairement la mise en cache". Mais ce que vous pouvez faire, c'est de dire au système de supprimer le cache avant chaque exécution:

En tant que root:

sync; echo 3 > /proc/sys/vm/drop_caches

(Ceci est documenté dans la documentation du noyau à Documentation / sysctl / vm.txt , ce qui est pratique si, comme certains d'entre nous, vous ne pouvez pas toujours vous souvenir à l'avance de ce que font les valeurs 1, 2 ou 3.)

Ou bien sûr, vous pouvez également amorcer le cache et comparer les performances mises en cache. (Je pense que les deux sont des chiffres utiles.)

mattdm
la source
1
echo 1supprimera uniquement le cache de pages, pas les caches de disque.
jsbillings
@jsbillings - euh, oui. Fixé.
mattdm
Incroyablement petite piqûre mineure: je devais faire ">>", pas ">"
barrycarter
@barrycarter: vraiment? hein!
mattdm
3
@barrycarter: vous avez probablement défini -o noclobber dans votre shell, ce qui fait qu'il ne vous permettra pas d'utiliser> pour écraser un fichier existant.
jsbillings
1

Lorsque vous chronométrez des choses comme celle-ci, je l'exécute généralement en premier pour amorcer le cache. Exécutez ensuite la commande en utilisant le temps. En testant quelque chose comme ça, vous devriez être plus préoccupé par le CPU et les temps écoulés, et moins préoccupé par le temps d'E / S.

Dans tous les cas, il est difficile d'obtenir des horaires parfaitement précis. Si les fichiers d'entrée dépassent la taille de la mémoire disponible pour les tampons, vous finirez probablement par parcourir tous les fichiers via le cache de tampon. Sinon, vous pouvez simplement accéder à toutes les données du cache de tampon. Dans la vraie vie, il y a souvent un mélange de données en mémoire tampon et de données lues sur le disque.

BillThor
la source
IRL, je n'exécute cette commande qu'occasionnellement, le contenu des fichiers * n'est donc jamais mis en cache. J'essaie d'optimiser le grep pour fonctionner rapidement dans cette situation. Lorsque le contenu des fichiers * est déjà dans le cache, il s'exécute en moins d'une seconde (inutile d'optimiser cela, car la sortie est destinée à l'utilisateur final)
barrycarter
2
@barrycarter. Si les fichiers ne sont pas mis en cache et qu'ils s'exécutent en moins d'une seconde lorsqu'ils le sont, je ne pense pas que vous trouverez beaucoup d'opportunités d'optimisation. Le déplacement des fichiers vers un stockage plus rapide serait l'optimisation probable.
BillThor