多くのファイルのtar -xfパフォーマンス

多くのファイルのtar -xfパフォーマンス

かなり小さなファイルがたくさんある(何千もの)ディレクトリをタールボールに保存する方法は2つあります。

  1. すべてのファイルをroottarballに保存
  2. ディレクトリ自体を tarball に保存し、ファイルをディレクトリ内に保存します。

これはtarの解凍速度()にパフォーマンスに影響しますかtar -xf

私は2番目のアプローチがより速くなると想像できますが(おそらくより速いでしょう)、tarがどのように機能するかを正確に知らないので、質問です。

コメント:

  • Wrap()についても同じ質問をすることができますが、tar -cf私にとってはそれほど重要ではありません。
  • もちろん、いくつかのテストを直接実行することもできますが、実際にはより速い場合は理論的な説明が必要です。

ベストアンサー1

理論的な答えではありませんが、テストしてみようかと思いました。私はFreeBSD 10.3を実行するDell 1955ブレードを持っています。したがって、これはbsdtarにのみ当てはまります。 2つのZFSファイルシステムを作成して別々に(/zroot/tar1および)保持/zroot/tar2し、次のようにして任意のコンテンツを含む4000個の1MBファイルを作成しました。

for i in {1..4000}; do
    dd if=/dev/urandom of=/zroot/tar1/tar_test.$i bs=1M count=1
done

次に、この4000個のファイルを「mytar」のあるディレクトリにコピーしました/zroot/tar2/mytar(したがって、毎回まったく同じデータを使用します)。


まず、すべての「ゆるい」ファイルを含むファイルシステムでそのファイルをすべてアーカイブしてから削除し(tarファイルのみを残して)、アーカイブをキャンセルしました。私は次のようにこれを5回実行しました。

tar cf 1.tar *  0.76s user 16.98s system 6% cpu 4:52.68 total
tar cf 1.tar *  0.74s user 16.51s system 5% cpu 4:51.63 total
tar cf 1.tar *  0.94s user 16.19s system 5% cpu 4:55.50 total
tar cf 1.tar *  0.82s user 16.15s system 5% cpu 4:52.72 total
tar cf 1.tar *  0.69s user 16.22s system 5% cpu 4:52.00 total

tar xf 1.tar  0.44s user 10.52s system 3% cpu 4:54.92 total
tar xf 1.tar  0.39s user 10.67s system 3% cpu 5:03.59 total
tar xf 1.tar  0.39s user 10.51s system 3% cpu 4:52.85 total
tar xf 1.tar  0.46s user 10.45s system 3% cpu 5:01.28 total
tar xf 1.tar  0.44s user 10.59s system 3% cpu 5:01.29 total

最後の抽出後、tarファイルを削除し、/zroot/tar2同じテストを再実行するために場所を変更しました。今回は、同じ4000ファイルを含むディレクトリでのみ行われました。

tar cf 2.tar mytar  0.72s user 16.51s system 5% cpu 5:25.84 total
tar cf 2.tar mytar  0.61s user 16.19s system 5% cpu 5:18.19 total
tar cf 2.tar mytar  0.68s user 16.14s system 5% cpu 5:01.50 total
tar cf 2.tar mytar  0.65s user 15.87s system 5% cpu 4:41.64 total
tar cf 2.tar mytar  0.68s user 16.71s system 5% cpu 5:07.72 total

tar xf 2.tar  0.42s user 10.39s system 3% cpu 4:57.50 total
tar xf 2.tar  0.41s user 10.41s system 3% cpu 4:50.07 total
tar xf 2.tar  0.47s user 10.26s system 3% cpu 4:57.25 total
tar xf 2.tar  0.58s user 10.50s system 3% cpu 5:00.45 total
tar xf 2.tar  0.40s user 11.34s system 4% cpu 4:50.24 total

平均時間を計算すると、次のような結果が得られます。

+===========+=========+===========+
|           |  Loose  | Directory |
+===========+=========+===========+
| Archive   | 4:52.91 | 5:06.97   |
+-----------+---------+-----------+
| Unarchive | 4:58.79 | 4:55.1    |
+-----------+---------+-----------+

したがって、ディレクトリを使用すると、ファイルのアーカイブはやや改善されますが、初期アーカイブのペナルティが少し高いことがわかります。


私は同じことをやり直しましたが、trussを使用して各タスクの要約を取得し、平均してシステムコールに費やされた合計時間を得ました。

+===========+=======+===========+
|           | Loose | Directory |
+===========+=======+===========+
| Archive   | 04:43 | 04:58     |
+-----------+-------+-----------+
| Unarchive | 04:56 | 04:50     |
+-----------+-------+-----------+

read() システムコールに費やされた最も多くの時間 (やはり平均):

+===========+=======+===========+
|           | Loose | Directory |
+===========+=======+===========+
| Archive   | 03:53 | 04:07     |
+-----------+-------+-----------+
| Unarchive | 04:37 | 04:36     |
+-----------+-------+-----------+

アーカイブ解除の最大の利点は、より高速なread()呼び出しとより高速なlstat()呼び出しの組み合わせから来ます(lstatはstatに似ていますが、ファイルがシンボリックリンクの場合は追跡されず、代わりに関連するシンボリックリンク情報を返します)。 。

平均 lstat() の回数は次のとおりです。

+-------+-------+-----------+
|       | Loose | Directory |
+-------+-------+-----------+
| lstat |  8.57 |      0.97 |
+-------+-------+-----------+ 

これがあなたに役立つかどうかはわかりません。しかし、あなたの質問に興味を持って調査した後、私が見たことを共有し、誰かがより詳細に調査できるかどうかを知りたいと思いました。

以下は、各実行の要約ファイルへのリンクです。、彼らは興味を持っているべきです。

完全なトラッキングのサイズ(〜50 MB)のため、オンラインの永続的な場所(paste2.org/pastebin/etc)にアップロードするのが困難です。

おすすめ記事