かなり小さなファイルがたくさんある(何千もの)ディレクトリをタールボールに保存する方法は2つあります。
- すべてのファイルを
root
tarballに保存 - ディレクトリ自体を 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)にアップロードするのが困難です。
答え2
これは主に使用しているファイルシステムによって異なります。特定の名前のディレクトリエントリがあることを確認するために、O(n)ルックアップが必要なext2やその他の古いファイルシステムでは、フラットディレクトリが遅くなる可能性があります。 ext3/4およびその他の最新のファイルシステムは、より大きなディレクトリにツリーベースのインデックスを使用するため、O(log n)ルックアップ時間のみが必要です。
パッケージング(tar -cf)についても同じ質問をすることができますが、私にとってはそれほど重要ではありません。
一方、Tarの生成は、ディスクIOと実装が先読みを実行するかどうかに大きく依存します。小さなファイルはランダムな読み取りを大量に生成し、単一ファイルの先読みは小さなファイルに対しては機能しません。私はすでに書いたパスタこのユースケースの特別な実装でファイルを読み取る順序を最適化し、複数のファイルに対して先読みを実行することが可能です。
答え3
抽出時間の違いは、抽出に必要な合計時間に比べて少なくとも規模(数千のファイル)では大きくありません。 tar形式は非常に簡単です。デフォルトでは、ヘッダーとファイル、ヘッダーとファイルを関連付けます。したがって、抽出すると、tarはデータの圧縮を解除します。特に、既存のファイルを上書きすることに気にしないため、確認時間を無駄にしません。 (絶対パスを持つタールボールは少し異なって処理されますが、これはとにかく悪いタール慣行です)。