Mesurer l'utilisation des E / S disque d'un programme

12

time est une commande brillante si vous voulez savoir combien de temps CPU prend une commande donnée.

Je cherche quelque chose de similaire qui peut mesurer les E / S disque du programme et des enfants. De préférence, il doit faire la distinction entre les E / S qui ont été mises en cache (et n'ont donc pas entraîné la rotation du disque) et les E / S qui n'ont pas été mises en cache.

Je voudrais donc faire:

iomeassure my_program my_args

et obtenir une sortie similaire à:

Cached read: 10233303 Bytes
Cached write: 33303 Bytes  # This was probably a tmp file that was erased before making it to the disk
Non-cached read: 200002020 Bytes
Non-cached write: 202020 Bytes

Je l' ai regardé vmstat, iostatet sar, mais aucun d' entre eux sont à la recherche d'un seul processus. Au lieu de cela, ils regardent l'ensemble du système.

J'ai regardé iotop, mais cela ne me donne une vue que cet instant.

--- Éditer ---

La réponse de Snap semble proche.

«Entrées du système de fichiers:» correspond aux lectures non mises en cache dans des blocs de 512 octets.

«Sorties du système de fichiers:» est l'écriture mise en cache dans des blocs de 512 octets.

Vous pouvez forcer le cache vide avec:

sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null

J'ai testé avec:

 seq 10000000 > seq
 /usr/bin/time -v bash -c 'perl -e "open(G,\">f\"); print G <>;close G; unlink \"f\";" seq'
Ole Tange
la source

Réponses:

9

Vous n'avez pas spécifié le système d'exploitation que vous utilisez.

Linux

Au lieu d'utiliser time fooce qui est (généralement) un shell intégré, vous pouvez essayer la commande externe /usr/bin/time foo. Il fournit des informations supplémentaires telles que le nombre d'entrées et de sorties du système de fichiers (mais aucune information sur les occurrences de cache ou les quantités d'octets). Voir man timeet man getrusagepour plus d'instructions.

Notez que cette fonctionnalité nécessite la version 2.6.22 ou plus récente du noyau Linux.

FreeBSD

Utilisez /usr/bin/time -l foo. Il donne le nombre d'entrées et de sorties. Voir man timeet man getrusagepour plus d'instructions.

casser
la source