web-dev-qa-db-ja.com

`tar -xf`のパフォーマンス(ブロックサイズ関連)

私は最近、tar -xfのパフォーマンスの最適化、つまりファイルのuntarに取り組んでいます。

デフォルト設定では、tar -xfwritesを呼び出して、一度に10KiBの出力をチャンクで書き込むことに気付きました。ただし、これにより、現在の設定では重大なストレージペナルティが発生します(フラッシュストレージのI/OでO_DIRECTフラグを使用)。

tarが出力ファイルに書き込むチャンクサイズを増やす方法はありますか? -bパラメーターで遊んでいたところ、tar -b 512 -xvfを実行すると、パフォーマンスが2xだけ向上することに気付きました。この場合、これは有効な使用法ですか? (tarファイルはデフォルト設定で作成されました。)

tarのスループットを改善するために他にできることはありますか?

2
Zz'Rot

Tarの-bオプションは、tarがデバイスに書き込むブロックサイズを制御するために使用されたため、まさにそれが必要です。ただし、マニュアルページtar(1)に関する-b 512は、512 * 512 = 262144のブロックサイズを意味します。すべてのブロックサイズは、tar出力を書き込むデバイスが処理できる有効なものです。歴史的に、これはtarコマンドが最初に作成されたさまざまなテープドライブに必要でした。

2
ikrabbe

starを除くすべてのtar実装には、1990年以降にstarに組み込まれているFIFOによって対処されるパフォーマンスの問題があります。

Starはデフォルトで8MB FIFOを作成します。これは、starも2つのプロセスにフォークするため、パフォーマンスの向上に役立ちます。一方のプロセスはアーカイブを読み取り、もう一方のプロセスはtar抽出タスクを実行します。最新のOSを使用していて、最新のテープデバイスを使用している場合は、マシンの物理メモリの半分までの大きなFIFOサイズを指定することをお勧めします。star fs=オプションを参照してください。最新のテープドライブでは、fs=256More moreをお勧めします。これにより、ストリーミングテープモードが不可能な場合にテープを再配置することによる通常のテープ摩耗の問題が大幅に軽減されます。

実際のテープデバイスを使用している場合は、作成時にすでにブロックサイズを増やす必要があります。テープの移植性のために、6kBを超えるブロックサイズを使用しないように注意してください。ローカルOSとドライブがより大きなブロックサイズをサポートしている場合(およびFIFOサイズ)の増加だけでなく)、より大きな値を使用します(スターのマニュアルページを参照)。

ZFSのようなコピーオンライトファイルシステムを使用している場合、またはファイルシステムバッファの実装が遅いOS(Linuxなど)を使用している場合は、starinsecure modeに切り替えることができます。 gtarでのみ使用できます。これを行うには、-no-fsyncを追加します。 Solarisおよびufsでは、スターのデフォルトのセキュアモードはパフォーマンスを10%未満低下させますが、ZFSおよび低速のLinuxバッファー実装では、このセキュアモードはパフォーマンスを400%低下させます。

1
schily