正しい xargs 並列使用法

正しい xargs 並列使用法

私はxargs呼び出しPythonスクリプトを使用して約3000万の小さなファイルを処理しています。並列化プロセスを使用したいですxargs。私が使用するコマンドは次のとおりです。

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

基本的にConvert.py小学校程度は読めますよJSONファイル(4kb)を処理し、別の4kbファイルを作成します。私は40個のCPUコアを持つサーバーで実行しています。そして、サーバーではCPUを多く使用する他のプロセスは実行されません。

htopを監視して(しかし、CPUのパフォーマンスを監視する他の良い方法はありますか?)、-P 40予想ほど速くないことがわかりました。時々、すべてのコアが停止し、3〜4秒間ほぼゼロに低下し、60〜70%に回復します。その後、並列プロセスの数をに減らそうとしましたが、まだ-P 20-30速度はそれほど高速ではありません。理想的な動作は線形加速です。 xargsを並列に使用するための提案はありますか?

答え1

私はあなたの問題が次のとおりです。Python。各ファイルにどのような処理が行われるかは明らかではありませんが、メモリ内のデータだけを処理すると仮定すると、3千万個のPython仮想マシン(インタプリタ)が実行され、ランタイムが支配するようになります。

単一のファイルの代わりにファイルのリストを取得するようにPythonプログラムをリファクタリングできる場合、パフォーマンスは大幅に向上します。その後、xargsを使用してパフォーマンスをさらに向上させることができます。たとえば、40個のプロセスがあり、それぞれ1000個のファイルを処理します。

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

これはPythonが悪くて遅い言語だと言うものではありません。それは悪くて遅い言語です。開始時刻に最適化されていません。これは、仮想マシンベースの言語または解釈された言語と見なすことができます。たとえば、Javaははるかに悪いです。プログラムがCで書かれている場合は、各ファイルを処理するために別々のオペレーティングシステムプロセスを起動するのにまだコストがかかりますが、コストははるかに少なくなります。

そこから-Pデータの読み書き中にアイドルプロセッサを利用するために、プロセスの数を増やして速度をわずかに上げることができるかどうかを確認できます。

答え2

したがって、まず制約を考慮してください。

各職業別の制限はどうなりますか? I/Oなら大丈夫です。おそらくI / O制限に達するまで、CPUコアごとに複数のジョブを実行できますが、CPU集約的であれば、無意味にCPUコアよりも多くのジョブを同時に実行するよりも悪くなります。

これらのことの私の理解はGNUパラレルジョブキューなどをより効果的に制御できます。

バラよりGNUパラレル対&(背景を意味する)対xargs -P2つがどのように異なるかについての詳細な説明をご覧ください。

答え3

他の人が言ったように、I / Oバインドされていることを確認してください。また、xargsのマニュアルページでは-nwithの使用を提案していますが、並列に実行されているプロセスの数については言及していません-PConvert.py

提案として、I / Oバインドされている場合はSSDブロックデバイスを試すか、tmpfsで試してみることができます(もちろん、この場合、tmpfsによるスワップを避けるために十分なメモリがあることを確認する必要があります)。 (私の考えでは)そして最初にデータをコピーするオーバーヘッドもあります。

関連情報