2010-02-18 16 views
1

J'essaie de déterminer l'utilisation du processeur de LWP spécifiques dans des processus spécifiques dans Solaris 10 en utilisant des données du système de fichiers/proc. Le problème que j'ai est que parfois un compteur d'utilisation diminue.Comment un compteur d'utilisation dans le système de fichiers Solaris 10/proc peut-il diminuer?

est ici l'essentiel de celui-ci:

// we'll be reading from the file named /proc/<pid>/lwp/<lwpid>/lwpusage 
std::stringstream filename; 
filename << "/proc/" << pid << "/lwp/" << lwpid << "/lwpusage"; 
int fd = open(filename.str().c_str(), O_RDONLY); 
// error checking 
while(1) 
{ 
    prusage_t usage; 
    ssize_t readResult = pread(usage_fd, &usage, sizeof(prusage_t), 0); 
    // error checking 

    std::cout << "sec=" << usage.pr_stime.tv_sec 
       << "nsec=" << usage.pr_stime.tv_nsec << std::endl; 
    // wait 
} 
close(fd); 

Le nombre de nanosecondes rapportés dans la struct prusage_t sont dérivés de horodatages enregistrés chaque fois qu'un LWP change d'état. Cette fonctionnalité est appelée microstate accounting. Ça sonne bien, mais de temps en temps le compteur "appel système temps CPU" diminue environ 1-10 millisecondes. Mise à jour: ce n'est pas seulement le compteur "temps d'appel du système", j'ai vu aussi les autres compteurs diminuer aussi. Une autre curiosité est qu'il semble toujours y avoir exactement un échantillon qui est bidon - jamais deux près l'un de l'autre. Tous les autres échantillons augmentent de façon monotone au taux prévu. Cela semble exclure la possibilité que le compteur soit en quelque sorte réinitialisé dans le noyau.

Des indices sur ce qui se passe ici?

> uname -a 
SunOS cdc-build-sol10u7 5.10 Generic_139556-08 i86pc i386 i86pc 
+0

Avez-vous eu une réponse à celle-ci? – jasonk

Répondre

1

Si vous utilisez une machine multicœur, vous pouvez vérifier si cela se produit lors de la migration du processus d'un cœur de processeur à un autre. Si vos processus sont en cours d'exécution, prstat affichera le processeur sur lequel ils s'exécutent. Pour minimiser les conflits de verrous, les données fréquemment mises à jour sont parfois mises à jour dans une zone de mémoire spécifique au processeur, puis synchronisées avec toutes les copies de données pour d'autres processeurs.

+0

Bonne idée. Merci, je vais jeter un oeil dans cette direction. – Andrew

+0

Je n'ai jamais trouvé de preuves concluantes d'une manière ou d'une autre, mais je suis d'accord que c'est probablement ce qui se passe. – Andrew

0

Juste une supposition. Vous pouvez désactiver temporairement NTP et voir si le problème persiste.

+0

NTP est désactivé, merci! – Andrew