Ejecutando el contenedor con -v /:/host
marcar y ejecutar perf report
en el contenedor con --symfs /host
flag lo arregla:
96.59% a.out a.out [.] function
2.93% a.out [kernel.kallsyms] [k] 0xffffffff8105144a
0.13% a.out [nvidia] [k] 0x00000000002eda57
0.11% a.out libc-2.19.so [.] vfprintf
0.11% a.out libc-2.19.so [.] 0x0000000000049980
0.09% a.out a.out [.] main
0.02% a.out libc-2.19.so [.] _IO_file_write
0.02% a.out libc-2.19.so [.] write
¿Parte de la razón por la que no funciona como está? La salida de perf script
tipo de arroja algo de luz sobre esto:
...
a.out 24 3374818.880960: cycles: ffffffff81141140 __perf_event__output_id_sample ([kernel.kallsyms])
a.out 24 3374818.881012: cycles: ffffffff817319fd _raw_spin_lock_irqsave ([kernel.kallsyms])
a.out 24 3374818.882217: cycles: ffffffff8109aba3 ttwu_do_activate.constprop.75 ([kernel.kallsyms])
a.out 24 3374818.884071: cycles: 40053d [unknown] (/var/lib/docker/aufs/diff/9bd2d4389cf7ad185405245b1f5c7d24d461bd565757880bfb4f970d3f4f7915/a.out)
a.out 24 3374818.885329: cycles: 400544 [unknown] (/var/lib/docker/aufs/diff/9bd2d4389cf7ad185405245b1f5c7d24d461bd565757880bfb4f970d3f4f7915/a.out)
...
Tenga en cuenta el /var/lib/docker/aufs
sendero. Eso es del host, por lo que no existirá en el contenedor y debes ayudar a perf report
para localizarlo. Es probable que esto suceda porque los eventos de mmap son rastreados por perf fuera de cualquier cgroup y perf no intenta reasignar las rutas.
Otra opción es ejecutar perf en el lado del host, como sudo perf record -a docker run -ti <container name>
. Pero la colección tiene que ser de todo el sistema aquí (el -a
flag) ya que los contenedores son generados por el proceso del demonio de la ventana acoplable que no está en la jerarquía de procesos de la herramienta del cliente de la ventana acoplable que ejecutamos aquí.
Otra forma que no requiere cambiar la forma en que ejecuta el contenedor (para que pueda perfilar un proceso que ya se está ejecutando) es montar la raíz del contenedor en el host usando bindfs:
bindfs /proc/$(docker inspect --format {{.State.Pid}} $CONTAINER_ID)/root /foo
Luego ejecute el informe de rendimiento como perf report --symfs /foo
Tendrás que ejecutar perf record
en todo el sistema, pero puede restringirlo para que solo recopile eventos para el contenedor específico:
perf record -g -a -F 100 -e cpu-clock -G docker/$(docker inspect --format {{.Id}} $CONTAINER_ID) sleep 90