以下の内容はhttps://ryuichi1208.hateblo.jp/entry/2025/12/11/000000より取得しました。


【Python】ブロッキングIOが発生しているかを見れるツールを書いた

この記事は「渡部 Advent Calendar 2025」の11日目の記事です。


github.com

ブロッキング 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 系のイベント
    • どのようにイベントループで使われているか
    • またブロッキングかどうかを判定するために、
      • ノンブロッキングフラグ(O_NONBLOCK)の有無
      • ソケットの状態フラグ

などもチェックします。

まとめ

実用性はちょっとまだまだ怪しいですがこういう調べ方もできそうだなという学びになりました。ちなみにPythonのasyncioではブロッキング操作も別スレッドに逃して処理を進めるということもできたりするので必ずしも問題があるわけではないというので難しいなという感じです。

参考

manpages.ubuntu.com

man7.org




以上の内容はhttps://ryuichi1208.hateblo.jp/entry/2025/12/11/000000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14