c++ - pthread_mutex_init - ¿Cómo perfil pthread mutex en linux?
pthreads php (5)
Me gustaría saber cómo perfilar un mutex pthread para ver si hay puntos de contención de bloqueo en mi código. (A quién le gusta el código polémico, ¿verdad? :) Sé cómo hacer un perfil más general del código, como menciono here . Pero me gustaría saber si hay herramientas u opciones disponibles para poder configurar el bloqueo de exclusión mutua que proporcionaría métricas / estadísticas sobre las contenciones de bloqueo de exclusión mutua para ver si tengo áreas problemáticas.
Aquí hay algunos antecedentes y contexto:
Recientemente, trabajé en un proyecto C ++ incrustado utilizando una CPU Cavium Octeon. El Octeon SDK implementa la sincronización de estilo mutex mediante el uso de cierres de giro. Revisando la documentación de Octeon, encontré una forma de crear un perfil de los cierres giratorios para poder ver cuántas veces tenía que girar cada bloqueo mientras esperaba que el bloqueo estuviera disponible. Para usar esto tuve que hacer una compilación condicional y luego incrementaría un contador cada vez que se hiciera girar el spinlock, luego podría consultar el valor de espera del spinner. Entonces, lo que hice fue encapsular el spinlock y agregar la capacidad de volcar el valor de espera del spinner del spinlock para todos los spinlocks utilizados en el sistema. El valor real no significó mucho, pero hubo algunos que tenían valores realmente altos en comparación con el resto, y me concentré en reducir la disputa por ellos.
Sé que esto es probablemente bastante fácil para los spinlocks, ya que solo es un contador por giro, pero al leer las páginas de manual de pthread relacionadas y los archivos de encabezado que no he encontrado nada similar, ¿hay algo disponible para pthread mutex?
Realmente me gustaría evitar tener que hacer algo intrépido como tomarse el tiempo antes y después de cada bloqueo.
PS: ¿Cuál es el plural de mutex? mutexes, muteces, mutexi, muti ??? Los Mutexes nunca me sonaron bien.
Encontré site mientras exploraba para el mismo caso de uso. Aún no lo he usado. Sonaba bien ya que no afectaría el tiempo de ejecución tanto como en valgrind.
Es posible que también desee probar Intel VTune. Informaría también el Tiempo de espera y el Recuento de espera para cada primitiva de sincronización con pilas de llamadas. Revise este documento para ver si esto es lo que está buscando http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf
Han pasado más de 6 años, pero para la referencia me gustaría agregar otro enlace para el seguimiento de tiempo fuera de la CPU que se supone que muestra su argumento mutex. http://www.brendangregg.com/offcpuanalysis.html
No mencionaste tu sistema operativo. Si es Linux, he usado LTT bastante para este tipo de perfiles. Puede ser útil en dos modos:
perfilado de rendimiento - por ejemplo, perfile su sistema para N segundos de uso estándar y luego analice los datos
creación de perfiles de excepción: p. ej., ejecútelo todo el día en el modo "registrador de vuelo" (registre los últimos N segundos de actividad) y, en condiciones excepcionales, desencadene una parada en el registrador de vuelo. Ven a la mañana siguiente y analiza los datos.
He estado usando y viendo ''mutexes'' como el plural de mutex durante años sin quejarme. ;>
El valgrind
herramienta drd permite especificar un límite en el tiempo que debe drd un bloqueo antes de informar un error.
Este site menciona drd
y también menciona su propia herramienta llamada mutrace
que se parece al tipo de herramienta que está buscando. Te dice:
- cuantas veces un mutex fue bloqueado
- ¿Cuántas veces ha cambiado el hilo mutex propietario?
- cuántas veces se contendió un mutex (ya bloqueado cuando se realizó una solicitud de bloqueo)
- varias estadísticas sobre la duración de un mutex fue bloqueado para
p.ej
mutrace: 10 most contended mutexes:
Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Type
35 368268 407 275 120,822 0,000 0,894 normal
5 234645 100 21 86,855 0,000 0,494 normal
26 177324 47 4 98,610 0,001 0,150 normal
19 55758 53 2 23,931 0,000 0,092 normal
53 106 73 1 0,769 0,007 0,160 normal
25 15156 70 1 6,633 0,000 0,019 normal
4 973 10 1 4,376 0,004 0,174 normal
75 68 62 0 0,038 0,001 0,004 normal
9 1663 52 0 1,068 0,001 0,412 normal
3 136553 41 0 61,408 0,000 0,281 normal
... ... ... ... ... ... ... ...
mutrace: Total runtime 9678,142 ms.