gzip、pv、およびパイプを含むマルチスレッドxz - これは私が得ることができる最も効率的なものですか?

gzip、pv、およびパイプを含むマルチスレッドxz - これは私が得ることができる最も効率的なものですか?

xz今、マルチスレッドがサポートされていることを知ってうれしいです。

xz --threads=0

しかし、今は最大限に活用したいと思います。たとえば、gzipをxzに再圧縮するには、次のようにします。

gzip -d -k -c myfile.gz | pv | xz -z --threads=0 - > myfile.xz

これにより、プロセッサ使用率が高まりました(xzあたりCPU約260%、はい!)。

しかし:

  • gzipまだマルチスレッドではないことを知っています。
  • pvパイプまたはパイプラインが(IO?)スレッド数を制限できると思います。

これは本当ですか?それでは、より効率的にする方法はありますか(削除以外pv)?

ベストアンサー1

マルチスレッドオプションを使用すると、-T0xzに一度に2つのことを知らせることができます。 MTを使用するとは、次のことを意味します。待つすべての入力(データ)がメモリに読み込まれるまで、「並列」圧縮が開始されます。

テストを統合したら、段階的にパフォーマンスを分析しますpigz。 100Mファイルがありますf100

$  time xz -c  f100 >/dev/null

real  0m2.658s
user  0m2.573s
sys   0m0.083s

99%の時間が1つのコアを圧縮するのに費やされます。-T4(または)を使用して-T04つのコアをすべてアクティブにします。

$  time xz -c -T4 f100 >/dev/null

real  0m0.825s
user  0m2.714s
sys   0m0.284s

全体的な結果:300%高速で、コアあたりほぼ直線的です。 「ユーザー」の値は4で割る必要があり、これが報告/定義される方法です。 「sys」は今やいくつかのオーバーヘッドを示しています。実際には、ユーザーの1/4にsysを組み合わせたものです。

$  time gzip     -dc f100.gz >/dev/null
$  time pigz -p4 -dc f100.gz >/dev/null

これは0.5秒対0.2秒です。

$  time pigz -dc -p4 f100.gz | xz -c -T4 >out.xz

real  0m0.902s
user  0m3.237s
sys   0m0.363s

... 0.8 + 0.2 = 0.9減少。

そして複数のファイルしかし、それほど多くはありませんが、4つのシェルバックグラウンドプロセスを介して得ることができる最高の全体的な並列性です。ここでは、代わりに4つの25Mファイルを使用します。

for f in f25-?.gz; do time pigz -p4 -dc "$f" | xz -c -T0 >"$f".xz & done

0.7秒も速くなったようです。マルチスレッドがなくても、次の場合も同様ですxz

for f in f25-?.gz; do time gzip -dc "$f" | xz -c >"$f".xz & done

を使って簡単なクォータパイプ4個を設定するだけでも、を使ったのと&同じように0.8秒を得ることができますxz -T4

xz私のシナリオでマルチスレッドを有効にすることは、パイプライン全体を並列化するのと同じくらい重要です。これをPigzおよび/または複数のファイルと組み合わせることができれば、個々のステップ合計の1/4よりも少し早く得ることができます。

おすすめ記事