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