Comment l'util de iostat est-il calculé?
iostat -x -d
peut afficher beaucoup d'i/o statistique info.
Pour util de iostat, l'explication est :
Pourcentage de temps CPU cours de laquelle les demandes d'e/S ont été émises à l'appareil (largeur de bande de l'utilisation de l'appareil). Appareil de saturation se produit lorsque cette valeur est proche de 100%
Je veux savoir comment l'util a été calculé?
Je fais une expérience, (voir ci-après le code), début 40 thread pour lire au hasard 40 fichiers. Je suppose que le disque util devrait être très élevé, mais je suis dans l'erreur,
le iostat est comme suivre, n'importe qui peut donner pourquoi? THX
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdb1 0.01 0.44 0.24 0.57 3.44 8.14 14.34 0.00 2.28 0.66 0.05
Code:
#include <iostream>
#include <fstream>
#include <pthread.h>
using namespace std;
void* work(void* a)
{
int* id = (int*)a;
string file = "sys.partition";
char buf[100];
sprintf(buf, "%d", *id);
file.append(string(buf));
ifstream in(file.c_str());
in.seekg(0, ios_base::end);
size_t len = in.tellg();
cout << "open file : " << file << " , " << len << endl;
srand(time(NULL));
while(true)
{
size_t pos = rand() % len;
in.seekg(pos);
//cout << pos << endl;
in.read(buf, 10);
system("sync");
}
in.close();
}
int main(int argc, char** argv)
{
static const int num = 40;
pthread_t threads[num];
for (int i = 0; i < num; i++) {
pthread_create(&threads[i], NULL, work, &i);
}
for (int i = 0; i < num; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
source d'informationauteur Raymond
Vous devez vous connecter pour publier un commentaire.
%util
est nommé occupé dans le code source de la commande iostat: https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380Occupé est compté en tant que pourcentage du ratio de
Ticks
àdeltams
limitée à 100%DeltaMS est la somme de la charge du système pour la période de temps (temps de l'utilisateur + temps + temps d'inactivité + iowait)/ncpu.
Tiques - est de la
Time of requests in queue
pour la périodeEn plus de la version actuelle de sysstat, le code est un peu différent:
http://sources.debian.net/src/sysstat/10.2.0-1/iostat.c#L959
xds est rempli dans le
compute_ext_disk_stats(&sdc, &sdp, itv, &xds);
http://sources.debian.net/src/sysstat/10.2.0-1/common.c?hl=679#L679Et il est rempli de tot_ticks de la commande iostat.c
tot_ticks
sont la lecture de "sysfs stat pour le bloc en cours de l'appareil ou de la partition" dansread_sysfs_file_stat
(iostat.c:487), etioi
etioj
sont en cours et le précédent stat.iostat -x
(J'ai utilisé un vieux le code source écrire ça avant de s'en rendre compte) affiche les informations de/proc/diskstats
(documenté ici) et/proc/stat
(pour le temps de calcul; voir l'homme proc(5)) (et de quelques autres, mais ce n'est pas important pour la compréhension).Vous pouvez voir les extraits de code dans osgx réponse, mais je n'arrivais pas à faire sens de leur isolement, voici donc une longue explication:
%util = blkio.ticks /deltams * 100%
deltams
est le temps écoulé depuis le dernier instantané dans le ms. Il utilise CPU stats de/proc/stat
sans doute parce qu'elle donne de meilleurs résultats que de compter sur le système de temps, mais je ne sais pas pour sûr. (Note: pour une raison que les temps sont divisés parHZ
tandis que le la documentation unis, il est enUSER_HZ
je ne comprends pas.)blkio.ticks
est "le nombre de millisecondes passé à faire des I/Os", de/proc/diskstats
docs:c'est à dire ma compréhension est que
ticks
est le nombre de tiques lors de toute demande d'e/S (pour cet appareil) était en cours multiplié par la durée entre les tiques.Donc
%util = 100%
signifie que chaque fois que le noyau a regardé (je suppose que c'est 1000 fois par seconde sur les noyaux modernes, voir "HZ"), une demande d'e/S est en cours.Voici un extrait de d'un autre poste sur iostat:
Que par la page de man, la première ligne des résultats de la commande iostat est une moyenne à partir du moment où le système a été amorcé.
De mes tests, ce qui semble également s'appliquer à la seule ligne, si elle est appelée par exemple, comme
Essayer:
Il vous donnera cinq lignes avec une seconde différence entre les lignes. Jeter la première, regardez les autres, comme peut-être que la sortie aura plus de sens.
%util signifie la quantité de temps passé à la lecture/écriture de l'unité de temps, vous pouvez calculer à partir de la moyenne de temps de service:
donc de 0,05%
Je n'ai pas lu ton code, mais, évidemment, à moins de 1 de lecture ou d'écriture par seconde, il n'est pas chargé les disques que beaucoup!