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
12k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ftrace を使ったコンテナ内デバッグの準備/container-debug-using-ftrace
Kenta Tada
September 24, 2019
More Decks by Kenta Tada
See All by Kenta Tada
eBPFの未来に向けた課題
kentatada
0
150
Beyond_the_Limits_of_eBPF__A_Journey_Through_OS_Technologies.pdf
kentatada
0
120
eBPF Updates (March 2025)
kentatada
0
360
CNCJ で考える OSPO ステージ2
kentatada
0
160
Security_for_introducing_eBPF
kentatada
0
390
cgroup v2 support in Kubeadm
kentatada
0
450
Keynote_ The State of eBPF in Japan
kentatada
0
170
eBPF Japan Meetup のご紹介
kentatada
0
630
eBPF_technologies_with_container
kentatada
0
840
Other Decks in Programming
See All in Programming
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
450
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
790
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
190
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.8k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
230
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
110
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
160
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
130
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
140
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
290
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
280
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
370
Featured
See All Featured
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
How GitHub (no longer) Works
holman
316
150k
Practical Orchestrator
shlominoach
191
11k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
420
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
160
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
410
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Six Lessons from altMBA
skipperchong
29
4.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
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はソニー株式会社の登録商標または商標です。 各ソニー製品の商品名・サービス名はソニー株式会社またはグループ各社の登録商標または商標です。その他の製品および会社名は、各社の商号、登録商標または商標です。