この記事は「渡部 Advent Calendar 2025」の11日目の記事です。
IOの宛先IP:PortとSocketのフラグを出すやつを書いた。https://t.co/PzKsos2tOW
— RyuichiWatanabe@gurasan (@ryuichi_1208) 2025年9月7日
ブロッキング I/O とは、I/O 操作が完了するまで処理が止まってしまう操作で、たとえば recv() や send() の完了待ちが該当します。これが大量発生すると、Python のイベントループや非同期処理のパフォーマンスが大幅に落ちてしまいます。ちゃんと気をつけてアプリケーションを書けば完全に回避できるかというとそんなこともなくてライブラリ内でブロッキング操作が実行されていたりすることもあります。blocking-io-check-py は eBPF を使って 実行中の Python プロセスの I/O を追跡し、
などをリアルタイムに表示できるという感じのものになります。
仕組み
eBPF を使ったトレースで割と低負荷でリアルタイム分析が可能だったりします。コアとなるのは C で書かれたトレースコード(trace.bpf.c)で、カーネルの関数呼び出しをフックして I/O 系のイベントを収集しています。自分たちが動かしているアプリで試してみたのですがCPU使用率もレイテンシーも低トラフィックという条件ではありますがほぼ影響がなくてすごいとなったりしていました。w
トレース対象
- ソケット送受信系: sendto, recvfrom, sendmsg, recvmsg など
- ファイル記述子ベースの read/write
- ソケットやファイルディスクリプタによる I/O
- epoll 系のイベント
などもチェックします。
まとめ
実用性はちょっとまだまだ怪しいですがこういう調べ方もできそうだなという学びになりました。ちなみにPythonのasyncioではブロッキング操作も別スレッドに逃して処理を進めるということもできたりするので必ずしも問題があるわけではないというので難しいなという感じです。