El cuento de un hacker
La fecha es 12/02/10. Los días antes de Navidad están goteando y he llegado a un obstáculo importante como programador de Windows. He estado usando AQTime, he probado soñoliento, brillante y con mucho sueño, y mientras hablamos, VTune se está instalando. Intenté usar el perfilador VS2008, y ha sido muy positivo y a menudo insensible. He usado la técnica de pausa aleatoria. He examinado los call-trees. He disparado rastros de funciones. Pero el hecho triste y doloroso del asunto es que la aplicación con la que estoy trabajando tiene más de un millón de líneas de código, con probablemente otro millón de líneas de aplicaciones de terceros.
Necesito mejores herramientas He leído los otros temas. He probado cada perfilador enumerado en cada tema. Simplemente tiene que haber algo mejor que estas opciones chatarra y costosa, o cantidades ridículas de trabajo para casi ninguna ganancia. Para complicar aún más las cosas, nuestro código está muy enhebrado y ejecuta una serie de bucles Qt Event, algunos de los cuales son tan frágiles que se bloquean bajo una fuerte instrumentación debido a retrasos en el tiempo. No me preguntes por qué estamos ejecutando múltiples bucles de eventos. Nadie me lo puede decir.
¿Hay alguna opción más similar a Valgrind en un entorno Windows?
¿Hay algo mejor que la larga franja de herramientas rotas que ya he probado?
¿Hay algo diseñado para integrarse con Qt, tal vez con una visualización útil de eventos en cola?
Una lista completa de las herramientas que probé, con las que fueron realmente útiles en cursiva:
- AQTime: ¡ Bastante bueno! Tiene algunos problemas con la recursividad profunda, pero el gráfico de llamadas es correcto en estos casos y puede usarse para aclarar cualquier confusión que pueda tener. No es una herramienta perfecta, pero vale la pena probarla. Puede satisfacer sus necesidades, y ciertamente fue lo suficientemente bueno para mí la mayor parte del tiempo.
- Ataque de pausa aleatoria en modo de depuración: no hay suficiente información del tiempo.
Una buena herramienta pero no una solución completa. - Estudios paralelos: la opción nuclear. Obstinado, extraño y locamente poderoso. Creo que deberías comenzar la evaluación de 30 días y averiguar si es una buena opción. También es genial.
- Codeanalyst de AMD: maravilloso, fácil de usar, muy propenso a los choques, pero creo que eso es algo medioambiental. Recomiendo probarlo, ya que es gratis.
- Luke Stackwalker: Funciona bien en proyectos pequeños, está tratando de hacer que funcione en los nuestros. Sin embargo, algunos buenos resultados, y definitivamente reemplaza a Sleepy para mis tareas personales.
- PurifyPlus: no es compatible con entornos Win-x64, principalmente Windows 7. De lo contrario, excelente. Varios de mis colegas en otros departamentos lo juran.
- VS2008 Profiler: Produce resultados en el rango de más de 100 gigas en el modo de rastreo de función con la resolución requerida. En el lado positivo, produce resultados sólidos.
- GProf: Requiere que GCC sea incluso moderadamente efectivo.
- VTune: el soporte W7 de VTune limita con el criminal. Por lo demás excelente
- PIN: Necesitaría hackear mi propia herramienta, así que este es un último recurso.
- Sleepy \ VerySleepy: útil para aplicaciones más pequeñas, pero me falla aquí.
- EasyProfiler: no está mal si no le importa un poco de código inyectado manualmente para indicar dónde instrumentar.
- Valgrind: * nix solamente, pero muy bueno cuando estás en ese entorno.
- OProfile: solo Linux.
- Proffy: disparan caballos salvajes.
Herramientas sugeridas que no he probado:
- XPerf:
- Glowcode:
- Devpartner:
Notas: entorno Intel en este momento. VS2008, impulsar bibliotecas. Qt 4+. Y el miserable humdinger de todos ellos: integración Qt / MFC a través de trolltech.
Ahora: casi dos semanas después, parece que mi problema está resuelto. Gracias a una variedad de herramientas, que incluyen casi todo en la lista y algunos de mis trucos personales, encontramos los principales cuellos de botella. Sin embargo, voy a seguir probando, explorando y probando nuevos perfiladores, así como nuevas tecnologías. ¿Por qué? Porque se los debo a ustedes, porque ustedes rockeros Se ralentiza un poco la línea de tiempo, pero todavía estoy muy emocionado de seguir probando nuevas herramientas.
Sinopsis
Entre muchos otros problemas, varios componentes se cambiaron recientemente al modelo de subprocesamiento incorrecto, lo que provocó serios problemas debido al hecho de que el código subyacente ya no era multiproceso. No puedo decir más porque viola mi NDA, pero puedo decirte que esto nunca habría sido encontrado por una inspección casual o incluso por una revisión de código normal. Sin perfiladores, gráficos de llamada y pausas aleatorias en conjunto, todavía estaríamos gritando nuestra furia al hermoso arco azul del cielo. Afortunadamente, trabajo con algunos de los mejores piratas informáticos que he conocido, y tengo acceso a un increíble verso lleno de excelentes herramientas y excelentes personas.
Caballeros, lo aprecio enormemente, y solo lamento no tener suficiente representante para recompensar a cada uno de ustedes con una recompensa. Todavía creo que esta es una pregunta importante para obtener una mejor respuesta que las que tenemos hasta ahora en SO.
Como resultado, cada semana durante las próximas tres semanas, ofreceré la mayor recompensa que pueda pagar, y la otorgaré a la respuesta con la herramienta más agradable que creo que no es de conocimiento común. Después de tres semanas, es de esperar que hayamos acumulado un perfil definitivo de los perfiladores, si me disculpa mi castigo.
Para llevar
Use un perfilador. Son lo suficientemente buenos para Ritchie, Kernighan, Bentley y Knuth. No me importa quién creas que eres. Utiliza un perfilador. Si el que tienes no funciona, busca otro. Si no puede encontrar uno, codifique uno. Si no puede codificar uno, o es un pequeño bloqueo, o simplemente está atascado, use una pausa aleatoria. Si todo lo demás falla, contrata a algunos estudiantes de posgrado para golpear a un perfilador.
Una vista mas larga
Entonces, pensé que sería bueno escribir un poco de retrospectiva. Opté por trabajar extensamente con Parallel Studios, en parte porque en realidad está construido sobre la herramienta PIN. Habiendo tenido relaciones académicas con algunos de los investigadores involucrados, sentí que esto probablemente era una marca de cierta calidad. Afortunadamente, tenía razón. Si bien la GUI es un poco terrible, descubrí que IPS es increíblemente útil, aunque no puedo recomendarlo cómodamente para todos. Críticamente, no hay una forma obvia de obtener recuentos de aciertos a nivel de línea, algo que proporcionan AQT y varios otros perfiladores, y he encontrado muy útil para examinar la tasa de selección de sucursales, entre otras cosas. En la red, también he disfrutado usando AQTime, y he encontrado que su soporte es realmente receptivo. Nuevamente, debo calificar mi recomendación: Muchas de sus características no funcionan tan bien, y algunas de ellas son francamente propensas a fallas en Win7x64. XPerf también tuvo un desempeño admirable, pero es extremadamente lento para los detalles de muestreo necesarios para obtener buenas lecturas en ciertos tipos de aplicaciones.
En este momento, debo decir que no creo que haya una opción definitiva para perfilar el código C ++ en un entorno W7x64, pero ciertamente hay opciones que simplemente no pueden realizar ningún servicio útil.
Respuestas:
Primero:
Los perfiladores de muestreo de tiempo son más robustos que los perfiladores de muestreo de CPU. No estoy muy familiarizado con las herramientas de desarrollo de Windows, así que no puedo decir cuáles son cuáles. La mayoría de los perfiladores son de muestreo de CPU.
Un generador de perfiles de muestreo de CPU toma un seguimiento de la pila cada N instrucciones.
Esta técnica revelará partes de su código que están vinculadas a la CPU. Lo cual es increíble si ese es el cuello de botella en su aplicación. No es tan bueno si los hilos de su aplicación pasan la mayor parte de su tiempo peleando por un mutex.
Un perfilador de muestreo de tiempo toma un seguimiento de la pila cada N microsegundos.
Esta técnica se centrará en el código "lento" . Si la causa está vinculada a la CPU, bloqueando las secciones de código vinculadas a E / S, vinculadas a mutex o cacheando. En resumen, cualquier fragmento de código que esté desacelerando su aplicación se destacará.
Por lo tanto, use un generador de perfiles de muestreo de tiempo si es posible, especialmente al perfilar código enhebrado.
Segundo:
Los perfiladores de muestreo generan grandes cantidades de datos. Los datos son extremadamente útiles, pero a menudo hay demasiados para ser fácilmente útiles. Un visualizador de datos de perfil ayuda enormemente aquí. La mejor herramienta que he encontrado para la visualización de datos de perfil es gprof2dot . No deje que el nombre lo engañe, maneja todo tipo de salida de perfilador de muestreo (AQtime, Sleepy, XPerf, etc.). Una vez que la visualización ha señalado la (s) función (es) ofensiva (s), regrese a los datos de perfil sin procesar para obtener mejores pistas sobre cuál es la verdadera causa.
La herramienta gprof2dot genera una descripción de gráfico de puntos que luego se introduce en una herramienta de gráficos . El resultado es básicamente un callgraph con funciones codificadas por colores por su impacto en la aplicación.
Algunas sugerencias para que gprof2dot genere una buena salida.
--skew
0.001 en mis gráficos para poder ver fácilmente las rutas de los códigos activos. De lo contrario,int main()
domina el gráfico.--strip
. Esto es especialmente cierto con Boost.malloc
es destruir el montón y consumir el 15%.fuente
¿Qué pasó cuando intentaste una pausa aleatoria? Lo uso todo el tiempo en una aplicación monstruosa. Dijiste que no daba suficiente información, y has sugerido que necesitas alta resolución. A veces las personas necesitan un poco de ayuda para entender cómo usarlo.
Lo que hago, bajo VS, es configurar la pantalla de la pila para que no me muestre los argumentos de la función, porque eso hace que la pantalla de la pila sea totalmente ilegible, IMO.
Luego tomo alrededor de 10 muestras presionando "pausa" durante el tiempo que me está haciendo esperar . Utilizo ^ A, ^ C y ^ V para copiarlos en el bloc de notas, como referencia. Luego estudio cada uno, para tratar de descubrir qué era lo que estaba tratando de lograr en ese momento.
Si estaba tratando de lograr algo en 2 o más muestras, y eso no es estrictamente necesario, entonces he encontrado un problema en vivo, y sé aproximadamente cuánto ahorrará solucionarlo.
Hay cosas que realmente no necesita saber, como porcentajes exactos no son importantes, y lo que sucede código dentro de 3 ª parte no es importante, porque no se puede hacer nada acerca de aquellos . De lo que puede hacer algo es del rico conjunto de puntos de llamada en el código que puede modificar en cada muestra de la pila. Ese es tu feliz coto de caza.
Ejemplos del tipo de cosas que encuentro:
Durante el inicio, puede tener aproximadamente 30 capas de profundidad, en el proceso de intentar extraer cadenas de caracteres internacionalizadas de los recursos de DLL. Si se examinan las cadenas reales, puede resultar fácilmente que las cadenas realmente no necesitan ser internacionalizadas, como si fueran cadenas que el usuario nunca ve realmente.
Durante el uso normal, algunos códigos establecen inocentemente una propiedad Modificada en algún objeto. Ese objeto proviene de una superclase que captura el cambio y desencadena notificaciones que se extienden por toda la estructura de datos, manipulando la interfaz de usuario, creando y destruyendo obedece de formas difíciles de prever. Esto puede suceder mucho: las consecuencias inesperadas de las notificaciones.
Completar una hoja de trabajo fila por fila, celda por celda. Resulta que si construyes la fila de una vez, a partir de una matriz de valores, es mucho más rápido.
PD: si tienes varios subprocesos, cuando lo pausas, todos los hilos se pausan. Echa un vistazo a la pila de llamadas de cada hilo. Lo más probable es que solo uno de ellos sea el verdadero culpable, y los otros están inactivos.
fuente
He tenido cierto éxito con AMD CodeAnalyst .
fuente
¿Tiene una función MFC OnIdle? En el pasado, tenía una aplicación casi en tiempo real que tenía que arreglar, que dejaba caer paquetes en serie cuando se configuraba a una velocidad de 19.2K, que un PentiumD debería haber podido seguir. La función OnIdle era lo que estaba matando cosas. No estoy seguro de si QT tiene ese concepto, pero también lo comprobaría.
fuente
Vuelva al VS Profiler: si está generando archivos tan grandes, ¿quizás su intervalo de muestreo es demasiado frecuente? Intente bajarlo, ya que probablemente tenga suficientes muestras de todos modos.
E idealmente, asegúrese de no recolectar muestras hasta que realmente esté ejercitando el área problemática. Así que comience con la colección en pausa, haga que su programa haga su "actividad lenta", luego comience la colección. Solo necesita como máximo 20 segundos de recolección. Detener la colección después de esto.
Esto debería ayudar a reducir el tamaño de los archivos de muestra y solo capturar lo que sea necesario para su análisis.
fuente
He utilizado con éxito PurifyPlus para Windows. Aunque no es barato, IBM proporciona una versión de prueba que está ligeramente paralizada. Todo lo que necesita para perfilar con cuantificar son archivos PDB y la vinculación con / FIJO: NO. Único inconveniente: no es compatible con Win7 / 64.
fuente
Easyprofiler : aún no lo he visto aquí, así que no estoy seguro de si ya lo has visto. Toma un enfoque ligeramente diferente en la forma en que recopila datos métricos. Un inconveniente de usar su enfoque de perfil de tiempo de compilación es que debe realizar cambios en la base de código. Por lo tanto, necesitará tener una idea de dónde podría estar la lentitud e insertar el código de perfil allí.
A juzgar por sus comentarios sin embargo, parece que estás haciendo al menos algunos progresos. Quizás esta herramienta pueda proporcionarle algunas métricas útiles. Si nada más, tiene algunos cuadros e imágenes realmente purdy: P
fuente
Dos sugerencias de herramientas más.
Luke Stackwalker tiene un lindo nombre (incluso si se está esforzando un poco para mi gusto), no le costará nada y obtendrá el código fuente. Afirma que también admite programas de subprocesos múltiples. Por lo tanto, vale la pena probarlo.
http://lukestackwalker.sourceforge.net/
También Glowcode, que me he señalado que vale la pena usar:
http://www.glowcode.com/
Desafortunadamente, no he hecho ningún trabajo de PC por un tiempo, así que no he probado ninguno de estos. Espero que las sugerencias sean de ayuda de todos modos.
fuente
Checkout XPerf
Este es un perfilador gratuito, no invasivo y extensible ofrecido por MS. Fue desarrollado por Microsoft para perfilar Windows.
fuente
Si sospecha del bucle de eventos, ¿podría anular QCoreApplication :: notify () y el perfil manual de dosome (uno o dos mapas de remitentes / eventos a recuentos / tiempo)?
Estoy pensando que primero registra la frecuencia de los tipos de eventos, luego examina esos eventos con más cuidado (qué objeto lo envía, qué contiene, etc.). Las señales en los subprocesos se ponen en cola implícitamente, por lo que terminan en el bucle de eventos (así como conexiones explícitas en cola también, obviamente).
Lo hemos hecho para atrapar e informar excepciones en nuestros controladores de eventos, por lo que realmente todos los eventos pasan por allí.
Solo una idea.
fuente
QObject* object
parámetro. Quizás MetaCall es el tipo para todas las señales (parece probable), pero no estoy seguro. Esto va un poco más allá de mi experiencia, pero echar un vistazo a la fuente Qt podría obtener algo de verdad. (O, haga una pregunta más puntual wrt en cola invocaciones de señal aquí en SO .. :)Editar: Ahora veo que mencionaste esto en tu primera publicación. Maldición, nunca pensé que sería ese tipo.
Puede usar Pin para instrumentar su código con una granularidad más fina. Creo que Pin te permitiría crear una herramienta para contar cuántas veces ingresas a una función o cuántas veces pasas allí, emulando algo como VTune o CodeAnalyst. Luego, puede desglosar qué funciones se instrumentan hasta que desaparezcan sus problemas de sincronización.
fuente
Te puedo decir lo que uso todos los días.
a) Analista de código AMD
b) VTune.
Está muy bien integrado en vs2008
Después de conocer los puntos de acceso, necesita muestrear no solo el tiempo, sino otras cosas como la falta de caché y el uso de memoria. Esto es muy importante . Configure una sesión de muestreo y edite las propiedades. Siempre muestro por tiempo, memoria de lectura / escritura y errores de caché (tres ejecuciones diferentes)
Pero más que la herramienta, necesita obtener experiencia con la creación de perfiles. Y eso significa comprender cómo funciona la CPU / Memoria / PCI ... así que esta es mi tercera opción
c) Prueba unitaria
Esto es muy importante si está desarrollando una gran aplicación que necesita un gran rendimiento. Si no puede dividir la aplicación en algunas partes, será difícil rastrear el uso de la CPU. No pruebo todos los casos y clases, pero he codificado ejecuciones y archivos de entrada con características importantes.
Mi consejo es utilizar un muestreo aleatorio en varias pruebas pequeñas y tratar de estandarizar una estrategia de perfil.
fuente
Uso xperf / ETW para todas mis necesidades de creación de perfiles. Tiene una curva de aprendizaje empinada pero es increíblemente poderosa. Si está perfilando en Windows, entonces debe conocer xperf. Con frecuencia utilizo este generador de perfiles para encontrar problemas de rendimiento en mi código y en el código de otras personas.
En la configuración que lo uso:
Esa es una gran cantidad de datos, todos en una sola línea de tiempo, para todos los procesos. Ningún otro generador de perfiles en Windows puede hacer eso.
He blogueado extensamente sobre cómo usar xperf / ETW. Estas publicaciones de blog y algunos videos de capacitación de calidad profesional se pueden encontrar aquí: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/
Si desea saber qué podría pasar si no usa xperf, lea estas publicaciones de blog: http://randomascii.wordpress.com/category/investigative-reporting/ Estas son historias de problemas de rendimiento que he encontrado en el código de otras personas , eso debería haber sido encontrado por los desarrolladores. Esto incluye la carga de mshtml.dll en el compilador de VC ++, una denegación de servicio en los archivos de búsqueda de VC ++, estrangulación térmica en un sorprendente número de máquinas de clientes, paso lento lento en Visual Studio, una asignación de 4 GB en un disco duro. controlador de disco, un error de rendimiento de powerpoint y más.
fuente
Acabo de terminar la primera versión utilizable de CxxProf , una biblioteca de perfiles instrumentada manual portátil para C ++.
Cumple los siguientes objetivos:
Estos puntos fueron extraídos de la wiki del proyecto , eche un vistazo allí para obtener más detalles.
Descargo de responsabilidad: soy el desarrollador principal de CxxProf
fuente
Solo para descartarlo, a pesar de que no es un perfilador completo: si todo lo que busca es colgar bucles de eventos que demoran mucho en procesar un evento, una herramienta ad-hoc es simple en Qt. Ese enfoque podría ampliarse fácilmente para realizar un seguimiento de cuánto tiempo tomó procesar cada evento, y cuáles fueron esos eventos, y así sucesivamente. No es un perfilador universal, sino un evento centrado en el bucle.
En Qt, todas las llamadas de ranura de señal entre hilos se entregan a través del bucle de eventos, al igual que los temporizadores, las notificaciones de red y puerto serie, y toda la interacción del usuario. Por lo tanto, observar los bucles de eventos es un gran paso hacia la comprensión de dónde la aplicación pasa su tiempo.
fuente
DevPartner, desarrollado originalmente por NuMega y ahora distribuido por MicroFocus, fue una vez la solución elegida para la creación de perfiles y el análisis de código (fugas de memoria y recursos, por ejemplo). No lo he probado recientemente, por lo que no puedo asegurarle que lo ayudará; pero una vez tuve excelentes resultados con él, por lo que esta es una alternativa que considero reinstalar en nuestro proceso de calidad de código (proporcionan una prueba de 14 días)
fuente
aunque su sistema operativo es win7, ¿el programa no puede ejecutarse en xp? ¿Qué tal si lo perfilamos bajo XP y el resultado debería ser una pista para win7?
fuente
Aquí se enumeran muchos perfiladores y he probado algunos de ellos, sin embargo, terminé escribiendo el mío en base a esto:
http://code.google.com/p/high-performance-cplusplus-profiler/
Por supuesto, requiere que modifique la base del código, pero es perfecto para reducir los cuellos de botella, debería funcionar en todos los x86 (podría ser un problema con las cajas multinúcleo, es decir, utiliza rdtsc, sin embargo, esto es solo para el tiempo indicativo de todos modos - así que creo que es suficiente para mis necesidades ...)
fuente
Yo uso Orbit profiler, fácil, de código abierto y potente! https://orbitprofiler.com/
fuente