2016-05-15 2 views
2

perf stat -d ./sample.out sortie est:Comment résoudre "non compté" dans perf?

Performance counter stats for './sample.out': 

      0.586266 task-clock (msec)   # 0.007 CPUs utilized   
       2 context-switches   # 0.003 M/sec     
       1 cpu-migrations   # 0.002 M/sec     
       116 page-faults    # 0.198 M/sec     
      7,35,790 cycles     # 1.255 GHz      [81.06%] 
    <not counted> stalled-cycles-frontend 
    <not supported> stalled-cycles-backend 
    <not counted> instructions    
    <not counted> branches     
    <not counted> branch-misses   
    <not supported> L1-dcache-loads:HG  
    <not counted> L1-dcache-load-misses:HG 
    <not counted> LLC-loads:HG    
    <not supported> LLC-load-misses:HG  

     0.088013919 seconds time elapsed 

J'ai lu pourquoi sera affiché à partir . Mais je reçois même pour des compteurs de base comme des instructions, des branches, etc. Quelqu'un peut-il suggérer comment le faire fonctionner?

chose intéressante est:

sudo perf sommeil stat 3

donne une sortie:

Performance counter stats for 'sleep 3': 

      0.598484 task-clock (msec)   # 0.000 CPUs utilized   
       2 context-switches   # 0.003 M/sec     
       0 cpu-migrations   # 0.000 K/sec     
       181 page-faults    # 0.302 M/sec     
    <not counted> cycles     
    <not counted> stalled-cycles-frontend 
    <not supported> stalled-cycles-backend 
    <not counted> instructions    
    <not counted> branches     
    <not counted> branch-misses 

sudo perf stat C 1 sommeil 3

Performance counter stats for 'CPU(s) 1': 

     3002.640578 task-clock (msec)   # 1.001 CPUs utilized   [100.00%] 
       425 context-switches   # 0.142 K/sec     [100.00%] 
       9 cpu-migrations   # 0.003 K/sec     [100.00%] 
       5 page-faults    # 0.002 K/sec     
     7,82,97,019 cycles     # 0.026 GHz      [33.32%] 
     9,38,21,585 stalled-cycles-frontend # 119.83% frontend cycles idle [33.32%] 
    <not supported> stalled-cycles-backend 
     3,09,81,643 instructions    # 0.40 insns per cycle   
              # 3.03 stalled cycles per insn [33.32%] 
     70,15,390 branches     # 2.336 M/sec     [33.32%] 
      6,38,644 branch-misses    # 9.10% of all branches   [33.32%] 

     3.001075650 seconds time elapsed 

Pourquoi ce fonctionnement inattendu?

Merci

Répondre

-2

sudo perf stat -C 1 sleep 3 profils tout qui se passe sur CPU 1, tous les processus et le code du noyau. C'est pourquoi sudo est requis. C'est aussi pourquoi l'horloge de la tâche est ~ 3002 ms.

perf stat sleep 3 (qui n'a pas besoin de sudo) ne profile que le processus sleep(1) lui-même. L'horloge de la tâche l'a mesurée à ~ 0,6 ms du temps CPU.


sleep ne fait rien à proprement parler; la plupart des instructions qui s'exécutent se trouvent dans l'éditeur de liens dynamique. Comme la réponse de @ osgx l'indique, il vous manque des comptes car perf n'a pas assez de compteurs matériels sur votre machine, donc il les multiplexe. Les compteurs sans compte doivent avoir été enregistrés pendant que sleep dormait, pas en cours d'exécution. Pour obtenir de bons résultats, placez votre micro-marque dans une boucle qui dure au moins cent millisecondes, de préférence ~ 1 seconde pour un bon rapport signal-bruit, selon les compteurs que vous comptez.

+0

'est pas perf stat' échantillonnage statistique (http: //lxr.free-electrons.com/source/tools/perf/builtin-stat.c?v=4.4 - "Commande de statistiques intégrée: donne une vue d'ensemble des compteurs de performance ** précis ** sur n'importe quelle charge de travail, CPU ou PID spécifique "), il devrait être le mode comptage clair de hw pmu, capable de voir tous les événements. 'sleep 1' et' echo 1' font tous deux beaucoup de syscalls (vérifiez 'strace sleep 1' ou' ltrace sleep 1') et ils ont tous des centaines de milliers de cycles et d'instructions. Seul l'enregistrement de perf est un échantillonnage statistique. Vous pouvez également ajouter un drapeau -vv après stat pour vérifier le champ "sampling" de perf_events syscall. – osgx

+0

@osgx: Je voulais dire que l'UGP HW échantillonne elle-même, en déclenchant seulement une interruption toutes les 50k instructions/cycles/branches ou autres, n'est-ce pas? Il ne peut pas déclencher une interruption à chaque cycle d'horloge. Ou pouvez-vous obtenir le compte exact après, même pour les compteurs qui ne se sont jamais retournés et ont déclenché une interruption? –

+0

@osgx: Quoi qu'il en soit, votre réponse est clairement la bonne; merci de corriger mon erreur. Je n'ai pas regardé assez attentivement la sortie '-C' pour remarquer qu'il s'agissait de compteurs de multiplexage, et cela explique complètement les observations du PO. –

4

Le problème typique de perf stat -d des programmes très courts n'est pas l'échantillonnage statistique, mais multiplexage (pour cent entre crochets dit [33%] - ce compteur a été prise en compte que pour environ 33% du temps de fonctionnement).

Vous demandez à votre PMU de surveiller un trop grand nombre d'événements à la fois, et perf ne peut pas cartographier tous les compteurs requis sur du matériel réel (PMU - unité de surveillance des performances de la CPU) en même temps. Une PMU typique peut avoir quelque chose comme 4 ou 7 ou 8 compteurs indépendants, mais le nombre peut être divisé par deux si vous avez activé une technologie SMT (par exemple, HT - HyperThreading). Lorsque vous demandez à perf de compter autant de compteurs (vous avez 6 événements HW pris en charge dans votre sortie de statistiques de perf), tous les groupes seront divisés en groupes plus petits. Les groupes seront changés par le noyau à certains moments, quand perf_events aura la chance de les changer, par exemple sur le tick de l'horloge de la tâche (~ 3 ms).

Vous pouvez diviser votre INTRODUISE plusieurs avec de plus petits ensembles d'événements - un certain nombre d'événements SW et HW 2-4 événements par course:

perf stat -e task-clock,page-faults,cycles,stalled-cycles-frontend 
perf stat -e task-clock,page-faults,cycles,instructions    
perf stat -e task-clock,page-faults,branches,branch-misses   
perf stat -e task-clock,page-faults,L1-dcache-load-misses:HG,LLC-loads:HG