GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo consigues que los símbolos de depuración funcionen en la herramienta de rendimiento de Linux dentro de los contenedores de Docker?

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

Linux
  1. ¿Cómo empezaste con Linux?

  2. ¿Cómo puedo obtener información del contenedor de Docker Linux desde el propio contenedor?

  3. ¿Se puede ejecutar docker dentro de un contenedor de Linux?

  4. Use perf dentro de un contenedor docker sin --privileged

  5. ¿Cómo determina si está en un sistema Linux o BSD dentro de un script?

Cómo obtener la dirección IP de un contenedor Docker desde el host

Cómo ejecutar contenedores Docker

Cómo obtener la dirección IP del contenedor Docker

Cómo nombrar o renombrar contenedores Docker

Cómo gestionar contenedores Docker

Cómo ejecutar un trabajo cron dentro de un contenedor docker