Perfilando un proceso (posiblemente enlazado a E / S) para reducir la latencia

Quiero mejorar el rendimiento de un método específico dentro de una aplicación más grande.

El objetivo es mejorar la latencia (tiempo de reloj de pared empleado en una función específica), no (necesariamente) la carga del sistema.

Requisitos:

Como espero que gran parte de la latencia se deba a la E / S, tenga en cuenta el tiempo de espera / bloqueo (en otras palabras: observe el tiempo del reloj de pared en lugar del tiempo de CPU)Como el programa hace mucho más que el fragmento que estoy tratando de optimizar. Debe haber una forma de iniciar / detener la creación de perfiles mediante programación, o filtrar la salida para mostrar solo el tiempo entre la entrada y la salida de la función que estoy optimizando.La creación de perfiles en el nivel de método es aceptable (si se puede hacer en el nivel de instrucción, incluso mejor. Si solo perfila las llamadas al sistema, probablemente no sea suficiente)Esto es para un proyecto de hobby, por lo que las herramientas caras no son realmente una opciónLa instrumentación (-funciones -finumento) es aceptableLa pieza crítica de código en la que estoy interesado es difícil de interrumpir manualmente (porque ya es relativamente rápido y difícil de invocar en forma realista), por lo que es necesario algún tipo de automatización.

Herramientas desechadas hasta el momento:

gprof, oprofile, callgrind (requisito 1)buiding algo personalizado usando getrusage (requisito 1)poormansprofiler.org (requisito 2)strace -T, dtrace,http://perf.wiki.kernel.org (requisitos 2 y 3)VTune, Zoom (requisito 4)muestreo manual de pila de llamadas (requisito 6)google-perftools (debería poder medir el tiempo de pared, pero esto no parece funcionar en mi caso, probablemente debido a la interferencia de SIGALRM).systemtap (mi kernel no está parcheado para incluir utrace)

Otras opciones que aún no he evaluado:

cprof (no se construye aquí fuera de la caja, parece solo para i386)insertar manualmente puntos de rastreo (por ejemplo, con lttng)

Me encantaría escuchar acerca de:

otras opciones¿Tal vez haya descartado alguna herramienta demasiado pronto?si las opciones que aún no he evaluado tienen posibilidades de funcionar y, en caso afirmativo, cómo hacerlo mejor.

Finalmente me conformé con:

construyendo algo personalizado usando -finstrument-functions yo mismo, basado enhttp://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

La traza producida por esta herramienta cruda es difícil de interpretar, y puedo imaginar fácilmente algunas herramientas para seguir procesando su salida, haciéndola infinitamente más útil. Sin embargo, esto hizo el trabajo por mí por ahora, así que estoy postergando ese proyecto hasta más tarde;).

Respuestas a la pregunta(3)

Su respuesta a la pregunta