GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Anda membuat simbol debug bekerja di alat perf linux di dalam wadah Docker?

Menjalankan wadah dengan -v /:/host tandai dan jalankan perf report dalam wadah dengan --symfs /host bendera memperbaikinya:

 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

Bagian dari alasan mengapa itu tidak berfungsi sebagaimana adanya? Keluaran dari perf script semacam menjelaskan hal ini:

...
           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)
...

Perhatikan /var/lib/docker/aufs jalur. Itu dari host sehingga tidak akan ada di wadah dan Anda perlu membantu perf report untuk menemukannya. Hal ini mungkin terjadi karena peristiwa mmap dilacak oleh perf di luar cgroup mana pun dan perf tidak berupaya memetakan ulang jalur.

Opsi lainnya adalah menjalankan perf host-side, seperti sudo perf record -a docker run -ti <container name> . Tapi koleksinya harus di seluruh sistem di sini (-a flag) karena wadah dihasilkan oleh proses daemon buruh pelabuhan yang tidak ada dalam hierarki proses alat klien buruh pelabuhan yang kami jalankan di sini.


Cara lain yang tidak memerlukan perubahan cara Anda menjalankan penampung (sehingga Anda dapat membuat profil proses yang sudah berjalan) adalah memasang root penampung pada host menggunakan bindfs:

bindfs /proc/$(docker inspect --format {{.State.Pid}} $CONTAINER_ID)/root /foo

Kemudian jalankan laporan perf sebagai perf report --symfs /foo

Anda harus menjalankan perf record di seluruh sistem, tetapi Anda dapat membatasinya hanya untuk mengumpulkan peristiwa untuk penampung tertentu:

perf record -g -a -F 100 -e cpu-clock -G docker/$(docker inspect --format {{.Id}} $CONTAINER_ID) sleep 90

Linux
  1. Bagaimana Anda memulai Linux?

  2. Cara Mendapatkan Informasi Tentang Kontainer Di Docker

  3. Bagaimana cara menentukan apakah suatu proses berjalan di dalam lxc/Docker?

  1. 7 fitur wadah/transportasi gambar Linux yang menyenangkan

  2. Cara menjalankan tugas cron di dalam wadah buruh pelabuhan

  3. Bagaimana Anda menentukan apakah Anda menggunakan sistem Linux atau BSD di dalam skrip?

  1. Cara Membuat, Mendaftar &Menghapus Wadah Docker di Linux

  2. Bagaimana Cara Menjalankan Program Di Dalam Wadah Docker?

  3. Cara Mendaftar Kontainer Docker