Déterminer le nombre d'octets" logiques " lus / écrits dans un système Linux
je tiens à déterminer le nombre d'octets logiquement lu/écrit par tous les processus via des appels tels que read()
et write()
. Ceci est différent du nombre d'octets réellement récupérés à partir de la couche de stockage (affiché par des outils comme iotop) car il inclut (par exemple) les lectures qui frappent la pagecache, et est également différent dans quand écrit sont reconnus: l'écriture logique IO se produit immédiatement lorsque le write
appel est émis, alors que L'IO physique réelle peut se produire un peu plus tard, en fonction de divers facteurs (Linux écrit généralement des tampons et fait L'IO physique un peu plus tard).
je sais le faire par processus (voir cette question par exemple), mais pas comment obtenir le compte à l'échelle du système.
2 réponses
si vous voulez utiliser /proc
système de fichiers pour les nombres totaux (et pas pour les nombres par seconde), c'est assez facile.
cela fonctionne aussi sur les noyaux assez anciens (testé sur le noyau Debian Squeeze 2.6.32).
# cat /proc/1979/io
rchar: 111195372883082
wchar: 10424431162257
syscr: 130902776102
syscw: 6236420365
read_bytes: 2839822376960
write_bytes: 803408183296
cancelled_write_bytes: 374812672
pour l'ensemble du système, il suffit de faire la somme des nombres de tous les processus, qui cependant ne seront bons qu'à court terme, car au fur et à mesure que les processus meurent, leurs statistiques sont retirées de la mémoire. Vous auriez besoin de comptabilité de processus activé pour enregistrer ils.
la signification de ces fichiers est documentée dans le fichier sources du noyau Documentation/filesystems/proc.txt
:
rchar - compteur d'entrées/sorties: caractères lus
Le nombre d'octets qui cette tâche a causé la lecture de stockage. Il s'agit simplement de la somme des octets passé à lire() et pread(). Cela inclut des choses comme les tty IO et il n'est pas affecté par si oui ou non le disque physique réel IO était nécessaire (la lecture peut ont été satisfaits de pagecache)
wchar - compteur d'entrées/sorties: caractères écrits
Le nombre d'octets qui cette tâche a causé, ou doit causer d'être écrit sur le disque. Similaires mises en garde s'appliquent ici, comme avec rchar.
syscr - I/O contre: lire les syscalls
tentative de compter le nombre de lire I / O opérations, i.e. syscalls comme read () et pread ().
syscw - I/O contre: écrire des syscalls
tentative de compter le nombre d'e / s opérations, c.-à-d. syscalls comme write() et pwrite().
read_bytes - I/O contre: octets lus
Tentative de compter le nombre d'octets qui ce processus a vraiment causé être récupérées à partir de la couche de stockage. Fait au niveau submit_bio (), il est donc précis pour les blocs les systèmes de fichiers.
write_bytes - I / O compteur: octets écrits
Tentative de compter le nombre d'octets qui ce processus a été envoyé à la couche de stockage. Cela se fait à l' page-salir temps.
cancelled_write_bytes
LA GRANDE inexactitude ici est tronquée. Si un processus écrit 1MB dans un fichier et puis efface le fichier, il va en fait effectuer aucune writeout. Mais il aura été comptabilisé comme ayant causé 1MB d'écriture. Dans d'autres paroles: Le nombre de octets laquelle ce processus a entraîné de ne pas se produire, par tronquer pagecache. Une tâche peut aussi causer une IO "négative".
voici un script SystemTap qui trace l'IO logique. Il est basé sur le script à https://sourceware.org/systemtap/SystemTap_Beginners_Guide/traceiosect.html
#! /usr/bin/env stap
# traceio.stp
# Copyright (C) 2007 Red Hat, Inc., Eugene Teo <eteo@redhat.com>
# Copyright (C) 2009 Kai Meyer <kai@unixlords.com>
# Fixed a bug that allows this to run longer
# And added the humanreadable function
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
global reads, writes
probe vfs.read.return {
if ($return > 0) {
reads += $return
}
}
probe vfs.write.return {
if ($return > 0) {
writes += $return
}
}
function humanreadable(bytes) {
if (bytes > 1024*1024*1024) {
return sprintf("%d GiB", bytes/1024/1024/1024)
} else if (bytes > 1024*1024) {
return sprintf("%d MiB", bytes/1024/1024)
} else if (bytes > 1024) {
return sprintf("%d KiB", bytes/1024)
} else {
return sprintf("%d B", bytes)
}
}
probe timer.s(1) {
printf("reads: %12s writes: %12s\n", humanreadable(reads), humanreadable(writes))
# Note we don't zero out reads and writes,
# so the values are cumulative since the script started.
}