GitHubで公開されたオープンソースツール「Forkrun」は、GNU Parallelやxargsの後継となるNUMA対応の並列実行ツール。14コア28スレッドのi9-7940xで実施した100M行のベンチマークでは、ファイル処理で最大415倍、stdin passthrough時に最大256倍の高速化を実現。CPU利用率ではGNU Parallelの6%に対し95~99%を達成している。
GNU Parallelやxargsといった既存の並列化ツールは、正規表現パースとIPC(プロセス間通信)のオーバーヘッドにより、マルチソケットサーバーで処理がボトルネックになっていた。特にNUMA(Non-Uniform Memory Access)アーキテクチャを持つ最新CPUでは、ソケット間のメモリトラフィックが無視できず、多くのコアが遊休状態に陥るという問題があった。Forkrunはこうした物理層の制約を設計段階から考慮し、完全に異なるアプローチで開発された。
Forkrunの高性能の秘密は、メモリのローカリティを保証する「Born-Local NUMA」設計にある。スレッド間の競合を排除し、各NUMAノード上で独立した処理を実行することで、不要なクロスソケット通信を最小化する。
主な設計原則
splice()でstdinからメモリバッファにデータを直接転送set_mempolicy(MPOL_BIND)で各チャンクを対象NUMAノード上に事前配置Forkrunはバッチサイズを自動調整する機能を備えている。ユーザーが-nや-jパラメータを指定する必要なく、実行環境に応じた最適な設定が自動的に適用される。
| ワークロード | Forkrun | GNU Parallel | 高速化倍率 | 備考 |
|---|---|---|---|---|
| デフォルト(配列+完全引用符、no-op) | 24 M行/s | 58 k行/s | 415× | Forkrun標準モード |
| 出力順序保証(-k、no-op) | 24.5 M行/s | 57 k行/s | 430× | 順序付けはForkrunでは無料 |
| echo(行引数) | 22.6 M行/s | 55 k行/s | 410× | 典型的なシェルコマンド |
| printf出力(I/O処理重) | 12.8 M行/s | 58 k行/s | 220× | フォーマット+出力オーバーヘッド |
| stdin passthrough(-s、no-op) | 893 M行/s | 6.05 M行/s | 148× | ストリーミング・splice使用 |
| 524288バイトバッチ(-b) | 大容量バッチ処理対応 | 6.02 M行/s | 256× | カーネルリミット到達 |
| ツール | 利用率 | 有効コア | 解説 |
|---|---|---|---|
| Forkrun | 95~99% | 全コア稼働 | 全コアが実際の作業を実行 |
| GNU Parallel | 6% | 一部のみ | コア遊休が発生 |
Forkrunは単一のBashファイルで配布され、埋め込まれた自己抽出型のCエクステンション付属。外部依存なし(Perl、Python不要)。
source <( curl -sL https://raw.githubusercontent.com/jkool702/forkrun/main/frun.bash )
スクリプトをソースすると、シェル環境にC loadable builtinが設定される。
# カスタムBash関数を並列化
frun my_bash_func < inputs.txt
# パイプベースの入力、順序付き出力
cat file_list | frun -k sed 's/old/new/'
# stdin passthrough、順序付き出力
frun -k -s sort < records.tsv
# stdin passthrough、ユニークな出力名
frun -s -I 'gzip -c >{ID}.gz' < raw_logs
埋め込まれたCエクステンション(forkrun_ring.c)はGitHub Actionsで透過的にコンパイルされ、Base64 blobとして挿入される。git blameを追跡することで、バイナリが公開CI実行まで遡れるため、隠れた悪意のあるコードが含まれていないことを保証できる。
Forkrunは高頻度・低レイテンシーのワークロードを深いNUMAハードウェアで実行する際に最適。既存ツールがIPCオーバーヘッドとクロスソケットデータ移行によるコア遊休を避けられない領域で威力を発揮する。
この記事はAI業界の最新動向を速報でお届けする「AI Heartland ニュース」です。