BPF というと、memcached を速くするとか、Ruby からコンパイルするとか、まず高度な話題を見かける2021年だけど、BCC についてくる色々なスクリプトを使うだけでも、色々とトラブルを解決できることがある。
opensnoop
opensnoop は文字通りシステムで発行されている open(2) をリアルタイムに覗き見できるツールだ。
去年に containerd/cgroup でメトリクスが来ないバグを直したときには、そもそも最初はこのパッケージまで絞り込めてなくて、
- なんかメトリクスが来ないんだけど…
- このメトリクスって /sys/gs/cgroup/blkio 以下のファイルから来てるんだよね?
- これって containerd 本体が読んでるんだっけ? 多分 shim のほうだとは思うんだけど…
- runc が読んでるってことはないよねえ?
- ファイルは読まれているけど、中継経路のどこかで落としてしまっているとか?
みたいな状況で strace をかけるにもどのプロセスを見たものか今ひとつわからない。そこで opensnoop をかけると、そもそも誰もファイルを読んでいないじゃないか! というのが即座にわかって便利だった。
それ bpftrace で出来るの?
ちなみに、open(2) を文字通り全部ログするようなものなら、bpftrace で書くこともできる。
ただ、例えば opensnoop だと、open(2) の他に openat(2) と openat2(2) をハンドルするコードが入っている。
open(2) のことを考えたときに、その亜種のシステムコールもパッと浮かぶくらい Linux に詳しい人だったら全て bpftrace で事足りるのかもしれない。私はそこまで Linux に詳しくないので、BCC についてくるスクリプトから試すことが多い。
Source: posts/2021/opensnoop.md