web-dev-qa-db-fra.com

Comment profiler une application multi-thread C++ sous Linux?

J'avais l'habitude de faire tout mon profilage Linux avec gprof .

Cependant, avec mon application multi-thread, sa sortie semble être incohérente.

Maintenant, j'ai déterré ceci:

http://sam.zoy.org/writings/programming/gprof.html

Cependant, cela remonte à longtemps et dans ma sortie gprof, il semble que mon gprof répertorie les fonctions utilisées par les threads non principaux.

Donc, mes questions sont:

1) En 2010, puis-je utiliser facilement gprof pour profiler des applications Linux C++ multithreads? ( Ubuntu 9.10 ) 2) Quels autres outils devrais-je étudier pour le profilage?

40
anon

Edit: a ajouté un autre answer au profileur de cet homme pauvre, lequel IMHO est meilleur pour les applications multithreads.

Regardez oprofile . La charge de profilage de cet outil est négligeable et il prend en charge les applications multithreadées - tant que vous ne souhaitez pas profiler les conflits de mutex (ce qui est une partie très importante du profilage d'applications multithreadées).

11
Laurynas Biveinis

Regardez le profileur du pauvre homme . Étonnamment, il existe peu d'autres outils permettant aux applications multithread d'effectuer à la fois le profilage de processeur et le profilage de conflit mutex, et PMP faisant les deux, sans même installer quoi que ce soit (tant que vous avez gdb).

6
Laurynas Biveinis

Un Paul R a dit, regardez Zoom. Vous pouvez également utiliser lsstack, qui est une approche peu technique mais d’une efficacité surprenante, par rapport à gprof .

Ajoutée: Puisque vous avez précisé que vous exécutez OpenGL à 33 ms, ma recommandation précédente est valable. De plus, ce que j'ai personnellement fait dans de telles situations est à la fois efficace et non intuitif. Faites-le simplement fonctionner avec une charge de travail typique ou problématique, arrêtez-le simplement, manuellement, et voyez ce qu'il fait et pourquoi. Faites ceci plusieurs fois… .. Maintenant, si seulement occasionnellement se comporte mal, vous voudriez l'arrêter seulement tant qu'il se comportera mal. Ce n’est pas facile, mais j’ai utilisé un système d’interruption réveil pour le bon délai. Par exemple, si une image sur 100 prend plus de 33 ms, réglez la minuterie sur 35 ms au début d'une image et désactivez-la à la fin d'une image. De cette façon, il n'interrompra que lorsque le code prendra trop de temps et vous montrera pourquoi. Bien sûr, un échantillon peut manquer le code de culpabilité, mais 20 échantillons ne le manqueront pas.

6
Mike Dunlavey

Regardez Zoom .

5
Paul R

Regardez Valgrind .

5
stefanB

Essayez l'outil de profilage linux moderne, le perf (perf_events): https://perf.wiki.kernel.org/index.php/Tutorial et http://www.brendangregg.com/perf.html :

perf record ./application
# generates profile file perf.data
perf report
3
osgx

En prenant une tournure légèrement différente, vous pouvez vraiment avoir une assez bonne idée de ce qui se passe dans une application multithread utilisant ftrace et kernelshark. En collectant le bon tracé et en appuyant sur les bons boutons, vous pourrez voir la planification des threads individuels.

En fonction du noyau de votre distribution, vous devrez peut-être construire un noyau avec la bonne configuration (mais je pense que beaucoup d'entre eux l'ont intégré de nos jours).

0
bazza

Puisque vous n'avez pas mentionné non commercial, permettez-moi de suggérer le VTune d'Intel. Ce n'est pas gratuit, mais le niveau de détail est très impressionnant (et les frais généraux sont négligeables).

0
rustyx

Vous pouvez exécuter aléatoirement pstack pour trouver la pile à un moment donné. Par exemple. 10 ou 20 fois ... La pile la plus typique est celle où l'application passe le plus de temps (selon l'expérience, on peut supposer une distribution de Pareto).

Vous pouvez combiner ces connaissances avec strace ou truss (Solaris) pour suivre les appels système et avec pmap pour l’impression en mémoire.

Si l'application s'exécute sur un système dédié, vous devez également sar pour mesurer le processeur, la mémoire, les entrées/sorties, etc., afin de profiler l'ensemble du système.

Microprofile est une autre réponse possible à cette question. Cela nécessite une instrumentation manuelle du code, mais il semble qu'il gère assez bien le code multi-thread. Et il dispose également de points d'ancrage spéciaux pour le profilage de pipelines graphiques, notamment de ce qui se passe à l'intérieur de la carte.

0
Omnifarious