GitHub の Ubuntu のランナーで syscalls:sys_enter_* の BPF がイベントを取りこぼす(カーネル 7.0.0-1017-azure)
GitHub がホストする ubuntu-24.04 のイメージは、イメージ 20261018 でカーネルが 6.17.0-1022-azure から 7.0.0-1017-azure に変わりました。ubuntu-26.04 も、イメージ 20261012.163.1 のころから 7.0.0-1017-azure です。ubuntu-latest はどちらかなので、どちらにしても当たります(26.04 に移っている途中)。このカーネルには「tracing: perf: Fix stale head for perf syscall tracing」(2c2b322acdcc・Linux 7.2)のバックポートが、それが前提とする変更なしに入っています。perf_syscall_enter() が BPF プログラムを確かめる前に戻ってしまうので、execve・openat・write などの syscalls:sys_enter_* のトレースポイントの BPF プログラムは、そのトレースポイントの perf イベントが開かれた CPU でしか動きません(runner-images #15003)。
どう見えるか
読み込みもアタッチも失敗しません。プログラムは動きますが、1つの CPU(たいていは CPU 0)での呼び出しにしか動かないので、4 CPU のランナーではイベントのおよそ4分の3が消えます。リングバッファの取りこぼしの数も recursion_misses も 0 のままです。イベントを待つテストは時間切れになり、どのテストが落ちるかは実行ごとに変わります。スレッドがたまたまどの CPU で動いたかで決まるからです。
報告のあったもの
- Inspektor Gadget:新しい 24.04 のイメージに当たった統合テストのジョブは、すべて
TestTraceExecとTestTraceOpenで落ちました。前のイメージでは、111 のジョブのうち関係のない失敗が7つだけでした。このプロジェクトは、それらのジョブをubuntu-22.04に移しました(inspektor-gadget #5891)。 - tinytap:7.0.0-1017-azure では、CPU 0 以外のすべての CPU で
writeのイベントが失われました。bpftraceだけで数えても、writeの呼び出しは CPU 0 で 2000、CPU 1〜3 で 0 でした。ftrace はすべてを数えていて、readとwritevは欠けていませんでした(tinytap #440)。こちらもキャプチャのジョブをubuntu-22.04に移しました。
直し方:eBPF のジョブを ubuntu-22.04 で動かす
jobs:
ebpf-tests:
runs-on: ubuntu-22.04
22.04 のイメージのカーネルは 6.8.0-1070-azure で(イメージの readme)、このバックポートは入っていません。ubuntu-24.04 に固定しても直りません。新しいカーネルが入っているのがそのイメージだからです。直ったカーネルがイメージに入るか、GitHub が 22.04 を終えるまで、BPF プログラムを読み込むジョブだけを移します。
runner-images のメンテナーはこれを再現したうえで、ビルドの仕組みでは古いカーネルに固定できず、このためにイメージの更新を止めることもしないと答えています。直しは Ubuntu から来るしかありません。Ubuntu のカーネルには取り消しのパッチが送られていて(SRU のパッチ・10月26日)、Launchpad のバグ 2170225 は11月4日の時点でまだ New でした。上流の 7.0 と 7.1 の安定版はサポートが終わっているので、そちらで直ることはありません。
見分け方
- ジョブで
uname -rを表示します。7.0.0-1017-azure にはこのバグがあります。tinytap は 7.0.0-1019-azure と 7.0.0-1014-aws でもwriteのイベントが欠けるのを見ていて、linux-azure の 7.0.0-1020.21 にも、11月4日の時点で取り消しは入っていません(tinytap #444)。 tasksetで呼び出す側を別々の CPU に固定しながら、bpftraceでtracepoint:syscalls:sys_enter_*の1つのシステムコールを数えます。当たるカーネルでは1つの CPU の呼び出ししか数えられず、ftrace にはすべてが見えています。- 再実行しても直りません。いまの 24.04 と 26.04 のイメージはすべてこのカーネルです。
- GitHub のランナーだけではありません。Ubuntu の 7.0 のカーネルを使うセルフホストのランナーやサーバーにも同じバックポートが入っていることがあり、そこでもツールはエラーを出さずにイベントを取りこぼします。
ほかの 26.04 の失敗
- Ubuntu 26.04 の PyCQA/bandit-action:アクションが Python 3.8(v1.0.1 は 3.9)を変える入力なしにセットアップし、setup-python の 26.04 向けのビルドは 3.10 からです。Bandit を自分のステップで動かします。
- Ubuntu 26.04 の Docker で Postgres が起動しない:7.0.0-42 などの新しいカーネルはコンテナのプロセスを
docker-default//&unconfinedとして動かすので、プロセスどうしでシグナルを送れず、gosuが CPU 100% で止まります。いまのところ報告はセルフホストのランナーです。 - Ubuntu 26.04 の wg-quick の「Permission denied」:新しい AppArmor のプロファイルで、
wg-quickとwgは設定とキーのファイルを/etc/wireguard/の下でしか読めないので、ワークスペースのwg0.confはsudoでも落ちます。 - Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ。
- 「coreutils: unknown program」:基本のコマンドのほとんどが uutils です。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、Linux は Linus Torvalds の登録商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・Linux Foundation・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の Docker で Postgres が起動しない · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English