xargs並列使用の修正


9

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

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

基本的にConvert.pyは、小さなjsonファイル(4kb)を読み取り、いくつかの処理を行って、別の4kbファイルに書き込みます。CPUコアが40のサーバーで実行しています。また、このサーバーでは他のCPU負荷の高いプロセスは実行されていません。

htopを監視することで(ところで、CPUパフォーマンスを監視する他の良い方法はありますか?)、私はそれ-P 40が期待されるほど速くないことを発見しました。場合によっては、すべてのコアがフリーズして3〜4秒間ほぼゼロになり、その後60〜70%に回復します。次に、並列プロセスの数をに減らしてみますが-P 20-30、まだそれほど高速ではありません。理想的な動作は、線形スピードアップである必要があります。xargsの並列使用に関する提案はありますか?


6
I / Oの影響を受ける可能性があります。システムはファイルを十分に速く読み取ることができません。40以上を開始してみてください。この方法では、一部のプロセスがI / Oを待機する必要がある場合に問題ありません。
Ole

スクリプトはどのような処理を行いますか?関係するデータベース/ネットワーク/ io?どれくらいの時間がかかりますか?
Fox、

1
@OleTangeの2番目です。コアと同じ数のプロセスを実行し、タスクがIOバインドされている場合、これは予想される動作です。最初に、コアはタスクのIOを待って(スリープ)、次に処理してから繰り返します。さらにプロセスを追加すると、現在物理コアで実行されていない追加のプロセスによって並列IO操作が開始され、終了すると、コアのスリープ期間が解消または少なくとも短縮されます。
PSkocik 2015

1-ハイパースレッディングを有効にしていますか?2-そこにあるものでは、log.txtは実際にconvert.pyを呼び出すたびに上書きされます...これが意図された動作であるかどうかはわかりません。
Bichoy

xargs -Pそして、>理由はハーフラインの問題で競合状態のために開放されてgnu.org/software/parallel/...代わりにGNUパラレルを使用すると、その問題を持っていません。
Ole

回答:


4

私はあなたの問題がpythonであることを喜んで賭けます。各ファイルでどのような処理が行われているのかは述べていませんが、データのメモリ内処理だけを実行している場合、実行時間は3,000万のpython仮想マシン(インタープリター)を起動することによって支配されます。

Pythonプログラムを再構築して、ファイルのリストを1つだけではなく取得できる場合は、パフォーマンスが大幅に向上します。その後、xargsを使用してパフォーマンスをさらに向上させることができます。たとえば、40個のプロセスがあり、それぞれが1000個のファイルを処理しています。

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

これはpythonが悪い/遅い言語だと言っているのではありません。起動時間に最適化されていないだけです。これは、仮想マシンベースまたはインタープリター型の言語で表示されます。たとえば、Javaはさらに悪いでしょう。プログラムがCで書かれている場合でも、各ファイルを処理するために個別のオペレーティングシステムプロセスを開始するコストはかかりますが、それよりはるかに少なくなります。

そこから-P、おそらくデータの読み取り/書き込み中にアイドル状態のプロセッサを利用するためにプロセス数を増やすことによって、もう少し速度を絞り出すことができるかどうかをいじることができます。


1

したがって、最初に制約を検討します。

各ジョブの制約は何ですか?それは私だ場合/ Oの操作を行うことができ、おそらくあなたはI / Oの制限を打つまでのCPUコアアップごとに複数のジョブに逃げるが、それのCPUが集中的ならば、そのは、同時に使用すると、CPUコアを持っているよりもより多くのジョブを実行している無意味より悪いことになるだろう。

これらのことについての私の理解は、GNU Parallelがジョブのキューなどをよりよく制御できるようになるということです。

2つの違いの詳細については、GNUパラレルvs&(背景を意味する)vs xargs -Pを参照してください。


0

他の人が言ったように、あなたがI / Oバウンドであるかどうかを確認してください。また、xargsのmanページでは-nwithの使用が推奨されていますが、並列で実行されているプロセス-Pの数については言及していませんConvert.py

提案として、I / Oバウンドの場合は、SSDブロックデバイスを使用するか、tmpfsで処理を試みることができます(もちろん、この場合、十分なメモリを確認して、tmpfsによるスワップを回避する必要があります)プレッシャー(と思います)と、そもそもデータをデータにコピーするオーバーヘッド)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.