私は最近、tar -xf
のパフォーマンスの最適化、つまりファイルのuntarに取り組んでいます。
デフォルト設定では、tar -xf
がwrite
sを呼び出して、一度に10KiBの出力をチャンクで書き込むことに気付きました。ただし、これにより、現在の設定では重大なストレージペナルティが発生します(フラッシュストレージのI/OでO_DIRECT
フラグを使用)。
tar
が出力ファイルに書き込むチャンクサイズを増やす方法はありますか? -b
パラメーターで遊んでいたところ、tar -b 512 -xvf
を実行すると、パフォーマンスが2x
だけ向上することに気付きました。この場合、これは有効な使用法ですか? (tar
ファイルはデフォルト設定で作成されました。)
tar
のスループットを改善するために他にできることはありますか?
Tarの-b
オプションは、tarがデバイスに書き込むブロックサイズを制御するために使用されたため、まさにそれが必要です。ただし、マニュアルページtar(1)に関する-b 512
は、512 * 512 = 262144のブロックサイズを意味します。すべてのブロックサイズは、tar出力を書き込むデバイスが処理できる有効なものです。歴史的に、これはtarコマンドが最初に作成されたさまざまなテープドライブに必要でした。
star
を除くすべてのtar実装には、1990年以降にstarに組み込まれているFIFO
によって対処されるパフォーマンスの問題があります。
Starはデフォルトで8MB FIFOを作成します。これは、starも2つのプロセスにフォークするため、パフォーマンスの向上に役立ちます。一方のプロセスはアーカイブを読み取り、もう一方のプロセスはtar
抽出タスクを実行します。最新のOSを使用していて、最新のテープデバイスを使用している場合は、マシンの物理メモリの半分までの大きなFIFOサイズを指定することをお勧めします。star fs=
オプションを参照してください。最新のテープドライブでは、fs=256M
ore moreをお勧めします。これにより、ストリーミングテープモードが不可能な場合にテープを再配置することによる通常のテープ摩耗の問題が大幅に軽減されます。
実際のテープデバイスを使用している場合は、作成時にすでにブロックサイズを増やす必要があります。テープの移植性のために、6kBを超えるブロックサイズを使用しないように注意してください。ローカルOSとドライブがより大きなブロックサイズをサポートしている場合(およびFIFOサイズ)の増加だけでなく)、より大きな値を使用します(スターのマニュアルページを参照)。
ZFSのようなコピーオンライトファイルシステムを使用している場合、またはファイルシステムバッファの実装が遅いOS(Linuxなど)を使用している場合は、star
をinsecure mode
に切り替えることができます。 gtar
でのみ使用できます。これを行うには、-no-fsync
を追加します。 Solarisおよびufs
では、スターのデフォルトのセキュアモードはパフォーマンスを10%未満低下させますが、ZFSおよび低速のLinuxバッファー実装では、このセキュアモードはパフォーマンスを400%低下させます。