Comment profiler une application C ++ multithread sous Linux?

Je faisais tout mon profilage Linux avec gprof .

Cependant, avec mon application multithread, sa sortie semble être incohérente.

Maintenant, j’ai creusé ceci:

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

Cependant, il y a 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 facilement utiliser gprof pour profiler des applications Linux C ++ multithreads? ( Ubuntu 9.10 ) 2) Quels autres outils devrais-je rechercher pour le profilage?

Edit: ajout d’une autre réponse sur le profileur de pauvre homme, dont IMHO est mieux pour les applications multithread.

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

Un Paul R a dit, regardez Zoom. Vous pouvez également utiliser lsstack , une approche peu technique mais étonnamment efficace par rapport à gprof .

Ajouté: Puisque vous avez précisé que vous exécutiez OpenGL à 33ms, 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. Il suffit de le faire fonctionner avec une charge de travail typique ou problématique, et de l’arrêter, manuellement, dans ses traces, et de voir ce qu’il fait et pourquoi. Faites cela plusieurs fois. Maintenant, si elle ne se comporte que de temps en temps , vous ne voudriez l’arrêter que pendant qu’il se comporte mal. Ce n’est pas facile, mais j’ai utilisé un ensemble d’interruptions de réveil pour le bon délai. Par exemple, si une image sur 100 prend plus de 33 ms, au début d’une image, réglez la timer sur 35 ms et à la fin d’une image, désactivez-la. De cette façon, il ne sera interrompu que lorsque le code prend trop de temps, et cela vous montrera pourquoi. Bien sûr, un seul échantillon peut manquer le code de culpabilité, mais 20 échantillons ne le manqueront pas.

Jetez un oeil à Valgrind .

Regardez Zoom .

Jetez un coup d’oeil au profileur du pauvre homme . Étonnamment, il existe peu d’autres outils pour les applications multithread qui font à la fois le profilage de CPU et le profilage de contention mutex, et PMP les deux, sans même avoir besoin d’installer quoi que ce soit (tant que vous avez gdb).

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 

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

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

Si l’application s’exécute sur un système dédié, vous devez également mesurer le processeur, la mémoire, les E / S, etc. pour profiler le système global.

Étant donné que vous n’avez pas mentionné le non commercial, puis-je suggérer 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).

Microprofile est une autre réponse possible à cela. Il nécessite une instrumentation manuelle du code, mais il semble qu’il gère assez bien le code multithread.

En mettant une touche légèrement différente sur les choses, vous pouvez réellement avoir une assez bonne idée de ce qui se passe dans une application multithread en utilisant ftrace et kernelshark. En rassemblant la bonne trace et en appuyant sur les bons boutons, vous pouvez voir la programmation de chaque thread.

Selon le kernel de votre dissortingbution, vous devrez peut-être créer un kernel avec la bonne configuration (mais je pense que beaucoup d’entre eux l’ont fait de nos jours).