12
votes

Profileur basé sur l'échantillon de temps Linux

Version courte:

Y a-t-il un bon profil d'échantillonnage basé sur le temps pour Linux?

Version longue:

J'utilise généralement OPROFILE pour optimiser mes applications. J'ai récemment trouvé une lacune qui me fait me demander.

Le problème était une boucle serrée, frai C ++ Filt pour démangeiser un nom C ++. Je ne suis tombé que sur le code par accident tout en poursuivant un autre goulot d'étranglement. L'OPROFILE n'a montré rien d'inhabituel sur le code, donc je l'ai presque ignoré, mais mon code de code m'a dit d'optimiser l'appel et de voir ce qui s'est passé. J'ai changé le popen de C ++ FILT vers ABI :: __ CXA_Demanglet . Le temps d'exécution est passé de plus d'une minute à un peu plus d'une seconde. Environ une vitesse de x60.

Y a-t-il une façon d'avoir configuré Oprofile pour signaler l'appel popen ? Les appels de la bouteille et std :: string (que BTW une fois optimisé a chuté le temps d'exécution à moins d'une seconde, plus de x2 vitesse supérieure).

Voici ma configuration oprofile: xxx

existe un autre profileur pour Linux qui aurait pu trouver le goulot d'étranglement?

Je soupçonne le problème Est-ce que OPROFILE ne transmet que ses échantillons au processus en cours d'exécution. J'aimerais toujours enregistrer ses échantillons au processus que je profilets. Donc, si le processus est actuellement éteint (blocage sur IO ou A popen appel) OPROFILE ferait simplement son échantillon à l'appel bloqué.

Si je ne peux pas résoudre ce problème, OPROFILE ne sera utile que lorsque l'exécutable pousse près de 100% de processeur. Il ne peut pas aider avec les exécutables qui ont des appels de blocage inefficaces.


0 commentaires

5 Réponses :


6
votes

Heureux que vous ayez demandé. Je crois que l'oprofile peut être faite pour faire ce que je considère la bonne chose, qui est de prendre des échantillons de pile sur l'heure murale lorsque le programme est lent et, s'il ne vous laissera pas examiner individuellement Des échantillons de pile, au moins résumés pour chaque ligne de code qui apparaît sur des échantillons, le pourcentage d'échantillons de la ligne apparaît sur. C'est une mesure directe de ce qui serait sauvé si cette ligne n'était pas là. Voici une discussion. Voici un autre, et Un autre . Et, comme l'a dit Paul, Zoom devrait le faire.

Si votre temps est passé de 60 secondes à 1 seconde, cela implique que chaque échantillon de pile aurait eu une probabilité de 59/60 de vous montrer le problème.


4 commentaires

Mike, votre point est très valable, je suis d'accord sur la technique avec 100%. Des idées sur la manière d'activer l'échantillonnage de temps via OPROFILE ou dans une approche plus automatisée que de simplement briser le débogueur?


@Caspin: Je suis sur Windows, et je ne suis pas un utilisateur d'oprofile, mais ce lien ( oprofile.sourceforge.net/doc/opreport.html ) parle de son utilisation et de sa présentation de données d'échantillons de pile. Aussi ce lien ( OPROFILE.SOURCEFORGE.net/doc/detailed-Parameters.html# TIMER ) Parle des interruptions de la minuterie. Je ne peux pas dire si cela prendra des échantillons lors d'E / S ou d'autres appels de blocage.


Notez que la fréquence de l'échantillonnage n'a pas besoin d'être rapide, mais elle doit pouvoir échantillonner pendant le blocage des appels, à moins que vous ne souhaitiez être aveugle à ceux-ci.


... J'ai oublié de mentionner, lstetack est un moyen facile d'obtenir des échantillons de pile manuellement, de même que Pacetact (mais sans symboles).



3
votes

essayez Zoom - Je crois que cela vous permettra de profiler tous les processus - il serait intéressant de savoir s'il met en évidence votre problème dans ce cas.


1 commentaires

Zoom version 1.6.6 ne trouve pas le problème non plus. La prochaine version de Zoom aura un mode d'échantillonnage ( "Profilage de temps de thread" ) qui pourrait trouver le problème.



1
votes

Rapidement piraté le profileur d'échantillonnage trivial pour Linux: http://vi-server.org/vi /Simple_sampling_profiler.html

Il ajoute BackTrace (3) à un fichier sur sigusr1 , puis la convertit en source annotée.


4 commentaires

Jetez un coup d'œil sur Lstetack est mis en œuvre. Il n'a pas besoin de code de pilote spécial d'obtenir le backtrage actuel. Mettez également votre code sur Bitbucket ou Google Code. Si vous obtenez un projet décemment fait, je contribuerai aux corrections de bugs lorsque je l'utilise.


@caspin, ok, maintenant je cherche comment utiliser gdb ( Stackoverflow.com/questions/3999464/... ) Pour faire la même chose.


J'ai essayé votre code, mais il est suspendu, car vous utilisez Fopen à partir d'un gestionnaire de signal, qui est connu pour accrocher (vous ne pouvez utiliser que très peu de fonctions à partir d'un gestionnaire de signal).


Devrait-il fonctionner de manière fiable avec de bas niveau "ouverte / écriture / fermeture" au lieu de fopen?



2
votes

J'ai écrit cela il y a longtemps, seulement parce que je n'ai rien trouvé de mieux: https: // github. com / dicej / profil

Je viens de trouver cela aussi, même si je ne l'ai pas essayé: https://github.com / Oliver / PTrace-Sampler


0 commentaires

1
votes

Après avoir essayé tout suggéré ici (à l'exception du zoom maintenant de défunt, qui est toujours disponible en tant que fichier énorme de Dropbox), j'ai constaté que rien ne veut que M. Dunlavey recommande. Les «hacks rapides» énumérés ci-dessus dans certaines des réponses ne construiraient pas pour moi ou ne fonctionnaient pas pour moi non plus. Passé toute la journée à essayer des trucs ... et rien ne pouvait trouver Fsek comme un hotspot dans un programme de test par ailleurs simple qui était I / O lié.

J'ai donc codé un autre profileur, cette fois-ci sans dépendances de construction, basée sur GDB, il convient donc de "travailler" pour presque tout code de débisibilité. Un seul fichier CPP.

https://github.com/jasonrohrer/wallclockprofiler

Il automatise le processus manuel suggéré par M. Dunlavey, interrompant le processus cible avec GDB de manière périodique et récoltant une trace de pile, puis imprimant un rapport à la fin de quelles traces de pile sont les plus courantes. Ce sont vos vrais points chauds muraux. Et cela fonctionne réellement.


0 commentaires