Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ftrace を使ったコンテナ内デバッグの準備/container-debug-using-f...
Search
Kenta Tada
September 24, 2019
Programming
7
12k
ftrace を使ったコンテナ内デバッグの準備/container-debug-using-ftrace
Kenta Tada
September 24, 2019
Tweet
Share
More Decks by Kenta Tada
See All by Kenta Tada
Beyond_the_Limits_of_eBPF__A_Journey_Through_OS_Technologies.pdf
kentatada
0
50
eBPF Updates (March 2025)
kentatada
0
230
CNCJ で考える OSPO ステージ2
kentatada
0
92
Security_for_introducing_eBPF
kentatada
0
280
cgroup v2 support in Kubeadm
kentatada
0
390
Keynote_ The State of eBPF in Japan
kentatada
0
110
eBPF Japan Meetup のご紹介
kentatada
0
500
eBPF_technologies_with_container
kentatada
0
710
Linux Tracing Technologies for Rust
kentatada
4
1.1k
Other Decks in Programming
See All in Programming
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
1.6k
株式会社 Sun terras カンパニーデック
sunterras
0
190
プログラミングどうやる? ~テスト駆動開発から学ぶ達人の型~
a_okui
0
190
CSC305 Lecture 03
javiergs
PRO
0
230
LLMとPlaywright/reg-suitを活用した jQueryリファクタリングの実際
kinocoboy2
4
660
2分台で1500examples完走!爆速CIを支える環境構築術 - Kaigi on Rails 2025
falcon8823
3
2.8k
iOSDC.pdf
chronos2500
2
650
あなたの知らない「動画広告」の世界 - iOSDC Japan 2025
ukitaka
0
350
CI_CD「健康診断」のススメ。現場でのボトルネック特定から、健康診断を通じた組織的な改善手法
teamlab
PRO
0
160
エンジニアとして高みを目指す、 利益を生み出す設計の考え方 / design-for-profit
minodriven
23
12k
私はどうやって技術力を上げたのか
yusukebe
43
17k
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
160
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Making Projects Easy
brettharned
118
6.4k
GraphQLとの向き合い方2022年版
quramy
49
14k
Writing Fast Ruby
sferik
629
62k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Six Lessons from altMBA
skipperchong
28
4k
The Invisible Side of Design
smashingmag
301
51k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
20k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Transcript
R&D Center System Technology Development Division Base System Development Department
Copyright 2019 Sony Corporation ftrace を使ったコンテナ内デバッグの準備 Kenta Tada R&D Center Sony Corporation
About me ⚫System Software Engineer ⚫低レイヤな仕事をしています。
本日のアジェンダ ⚫strace や GDB を使えない or 使いたくない環境でコンテ ナ内のアプリケーションをデバッグしたい。
ptrace ベースのデバッグツール(strace、 GDB)の課題 ⚫(特に組み込みでは)仕組み上、重たい。 ⚫システムグローバルな情報が取れない。 • (コンテナ内のアプリケーション起因で)カーネル側に影響 を与える問題の解析が出来ない。 • 例
: dentry キャッシュの増大化 https://qiita.com/kentaost/items/a2e882d2978fba9e17d3
そこで ftrace ⚫ftrace とは • カーネル内に組み込まれているトレーシング機構 • カーネル内関数やシステムコールの呼び出しを含む様々 な情報をカーネル内リングバッファに取得し続ける。
ftrace だと何を取得できるの? ⚫たとえば • カーネル内関数の呼び出し • カーネル内関数のコールグラフ •最大の割り込み禁止区間 •システムコールの呼び出し ←
今日はこれをコンテナ内で 取得してみる …
まずはコンテナ外で ftrace を使う
ftrace によるシステムコールトレース設定(not コンテナ環境) ⚫tracefs のマウント • 本スライドでは /sys/kernel/debug/tracing にマウント ⚫システムコールイベントをトレース対象にする
• /sys/kernel/debug/tracing/events/syscalls の中からシステム コール毎に enable ⚫PIDを限定 • # echo [PID] > /sys/kernel/debug/tracing/set_event_pid • 動作中のプロセスではなく、起動時から取得するに は?? → 次ページで説明 ⚫トレーススタート • # echo 1 > /sys/kernel/debug/tracing/tracing_on
プロセス起動時からトレースする ⚫set_event_pid に指定する PID がプログラム実行前にわ かれば良い。 → 解析対象プログラムを最後に exec するラッパースクリ
プトを作成して、 exec 前に ftrace の設定をすれば OK
コンテナ外のシステムコールトレースの例 : ls コマンド
コンテナ内で ftrace を使うには?
runC のおさらい ⚫runC • 低レイヤコンテナランタイム ⚫runC でコンテナを立ち上げるには • config.json •
コンテナの rootfs
ftrace 環境を config.json に書く時の懸念点 ⚫tracefs のマウント → 懸念点1 : ftrace
のリングバッファはシステムグローバ ル ⚫システムコールイベントをトレース対象にする ⚫PIDを限定 ⚫トレーススタート → 懸念点2 : pid namespace を分割していたら(普通してい る)どうしよう??
懸念点1 : ftrace のリングバッファや設定について ⚫通常 ftrace のリングバッファはシステムグローバル • トレーススタートタイミングは、コンテナ毎に異なる。 •
コンテナAとコンテナBが共に ftrace を使うと、両方のログ が混合される。 –コンテナ側にリングバッファを見せる場合、機微情報等 が入ってたりすると困る。 ⚫コンテナの中で ftrace の設定をいじられたくない • コンテナ内からリングバッファのサイズを変更したり、 トレース対象の PID を変更できてしまう。
懸念点1 : 解決案 ⚫通常 ftrace のリングバッファはシステムグローバル • ftrace にはリングバッファを分割する機能がある(ftrace instances)。
–instances ディレクトリ(例 : /sys/kernel/debug/tracing/instances) で mkdir すると専用のバッファが出来る。 –例 : /sys/kernel/debug/tracing/instances/containerA • コンテナ毎にリングバッファを作成して、コンテナ毎の ユーザに chown して bind mount ⚫コンテナの中でftraceの設定をいじられたくない • bind mount の単位をファイルレベルに細かくする
懸念点2 : pid namespace 分割問題 ⚫ホスト上の PID を set_event_pid に指定する必要がある。
懸念点2 : 解決案 ⚫ホスト上の PID を set_event_pid に指定する必要がある。 • runC
は自身を exec してコンテナの init process になる。 • runC の preStart にて、将来コンテナの中で動く PID (runc init)を探してその PIDを set_event_pid に指定するスクリプ トを実行する。 "hooks": { "prestart": [ { "path": "/hookpath/set_ftrace.sh", "args": [ "set_ftrace.sh" ] } ] },
コンテナ内のシステムコールトレースの例 : ls コマンド
デモ : 実際にコンテナ内からログを出してみる
今後の課題 ⚫preStart から実際に exec されるまでにトレースされる情 報がログに入ってしまう。 • そもそも preStart でやるべきことでもない気がする。
→ preExec 的なものが欲しいなあ・・・ ⚫どのファイルが読めなくてエラーになってるか知りた い。 → (参考) kprobes で表示可能 https://events.linuxfoundation.org/wp-content/uploads/2017/12/oss-eu-2018- fun-with-dynamic-trace-events_steven-rostedt.pdf ⚫ログのシステムコールのエラーメッセージが欲しい。
コンテナ内で ftrace を使うには? ⚫ftrace instances をコンテナ単位で割り当てる ⚫runC の preStart で将来コンテナの中で動く
PID を取得 し、その PID を ftrace の set_event_pid に設定する まとめ
SONYはソニー株式会社の登録商標または商標です。 各ソニー製品の商品名・サービス名はソニー株式会社またはグループ各社の登録商標または商標です。その他の製品および会社名は、各社の商号、登録商標または商標です。