2010-01-23 11 views
8

Sur Linux, je voudrais savoir quelle API "C" appeler pour obtenir les statistiques par CPU.Comment est-ce que j'obtiens des stats par-cpu (système, idle, gentil, ...) comme le fait la commande "top"?

Je sais au sujet et pouvait lire /proc/loadavg à partir de mon application, mais cela est le avarages charge l'ensemble du système, et non pas les informations par-cpu. Je veux différencier les processeurs individuels ou les cœurs.

À titre d'exemple d'une application qui fait cela, quand je lance top et appuyez sur « 1 », je peux voir les 4 ou 8 processeurs/coeurs comme celui-ci:

Cpu0 : 4.5%us, 0.0%sy, 0.0%ni, 95.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
Cpu1 : 42.2%us, 6.2%sy, 0.5%ni, 51.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
Cpu2 : 3.0%us, 1.5%sy, 0.0%ni, 94.5%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st 
Cpu3 : 7.0%us, 4.7%sy, 0.0%ni, 88.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

j'ai essayé de strace top mais cela a conduit à un nid de rat.

+0

Cette question intéressante aurait dû être migrée vers [Unix & Linux.SE.] (Http://unix.stackexchange.com/?as=1) – Vorac

+0

@ Vorac, non? Il s'agit de l'API C Non shell ou les fichiers du noyau (bien que '/ proc' sera probablement utilisé de toute façon). – rubenvb

+0

@rubenvb, vous avez un bon point. D'autre part. lire un fichier dans/proc s'applique également aux utilisateurs, aux administrateurs et aux programmeurs. Et la question est spécifique à Linux. Mais alors, il y a une balise 'linux' ici. D'un autre côté, ce site est assez surchargé et il serait bon de diffuser certains sujets à ses soeurs SE-es. Oh, je me suis tellement mélangé. – Vorac

Répondre

6

Le fichier que vous voulez est /proc/stat. (Vous voudrez peut-être faire référence à fs/proc/stat.c dans la source du noyau Linux.)

+0

Exactement ce que je cherchais! Je vous remercie. –

2

Ce n'est pas une vraie réponse mais je voudrais jeter un oeil au code source de haut.

+0

Le code source pour top peut être trouvé ici: http://sourceforge.net/projects/unixtop/ – jschmier

0

Je suppose que le fichier kernel timer.c peut être d'une certaine importance dans ce scénario pour calculer les moyennes de charge. De la fonction fichier timer.c calc_load()

unsigned long avenrun[3]; 

static inline void calc_load(unsigned long ticks) 
{ 

    unsigned long active_tasks; /* fixed-point */ 
    static int count = LOAD_FREQ; 

    count -= ticks; 
    if (count < 0) { 
     count += LOAD_FREQ; 
     active_tasks = count_active_tasks(); 
     CALC_LOAD(avenrun[0], EXP_1, active_tasks); 
     CALC_LOAD(avenrun[1], EXP_5, active_tasks); 
     CALC_LOAD(avenrun[2], EXP_15, active_tasks); 
    } 
}