昨日は普通にブログを忘れていた...。増税に負けてしまった...。
気を取り直して今日。
hacoboot_sampler
というツールをリポジトリに同梱した(名前は...)。
# 第一引数は、コンテナの init のコマンドを推奨 $ sudo bpftrace misc/hacoboot_sampler.bt /u/app/helloworld/bin/rails
こう起動して、別窓でコンテナをあげたり降ろしたりしていると、
- 起動(正確には、Haconiwa内部の最初のprobe)〜コンテナ自体がexecveするタイミングまで
- 起動〜コンテナがポートリスンするまで
のそれぞれの時間を計測し、平均、最大、最小をナノ秒単位で出してくれる。
Attaching 5 probes... ^C @execve__count: 3 @execve_avg: 70950886 @execve_max: 78633157 @execve_min: 59346736 @listen__count: 3 @listen_avg: 2240287035 @listen_max: 2359375184 @listen_min: 2100345924
このコンテナは execveまで平均 78ms、その後リスンしてアクセスできるようになるまで 2240ms かかっているとわかる。コンテナプロセスの起動自体の必要時間が 2100ms 程度ということですね。
スクリプトを参考に、ヒストグラムを出したり他の集計も試せるし、各値をTSVに吐き出してmatplotlibに食わせたり、など、夢が広がる。
今の制限として、initプロセス(スレッド)がそのままlisten(2)を発行するパターンでないとlistenの検知ができない。こういうときに cgroup
が取れるとコンテナ内でのシステムコール呼び出しが紐づくんだけど、今回実際にやりたい環境は諸事情によりUbuntu 16.04なのでカーネルが新しくても4.15で、 BPF_FUNC_get_current_cgroup_id
がないので使えないみたい。
みんな、カーネルどんどん上げていきましょう。Bionicで5.0が使えるんですよ、やばくないですか。
そういえばhaconiwaのUSDT haconiwa:bootstrap_phase_pass
については、親でも子でも持ち回しのID(実態は親のPID)を発行しているので、任意の各フェーズ間のかかった時間を計測できる状態になっているな、と今気づいた。雰囲気でUSDTを埋めていたけど便利じゃないか...。
どんどん計測をやっていく。