sueño que para niños niño los importancia horas hora habitos exceso dormir deben debe cuantas crecer consecuencias bien años adulto adolescentes c linux profiling perf

que - Perfilando los tiempos de sueño con perf.



habitos de sueño en adolescentes (3)

Estaba buscando una forma de averiguar dónde pasa mi programa. Leí el tutorial de perf y traté de perfilar los tiempos de sueño como se describe allí. Escribí el programa más simple posible para perfilar:

#include <unistd.h> int main() { sleep(10); return 0; }

Luego lo ejecuté con perf:

$ sudo perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -g -o ~/perf.data.raw ./a.out [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.013 MB /home/pablo/perf.data.raw (~578 samples) ] $ sudo perf inject -v -s -i ~/perf.data.raw -o ~/perf.data build id event received for [kernel.kallsyms]: d62870685909222126e7070d2bafdf029f7ed3b6 failed to write feature 2 $ sudo perf report --stdio --show-total-period -i ~/perf.data Error: The /home/pablo/perf.data file has no samples!

¿Alguien sabe como evitar estos errores? ¿Qué quieren decir? failed to write feature 2 no parece demasiado fácil de usar ...

Actualizar:

$ uname -a Linux debian 3.12-1-amd64 #1 SMP Debian 3.12.9-1 (2014-02-01) x86_64 GNU/Linux


Esto me funciona para "perf versión 3.11.1" en un cuadro "openSUSE 13.1 (x86_64)".

Aquí está la salida si te importa:

# ======== # captured on: Sun Feb 16 09:49:38 2014 # hostname : ***************** # os release : 3.11.10-7-desktop # perf version : 3.11.1 # arch : x86_64 # nrcpus online : 8 # nrcpus avail : 8 # cpudesc : Intel(R) Core(TM) i7-3840QM CPU @ 2.80GHz # cpuid : GenuineIntel,6,58,9 # total memory : 32945368 kB # cmdline : /usr/bin/perf inject -v -s -i perf.data.raw -o perf.data # event : name = sched:sched_stat_sleep, type = 2, config = 0x48, config1 = 0x0, config2 = 0x # event : name = sched:sched_switch, type = 2, config = 0x51, config1 = 0x0, config2 = 0x0, e # event : name = sched:sched_process_exit, type = 2, config = 0x4e, config1 = 0x0, config2 = # HEADER_CPU_TOPOLOGY info available, use -I to display # HEADER_NUMA_TOPOLOGY info available, use -I to display # pmu mappings: cpu = 4, software = 1, tracepoint = 2, uncore_cbox_0 = 6, uncore_cbox_1 = 7, # ======== # # Samples: 0 of event ''sched:sched_stat_sleep'' # Event count (approx.): 0 # # Overhead Period Command Shared Object Symbol # ........ ............ ....... ............. ...... # # Samples: 8 of event ''sched:sched_switch'' # Event count (approx.): 80099958776 # # Overhead Period Command Shared Object Symbol # ........ ............ ....... ................. ................. # 100.00% 80099958776 bla [kernel.kallsyms] [k] thread_return | --- thread_return thread_return do_nanosleep hrtimer_nanosleep SyS_nanosleep system_call_fastpath 0x7fbc0dec6570 __GI___libc_nanosleep (nil) # Samples: 0 of event ''sched:sched_process_exit'' # Event count (approx.): 0 # # Overhead Period Command Shared Object Symbol # ........ ............ ....... ............. ...... # # # (For a higher level overview, try: perf report --sort comm,dso) # }


Finalmente descubrí cómo hacerlo funcionar. El problema fue que el kernel de Debian predeterminado se construye sin algunas opciones de configuración, por lo que el rendimiento debe ser capaz de monitorear los tiempos de suspensión. Parece que CONFIG_SCHEDSTATS debería estar habilitado para hacer que el kernel recopile estadísticas del programador. Esto se dice que tiene una sobrecarga de tiempo de ejecución. También habilité CONFIG_SCHED_TRACER y algunas opciones de seguimiento de bloqueos, pero no estoy seguro de que sean importantes en mi caso. De todos modos, no se recopilan datos estadísticos en el programador sin CONFIG_SCHEDSTATS (ver kernel/sched/ directory de la fuente del kernel).

Además, hay un muy buen artículo sobre perf escrito por Brendan Gregg, con muchos ejemplos útiles y algunas opciones de kernel que se necesitan para que el perf funcione correctamente.

Actualización: verifiqué el historial de CONFIG_SCHEDSTATS en debian. He comprobado los parches del kernel de Debian y he creado un repositorio de scripts:

svn checkout svn://svn.debian.org/svn/kernel/dists/trunk/linux/debian

Y luego encontré la opción CONFIG_SCHEDSTATS allí

$ grep -R CONFIG_SCHEDSTAT config/ config/config:# CONFIG_SCHEDSTATS is not set

Esta cadena se agregó al repositorio en commit 10837, el 2008-03-14, con el comentario "debian / config: Do complete reorganization". Además, en this informe y en this (gracias a osgx ), se informa que las opciones CONFIG_LATENCYTOP, CONFIG_SCHEDSTATS no están habilitadas porque pueden afectar el rendimiento del kernel. Por lo tanto, creo que simplemente nunca se activó en los núcleos debian por defecto. Sin embargo, no he encontrado la discusión sobre la opción de estadísticas del programador. Si lo hago, voy a escribir aquí.


Hay un mensaje de error de su segundo comando de perf en https://perf.wiki.kernel.org/index.php/Tutorial#Profiling_sleep_times - perf inject -s

$ sudo perf inject -v -s -i ~/perf.data.raw -o ~/perf.data build id event received for [kernel.kallsyms]: d62870685909222126e7070d2bafdf029f7ed3b6 failed to write feature 2

no se pudo escribir la característica 2 no parece demasiado fácil de usar ...

... pero se agregó a perf para hacer que los errores sean más fáciles de usar: http://lwn.net/Articles/460520/ "perf: make perf.data más autodescriptivo (v5)" por Stephane Eranian, 22 de septiembre 2011:

+static int do_write_feat(int fd, struct perf_header *h, int type, .... + pr_debug("failed to write feature %d/n", type);

Todas las funciones se enumeran aquí http://lxr.free-electrons.com/source/tools/perf/util/header.h#L13

15 HEADER_TRACING_DATA = 1, 16 HEADER_BUILD_ID,

Entonces, parece que perf inyect no pudo escribir información sobre los write_build_id() compilación (error de la función write_build_id() de util / header.c) si no estoy equivocado. Hay dos casos que pueden provocar un error: la llamada fallida a perf_session__read_build_ids() o fallar en la escritura de la tabla de dsos__write_buildid_table (este no es nuestro caso porque no aparece el mensaje de error "no se pudo escribir en la tabla de compilación"; verifique write_build_id )

Puede verificar si tiene todos los buildids necesarios para la sesión. También puede ser útil borrar su caché buildid ( rm -rf ~/.debug ), y verificar que tenga vmlinux actualizado con información de depuración o kallsyms habilitados en su kernel.

ACTUALIZACIÓN: en los comentarios, Pavel dice que su registro pref. No tenía ningún evento sched:sched_stat_sleep escrito en perf.data:

sudo perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -g -o ~/perf.data.raw ./a.out

Como explica en su respuesta , su kernel de Debian predeterminado tiene la opción CONFIG_SCHEDSTATS desactivada con el parche del proveedor. Redhat hizo lo mismo con la opción en los núcleos de lanzamiento desde 3.11, y esto se explica en Redhat Bug 1013225 (Josh Boyer 2013-10-28, comentario 4):

Cambiamos a habilitar eso solo en las versiones de depuración hace un tiempo. Parece que se apagó por completo con la versión final 3.11.0 y se ha mantenido apagado desde entonces. Las pruebas internas muestran que la opción tiene un impacto de rendimiento no trivial para los cambios de contexto.

Podemos volver a activar esto en los núcleos de depuración, pero no estoy seguro de que valga la pena.

Josh Poimboeuf 2013-11-04 en el comentario 8 dice que el impacto en el rendimiento es detectable:

En mis pruebas hice muchos cambios de contexto bajo varias cargas de CPU. Vi una caída de ~ 5-10% en la velocidad promedio de cambio de contexto cuando CONFIG_SCHEDSTATS estaba habilitado. ... El impacto de rendimiento solo pareció ocurrir en los kernels posteriores al CFS (> = 2.6.23). El programador O (1) anterior no parecía tener este problema.

Fedora deshabilitó CONFIG_SCHEDSTAT en kernels que no son de depuración el 12 de julio de 2013 "[kernel] Deshabilita LATENCYTOP / SCHEDSTATS en compilaciones que no son de depuración". por Dave Jones. Primer kernel con opción deshabilitada: 3.11.0-0.rc0.git6.4.

Para utilizar cualquier evento de punto de seguimiento de software perf con nombre como sched:sched_stat_* ( sched:sched_stat_wait , sched:sched_stat_sleep , sched:sched_stat_iowait ) debemos recompilar el kernel con la opción CONFIG_SCHEDSTATS habilitada y reemplazar el defecto Debian, RedHat o Fedora Kernels no tienen esto. opción.

Gracias, Pavel Davydov.