J'utilise perf
depuis linux-2.6.36-gentoo-r4. Le /proc/sys/kernel/perf_event_paranoid
est défini sur 0, il ne devrait donc pas y avoir de problème à partir de là.
Étant donné que l'application de longue durée que je profile se bloque parfois pour une raison indéterminée (aucune information sur la raison de son arrêt de travail n'a pu être trouvée par moi), je me suis tourné vers le profilage à l'échelle du système avec des événements de performance.
L'application en question effectue des calculs numériques parallélisés, en utilisant MPI (Message Passing Interface) pour la communication. Avant de lancer l'application (avec mpirun
) J'ai commencé à enregistrer des données de profil à l'échelle du système sur one de nœuds avec lesquels il est exécuté :
$ perf record -o perf.all.cycles,graph.data -g -e cycles -a &
Après avoir réalisé que l'application s'est écrasée, j'ai tué le perf
tâche.
Il était parti
$ du -sh perf.all.cycles,graph.data
14G perf.all.cycles,graph.data
14 Go de données. Malheureusement perf report
ne prend pas en charge le -a
commutateur.
Comment puis-je analyser les données de profilage à l'échelle du système à partir de perf
? outil ?
Exécution simple du perf report
ne produit pas de sortie utile :
$ perf report -i perf.all.cycles,graph.data
#
# (For a higher level overview, try: perf report --sort comm,dso)
#
C'est l'ensemble de la sortie des données de profil de 14 Go…
Réponse acceptée :
Si vous distribuez les calculs avec MPI, l'utilisation d'un outil compatible MPI vous donnerait des résultats plus sensibles :avec une application distribuée, vous pourriez avoir des problèmes de déséquilibre de charge, où un processus MPI est inactif en attendant que les données proviennent d'autres processus. . S'il vous arrive de profiler exactement ce processus MPI, votre profil de performance sera complètement faux.
Ainsi, la première étape consiste généralement à connaître le modèle de communication et d'équilibrage de charge de votre programme et à identifier un exemple d'entrée qui vous donne la charge de travail souhaitée (par exemple, gourmand en CPU au rang 0). Par exemple, mpiP est un MPI outil de profilage qui peut produire un rapport très complet sur le modèle de communication, le temps pris par chaque appel MPI, etc.
Ensuite, vous pouvez exécuter un outil de profilage de code sur un ou plusieurs rangs MPI sélectionnés. Quoi qu'il en soit, en utilisant perf
sur un seul rang MPI n'est probablement pas une bonne idée car ses mesures contiendront également les performances du code de la bibliothèque MPI, ce qui n'est probablement pas ce que vous recherchez.