mixiユーザー(id:65933753)

2019年12月10日19:49

342 view

xargsの確保プロセス数の、awkなどのsystem関数を介した場合と、bourne shellで普通に呼んだ場合の違いについて

UNIXの並列処理といえばbourne shellビルトインのwaitかxargsだが、waitで固定多重もなかなかしんどいので、マシンの懐具合と相談しながら動ける(xargsの-Pオプションの0指定)xargsを選択した。

2000種類のgrep対象ファイル(各100-230行)をfオプションで指定し、固定定義ファイルに対しfgrepを繰り返し、結果を各ファイルに出力する、つまりバラバラなfgrepを2000回行うことがやりたかったわけだ。

busyboxにもxargsが入っているので、busyboxバイナリから起動すると、プロセスが並列で100プロセスが展開され、5分47秒で処理が完了した。
bourne shellを書き、shで呼んだ中でxargsを行っても結果は変わらないのだが、awkのsystem関数からshellやbusyboxバイナリを読んで実行した場合は、極めて遅くなる。
awk自身のプロセスからbusyboxの子プロセスを作って、さらにxargsがプロセスを確保しようとしても、4プロセス程度しか確保できずにうろつくのだ。
こりゃあ遅いわけだな。
固定値で8並列などにしても、4プロセス程度しか確保できない。
素直にawkを抜けてから実行した方がいい。

wait方式ならどうかというと、一応8並列で動くが、やはりawkのプロセスから無理矢理8プロセスを作りCPUを枯渇させながら動くので、素直にawkなどは抜けてから、普通にshellに戻ってxargsでコマンドを発行し、並列実行した方がいい。


0 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する