GNU/Linux >> Linux の 問題 >  >> Linux

Dockerコンテナ内のLinux perfツールでデバッグシンボルを機能させるにはどうすればよいですか?

-v /:/host でコンテナーを実行する フラグと実行中の perf report --symfs /host のコンテナー内 フラグで修正:

 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

そのままでは機能しない理由の一部は? perf script からの出力 これに光を当てます:

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

/var/lib/docker/aufs に注意してください 道。これはホストからのものであるため、コンテナーには存在しません。perf report を支援する必要があります それを見つけるために。これは、mmap イベントが cgroup の外部で perf によって追跡され、perf がパスの再マッピングを試みないために発生する可能性があります。

もう 1 つのオプションは、sudo perf record -a docker run -ti <container name> のように perf ホスト側で実行することです。 .ただし、コレクションはここではシステム全体である必要があります (-a フラグ) コンテナーは、ここで実行する docker クライアント ツールのプロセス階層にない docker デーモン プロセスによって生成されるためです。


コンテナーの実行方法を変更する必要がない (既に実行中のプロセスをプロファイリングできるようにする) 別の方法は、bindfs を使用してコンテナーのルートをホストにマウントすることです:

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

次に、perf レポートを perf report --symfs /foo として実行します

perf record を実行する必要があります システム全体ですが、特定のコンテナのイベントのみを収集するように制限できます:

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

Linux
  1. Linuxを始めたきっかけは何ですか?

  2. 7つの楽しいLinuxコンテナ/画像転送機能

  3. LinuxでDockerコンテナを作成、一覧表示、削除する方法

  1. プロセスが lxc/Docker 内で実行されているかどうかを判断する方法は?

  2. docker は Linux コンテナー内で実行できますか?

  3. docker コンテナ内で cron ジョブを実行する方法

  1. Dockerコンテナ内でプログラムを実行する方法は?

  2. Dockerコンテナを終了する方法

  3. スクリプト内で Linux または BSD システムを使用しているかどうかをどのように判断しますか?