2017-05-10 3 views
0

J'essaie de me familiariser avec perf et l'exécuter contre divers programmes que j'ai écrits. Lorsque je le lance contre un programme 100% mono-thread, perf montre qu'il faut deux cœurs sur la machine (événement task-clock). est ici la sortie par exemple:Pourquoi perf montre que le sommeil prend tous les noyaux?

perf stat -a --per-core python3 test.py 

Performance counter stats for 'system wide': 

    S0-C0   1  19004.951263  task-clock (msec) # 1.000 CPUs utilized   (100.00%) 
    S0-C0   1    5,582  context-switches            (100.00%) 
    S0-C0   1     19  cpu-migrations            (100.00%) 
    S0-C0   1    3,746  page-faults             
    S0-C0   1 <not supported>  cycles     
    S0-C0   1 <not supported>  stalled-cycles-frontend 
    S0-C0   1 <not supported>  stalled-cycles-backend 
    S0-C0   1 <not supported>  instructions    
    S0-C0   1 <not supported>  branches     
    S0-C0   1 <not supported>  branch-misses    
    S0-C1   1  19004.950059  task-clock (msec) # 1.000 CPUs utilized   (100.00%) 
    S0-C1   1    6,752  context-switches            (100.00%) 
    S0-C1   1     25  cpu-migrations            (100.00%) 
    S0-C1   1    935  page-faults             
    S0-C1   1 <not supported>  cycles     
    S0-C1   1 <not supported>  stalled-cycles-frontend 
    S0-C1   1 <not supported>  stalled-cycles-backend 
    S0-C1   1 <not supported>  instructions    
    S0-C1   1 <not supported>  branches     
    S0-C1   1 <not supported>  branch-misses    

     19.004688019 seconds time elapsed 

Il montre même si simple commande sleep prend deux cœurs sur mon ordinateur et je ne peux pas l'expliquer. Je comprends que le planificateur de système d'exploitation peut réaffecter le cœur actif pour n'importe quel processus, mais dans ce cas, l'utilisation du processeur refléterait cela.

Quelqu'un peut-il expliquer cela?

Merci!

+0

L'option '-a' de perf-stat (http://man7.org/linux/man-pages/man1/perf-stat.1.html) concerne le profilage à l'échelle du système lorsque la commande est en cours d'exécution. Utilisez-le comme 'perf stat -a sleep 10' pour profiler le système pendant 10 secondes. Pour obtenir les statistiques de votre commande, n'utilisez pas l'option '-a' de perf stat:' perf stat python3 test.py'. – osgx

Répondre

1

Selon la page de l'homme de perf stat subocmmand, vous avez -a option de profil système complet: http://man7.org/linux/man-pages/man1/perf-stat.1.html

-a, --all-cpus 
     system-wide collection from all CPUs (default if no target is 
     specified) 

Dans ce mode "l'ensemble du système" perf stat (et perf record too) comptera des événements sur (ou profil pour record) tous les processeurs du système. Lorsqu'il est utilisé sans argument supplémentaire de command, perf s'exécutera jusqu'à ce qu'il soit interrompu par Ctrl-C. Avec l'argument de command, perf compte/profile jusqu'à ce que la commande fonctionne. L'utilisation typique est

perf stat -a sleep 10  # Profile counting every CPU for 10 seconds 
perf record -a sleep 10 # Profile with cycles every CPU for 10 seconds to perf.data 

Pour obtenir des statistiques de profilage de processus unique d'utilisation de commande unique (sans option -a)

perf stat python3 test.py 

Pour le profilage (perf record) vous pouvez exécuter sans option -a; ou vous pouvez utiliser -a et plus tard faire un filtrage manuel dans perf report, en se concentrant uniquement sur les pids/tids/dsos de votre application (Cela peut être très utile si commande à profile utilise des requêtes interprocess à d'autres démons pour faire beaucoup de travail CPU).

--per-core, -A, -C <cpulist>, --per-socket Les options sont uniquement pour le mode -a à l'échelle du système. Essayez --per-thread avec l'option -p pid attach to process.

+0

'perf stat --per-core python3 test.py' ne fonctionne pas pour moi en disant que les statistiques par cœur uniquement disponibles en mode système. Mon objectif initial était de vérifier la charge CPU par noyau pour certains processus, mais il semble que perf ne puisse pas le faire. – mdrndv