2010-03-15 10 views
12

versión corta basada en:Linux muestra el tiempo de perfiles

¿Hay un buen perfilador de muestreo basado en el tiempo para Linux?

versión larga:

Yo generalmente uso OProfile para optimizar mis aplicaciones. Recientemente encontré una deficiencia que me tiene preguntando.

El problema era un ciclo cerrado, desove C++ filt para exigir un nombre de C++. Solo me encontré con el código accidentalmente mientras buscaba otro cuello de botella. El OProfile no mostró nada inusual sobre el código, así que casi lo ignoré, pero mi sentido del código me indicó que optimice la llamada y vea qué sucedió. Cambié el popen de C++ filt a abi::__cxa_demangle. El tiempo de ejecución pasó de más de un minuto a un poco más de un segundo. Aproximadamente una velocidad de x60.

¿Hay alguna manera en que podría haber configurado OProfile para marcar la llamada popen? Como los datos del perfil se encuentran ahora OProfile cree que el cuello de la botella fue el montón y std::string llamadas (que BTW una vez optimizado redujo el tiempo de ejecución a menos de un segundo, más de x2 de velocidad).

Aquí está mi configuración Oprofile:

$ sudo opcontrol --status 
Daemon not running 
Event 0: CPU_CLK_UNHALTED:90000:0:1:1 
Separate options: library 
vmlinux file: none 
Image filter: /path/to/executable 
Call-graph depth: 7 
Buffer size: 65536 

¿Hay otro perfilador para Linux que podría haber encontrado el cuello de botella?

Sospecho que el problema es que OProfile solo registra sus muestras en el proceso en ejecución. Me gustaría que siempre registre sus muestras en el proceso que estoy perfilando. Entonces, si el proceso está actualmente desactivado (bloqueo en IO o una llamada popen) OProfile simplemente colocaría su muestra en la llamada bloqueada.

Si no puedo solucionar esto, OProfile solo será útil cuando el ejecutable esté cerca del 100% de la CPU. No puede ayudar con ejecutables que tienen llamadas de bloqueo ineficientes.

Respuesta

6

Me alegro de que haya preguntado. Creo que se puede hacer que OProfile haga lo que yo considero correcto, que es tomar muestras de la pila en el reloj de pared con el tiempo cuando el programa está siendo lento y, si no le permite examinar muestras individuales de la pila, al menos Haga un resumen de cada línea de código que aparece en las muestras, el porcentaje de muestras en las que aparece la línea. Esa es una medida directa de lo que se ahorraría si esa línea no estuviera allí. Here's one discussion.Here's another, y another. Y, como dijo Paul, Zoom debería hacerlo.

Si su tiempo pasó de 60 segundos a 1 segundo, eso implica que cada muestra de pila tendría una probabilidad 59/60 de mostrarle el problema.

+1

Mike, su punto es muy válido, acepto la técnica con 100%. ¿Alguna idea sobre cómo habilitar el muestreo basado en el tiempo a través de OProfile o en un enfoque más automatizado que simplemente introducir el depurador? –

+0

@Caspin: estoy en Windows, y no soy usuario de OProfile, pero este enlace (http://oprofile.sourceforge.net/doc/opreport.html) habla sobre su uso y presentación de datos de muestra de pila . También este enlace (http://oprofile.sourceforge.net/doc/detailed-parameters.html#timer) habla sobre interrupciones de temporizador. No puedo decir si tomará muestras durante E/S u otras llamadas de bloqueo. –

+0

... tenga en cuenta que la frecuencia de muestreo no necesita ser rápida, pero debe poder muestrear durante el bloqueo de llamadas a menos que desee permanecer ciego. –

3

Probar Zoom - Creo que le permitirá perfilar todos los procesos - sería interesante saber si en este caso resalta su problema.

+0

La versión de zoom 1.6.6 tampoco encuentra el problema. La próxima versión de Zoom supuestamente tendrá un modo de muestreo (* "perfilado de tiempo de subproceso" *) que podría encontrar el problema. –

1

hackeado rápidamente hasta perfilador de muestreo trivial para Linux: http://vi-server.org/vi/simple_sampling_profiler.html

anexa backtrace(3) a un archivo en SIGUSR1, y luego se convierte en fuente anotada.

+0

Eche un vistazo a lsstack está implementado. No necesita un código de controlador especial para obtener la traza inversa actual. También ponga su código en bitbucket o google code. Si obtienes un proyecto decentemente hecho, contribuiré con correcciones de errores cuando lo use. –

+0

@caspin, OK, ahora estoy buscando cómo hacer uso de gdb (http://stackoverflow.com/questions/3999464/how-to-make-gdb-get-stacktrace-repeatably) para hacer lo mismo. –

+0

Probé tu código, pero se cuelga, porque estás utilizando fopen desde un manejador de señal, que se sabe cuelga (puedes usar muy pocas funciones desde un controlador de señal). –

Cuestiones relacionadas