This shows you the differences between two versions of the page.
sde:laboratoare:10 [2019/04/16 12:27] iuliana.marin [TP - Profilage et débogage] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== TP 10 - Profilage et débogage ===== | ||
- | ===== Documents d'aide ===== | ||
- | |||
- | * [[http://elf.cs.pub.ro/so/res/laboratoare/lab07-slides.pdf | lab010-slides.pdf]] | ||
- | ===== Numéros de comparaison de latence ===== | ||
- | ^ Opération ^ Heure (ns) ^ Notes ^ | ||
- | | '' Référence de cache L1 '' | 0,5 ns | | | ||
- | | '' Prédiction de branche '' | 5 ns | | | ||
- | | '' Référence de cache L2 '' | 7 ns | 14x cache L1 | | ||
- | | '' Verrouillage / déverrouillage mutex '' | 25 ns | | | ||
- | | '' Référence de la mémoire principale ''| 100 ns | Cache 20x L2, cache 200x L1 | | ||
- | | '' Compresser 1K octets avec Zippy '' | 3000 ns | | | ||
- | | '' Envoyer 1K octets sur un réseau de 1 Gbps '' | 10 000 ns | 0,01 ms | | ||
- | | '' Lire 4K au hasard à partir du SSD * '' | 150 000 ns | 0,15 ms | | ||
- | | '' Lecture séquentielle de 1 Mo de la mémoire ''| 250 000 ns | 0,25 ms | | ||
- | | '' Aller-retour dans le même centre de données '' | 500 000 ns | 0,5 ms | | ||
- | | '' Lire 1 Mo séquentiellement à partir du SSD * '' | 1.000.000 ns | 1 ms, 4x mémoire | | ||
- | | '' Recherche de disque '' | 10.000.000 ns | 10 ms, 20 fois le centre de données aller-retour | | ||
- | | '' Lecture séquentielle de 1 Mo sur le disque '' | 20 000 000 ns | 20 ms, 80x mémoire, 20x SSD | | ||
- | | '' Envoyer un paquet Caracal - NY - Caracal '' | 150 000 000 ns | 150 ms | | ||
- | ===== Liens vers des sections utiles ===== | ||
- | |||
- | ==== Linux ==== | ||
- | * [[#techniques_de_génération_de_profil_et_de_profilage | Techniques de génération de profil et de profilage]] | ||
- | * [[#outils_de_profilage | Outils de profilage]] | ||
- | * [[#usage_perfect | Usage perfect]] | ||
- | * [[#outils_de_débogage | Outils de débogage]] | ||
- | |||
- | |||
- | ===== Techniques de génération de profil et de profilage ===== | ||
- | Un ** profileur ** est un ** ** outil d'analyse des performances qui aide le programmeur à déterminer les points critiques ** de goulot d'étranglement d'un programme. Ceci est fait en examinant le comportement du programme, en évaluant la consommation de mémoire et la relation entre ses modules. | ||
- | |||
- | Le titulaire du profil est disponible à l'adresse suivante: | ||
- | |||
- | *** bibliothèque C ++ (GNU libc), grâce aux informations sur la durée de vie de la mémoire, | ||
- | *** compilateur ** en modifiant le code dans peut être facilement fait dans le processus de compilation, le compilateur étant celui qui insère les sections de code nécessaires, | ||
- | *** noyau ** du système d'exploitation, en fournissant des appels système spécifiques, | ||
- | *** matériel **, certains processeurs sont équipés de compteurs de minuterie ([[http://en.wikipedia.org/wiki/Time_Stamp_Counter | Compteur d'horodatage - TSC]]) ou de compteurs de performances qui comptent des événements tels que des cycles manque de processeur ou de TLB. | ||
- | |||
- | Les deux manières de profiler sont les suivantes: | ||
- | ==== Instrumentation technique ==== | ||
- | Les profils basés sur cette technique nécessitent généralement ** changements ** dans le code du programme: insérez des sections de code au début et à la fin de la fonction que vous souhaitez analyser. De plus, les fonctions appelées sont conservées. Ainsi, il est possible d'estimer le temps total de l'appel lui-même et des appels de la sous-fonction. L’inconvénient majeur de ces profils est lié à la modification du code: dans les fonctions d’appel faibles et souvent appelées, cette surcharge peut entraîner une mauvaise interprétation des résultats. | ||
- | ==== Technique d'échantillonnage ==== | ||
- | Les profileurs basés sur l'échantillonnage ** ne changent pas ** dans le code du programme, mais vérifient périodiquement le processeur pour déterminer quelle fonction (instruction) est en cours d'exécution. Ensuite, il estime la fréquence et le temps d'exécution d'une fonction particulière sur une période donnée. | ||
- | ==== Outils de profilage ==== | ||
- | Vous trouverez ci-dessous quelques outils utilisés pour le profilage. | ||
- | ==== ==== PerfCounters | ||
- | La plupart des processeurs modernes offrent des "compteurs de performance" qui comptent différents types d’événements matériels: instructions exécutées, erreurs de cache, instructions manquées ou manquées, sans affecter les performances du noyau ou des applications. Ces registres peuvent déclencher des interruptions lorsqu'un certain nombre d'événements s'accumulent et peuvent donc être utilisés pour analyser le code exécuté sur le processeur en question. | ||
- | |||
- | La sous-catégorie '' perfcounters '': | ||
- | * est dans le noyau Linux commençant par [[http://lwn.net/Articles/339361/|2.6.31]] ('' CONFIG_PERF_COUNTERS = y '') | ||
- | * est le remplacement de '' oprofile '' | ||
- | * Supports: | ||
- | * '' événements matériels '' (instructions, accès en cache, cycles de bus). | ||
- | * '' événements logiciels '' (erreur de page, cpu-clock, migrations de cpu). | ||
- | * '' tracespoints '' (par exemple, sys_enter_open, sys_exit_open). | ||
- | |||
- | ==== perf==== | ||
- | L'utilitaire 'perf' est l'interface du sous-système 'perfcounters' avec l'utilisateur. Il fournit une ligne de commande similaire à "git" et ne nécessite pas l'existence d'un démon. | ||
- | |||
- | Un tutoriel sur la performance que vous trouverez [[https://perf.wiki.kernel.org/index.php/Tutorial|aici]]. | ||
- | ==== Usage perfect ==== | ||
- | <code bash> | ||
- | $ perf [--version] [--help] COMMAND [ARGS] | ||
- | </code> | ||
- | |||
- | Les '' commandes '' les plus utilisées sont: | ||
- | * '' annotate '' - Lisez '' perf.data '' et affichez le code avec des annotations | ||
- | * '' list '' - Liste les noms symboliques de tous les types d'événements pouvant être suivis par '' perf '' | ||
- | * '' verrouiller '' - Analyse les événements de verrouillage | ||
- | * '' record '' - Exécute une commande et enregistre les informations de profilage dans le fichier perf.data | ||
- | * '' report '' - Lit perf.data (créé par perf record) et affiche le profil | ||
- | * 'sched' '- Outil de mesure des propriétés du planificateur (latences) | ||
- | * '' state '' - Exécute une commande et affiche les statistiques postées par le sous-système des compteurs de performance | ||
- | * '' top '' - Génère et affiche des informations en temps réel sur le téléchargement d'un système | ||
- | ==== perf list ==== | ||
- | [[http://manpages.ubuntu.com/manpages/natty/man1/perf-list.1.html | homme perf-list]] | ||
- | |||
- | Affiche les noms symboliques de tous les types d'événements pouvant être suivis par '' perf ''. | ||
- | <code bash> | ||
- | $ perf list | ||
- | List of pre-defined events (to be used in -e): | ||
- | |||
- | cpu-cycles OR cycles [Hardware event] | ||
- | instructions [Hardware event] | ||
- | |||
- | cpu-clock [Software event] | ||
- | page-faults OR faults [Software event] | ||
- | |||
- | L1-dcache-loads [Hardware cache event] | ||
- | L1-dcache-load-misses [Hardware cache event] | ||
- | |||
- | rNNN [Raw hardware event descriptor] | ||
- | |||
- | mem:<addr>[:access] [Hardware breakpoint] | ||
- | |||
- | syscalls:sys_enter_accept [Tracepoint event] | ||
- | syscalls:sys_exit_accept | ||
- | </code> | ||
- | Lorsqu'un événement n'est pas disponible sous forme symbolique, il peut être utilisé avec perf sous la forme du processeur dans le système en cours d'analyse. | ||
- | ==== perf stat ==== | ||
- | [[http://manpages.ubuntu.com/manpages/lucid/man1/perf-stat.1.html | perf-état]] | ||
- | Exécutez une commande et affichez les statistiques publiées par le sous-système des compteurs de performance. | ||
- | <code bash> | ||
- | $ perf stat ls -R /usr/src/linux | ||
- | Performance counter stats for 'ls -R /usr/src/linux': | ||
- | |||
- | 934.512846 task-clock-msecs # 0.114 CPUs | ||
- | 1695 context-switches # 0.002 M/sec | ||
- | 163 CPU-migrations # 0.000 M/sec | ||
- | 306 page-faults # 0.000 M/sec | ||
- | 725144010 cycles # 775.959 M/sec | ||
- | 419392509 instructions # 0.578 IPC | ||
- | 80242637 branches # 85.866 M/sec | ||
- | 5680112 branch-misses # 7.079 % | ||
- | 174667968 cache-references # 186.908 M/sec | ||
- | 4178882 cache-misses # 4.472 M/sec | ||
- | |||
- | 8.199187316 seconds time elapsed | ||
- | </code> | ||
- | "perf stat" offre la possibilité de collecter des données en exécutant plusieurs fois un programme en spécifiant l'option "-r". | ||
- | <code bash> | ||
- | $ perf stat -r 6 sleep 1 | ||
- | Performance counter stats for 'sleep 1' (6 runs): | ||
- | |||
- | 1.757147 task-clock-msecs # 0.002 CPUs ( +- 3.000% ) | ||
- | 1 context-switches # 0.001 M/sec ( +- 14.286% ) | ||
- | 0 CPU-migrations # 0.000 M/sec ( +- 100.000% ) | ||
- | 144 page-faults # 0.082 M/sec ( +- 0.147% ) | ||
- | 1373254 cycles # 781.525 M/sec ( +- 2.856% ) | ||
- | 588831 instructions # 0.429 IPC ( +- 0.667% ) | ||
- | 106846 branches # 60.806 M/sec ( +- 0.324% ) | ||
- | 11312 branch-misses # 10.587 % ( +- 0.851% ) | ||
- | 1.002619407 seconds time elapsed ( +- 0.012% ) | ||
- | </code> | ||
- | Notez les événements les plus importants énumérés ci-dessus. | ||
- | ==== perf top ==== | ||
- | [[http://manpages.ubuntu.com/manpages/natty/man1/perf-top.1.html | man perf-top]] | ||
- | Génère et affiche des informations en temps réel sur le téléchargement d'un système. | ||
- | <code bash> | ||
- | $ ls -R /home | ||
- | $ perf top -p $(pidof ls) | ||
- | -------------------------------------------------------------- | ||
- | PerfTop: 181 irqs/sec kernel:72.4% (target_pid: 10421) | ||
- | -------------------------------------------------------------- | ||
- | samples pcnt function DSO | ||
- | _______ _____ ____________________ ___________________ | ||
- | |||
- | 270.00 15.8% __d_lookup [kernel.kallsyms] | ||
- | 145.00 8.5% __GI___strcoll_l /lib/libc-2.12.1.so | ||
- | 99.00 5.8% link_path_walk [kernel.kallsyms] | ||
- | 97.00 5.7% find_inode_fast [kernel.kallsyms] | ||
- | 91.00 5.3% __GI_strncmp /lib/libc-2.12.1.so | ||
- | 55.00 3.2% move_freepages_block [kernel.kallsyms] | ||
- | 44.00 2.6% ext3_dx_find_entry [kernel.kallsyms] | ||
- | 41.00 2.4% ext3_find_entry [kernel.kallsyms] | ||
- | 40.00 2.3% dput [kernel.kallsyms] | ||
- | 39.00 2.3% ext3_check_dir_entry [kernel.kallsyms] | ||
- | </code> | ||
- | |||
- | Nous notons que les fonctions de gestion de fichiers (défilement, recherche) sont celles qui apparaissent le plus souvent dans la sortie parfaite de la commande de liste récursive du répertoire de base. | ||
- | ==== perf record ==== | ||
- | [[http://manpages.ubuntu.com/manpages/natty/man1/perf-record.1.html | record homme]] | ||
- | Exécute une commande et enregistre les informations de profilage dans le fichier '' perf.data ''. | ||
- | <code bash> | ||
- | $ perf record wget http://elf.cs.pub.ro/so/wiki/laboratoare/laborator-07 | ||
- | |||
- | [ perf record: Woken up 1 times to write data ] | ||
- | [ perf record: Captured and wrote 0.008 MB perf.data (~334 samples) ] | ||
- | |||
- | $ ls | ||
- | laborator-07 perf.data | ||
- | </code> | ||
- | ====perf report==== | ||
- | [[http://manpages.ubuntu.com/manpages/natty/man1/perf-report.1.html | man perf-report]] | ||
- | Interprète les données sauvegardées dans '' perf.data '' après analyse à l'aide de '' perf record ''. Ainsi pour l'exemple wget ci-dessus, nous avons: | ||
- | <code bash> | ||
- | $ perf report | ||
- | # Events: 13 cycles | ||
- | # | ||
- | # Overhead Command Shared Object Symbol | ||
- | # ........ ....... ................. ...... | ||
- | # | ||
- | 86.43% wget e8ee21 [.] 0x00000000e8ee21 | ||
- | 11.03% wget [kernel.kallsyms] [k] prep_new_page | ||
- | 2.37% wget [kernel.kallsyms] [k] sock_aio_read | ||
- | 0.11% wget [kernel.kallsyms] [k] perf_event_comm | ||
- | 0.05% wget [kernel.kallsyms] [k] native_write_msr_safe | ||
- | </code> | ||
- | ==== Outils de débogage ==== | ||
- | ==== strace ==== | ||
- | ''strace'' intercepte et enregistre les appels système effectués par un processus et les signaux qu'il reçoit. Dans la forme la plus simple, strace exécute la commande spécifiée jusqu'à la fin du processus associé. | ||
- | <code bash> | ||
- | $strace cat /proc/cpuinfo | ||
- | execve("/bin/cat", ["cat", "/proc/cpuinfo"], [/* 30 vars */]) = 0 | ||
- | open("/proc/cpuinfo", O_RDONLY) = 3 | ||
- | read(3, "processor\t: 0\nvendor_id\t: Genuin"..., 32768) = 3652 | ||
- | write(1, "processor\t: 0$\nvendor_id\t: Genui"..., 7512) = 7512 | ||
- | </code> | ||
- | |||
- | Les options les plus courantes pour strace sont: | ||
- | * '' - f '', cette option sera suivie et les processus enfants créés par le processus actuel | ||
- | * '' -o fichier '', par défaut, strace affiche les informations sur stderr. Avec cette option, la sortie sera placée dans le fichier de nom de fichier. | ||
- | * '' -p pid '', pid du processus de suivi. | ||
- | * '' - e expression '', modifie les appels que vous recherchez. | ||
- | <code bash> | ||
- | iuliana@debian$ strace -f -e connect,socket,bind -p $(pidof iceweasel) | ||
- | Process 6429 attached with 30 threads - interrupt to quit | ||
- | socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 50 | ||
- | connect(50, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("141.85.227.65")}, 16) = -1 EINPROGRESS | ||
- | |||
- | </code> | ||
- | Un autre utilitaire lié à strace est [[http://linux.die.net/man/1/ltrace | ltrace]]. Il suit les appels de la bibliothèque. | ||
- | ==== gdb ==== | ||
- | Le but d'un débogueur (par exemple, GDB, via la commande gdb) est de nous permettre d'inspecter ce qui se passe dans un programme en cours d'exécution ou à la fin de celui-ci lorsqu'une erreur fatale s'est produite sur la base du fichier coredump créé. par lui. | ||
- | |||
- | |||
- | ==== Valgrind==== | ||
- | Valgrind est une suite d’utilitaires utilisés pour le débogage et le profilage. Parmi les outils ou outils les plus utilisés dans cette suite, citons: | ||
- | * '' memcheck '' - Effectue une analyse d'utilisation de la mémoire | ||
- | * '' cachegrind '' - Effectue une analyse des performances du cache | ||
- | * '' helgrind '' - Utilisé pour résoudre les conditions d'exécution multithread. | ||
- | |||
- | ==== Autres vans ==== | ||
- | |||
- | {{ so:laboratoare:tools.png | Alte utilitare}} | ||
- | |||
- | |||
- | * [[http://oprofile.sourceforge.net/download|Oprofile]] | ||
- | *[[http://www.microsoft.com/downloads/details.aspx?familyid=d6e95259-8d9d-4c22-89c4-fad382eddcd1&displaylang=en | Kernrate]] este un echivalent al oprofile pentru Windows. | ||
- | * [[http://kcachegrind.sourceforge.net/html/Home.html | KCachegrind]] | ||
- | * [[http://code.google.com/p/google-perftools/|perf-tools]] | ||
- | * [[http://metadataconsulting.blogspot.com/2017/05/How-to-install-and-use-Windows-Performance-Toolkit.html | XPerf]] | ||
- | *[[http://sourceware.org/binutils/docs/gprof | GNU gprof]] | ||
- | |||
- | |||
- | |||
- | |||