質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

4回答

11505閲覧

tarコマンドでの圧縮について

ku24962001

総合スコア13

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2016/10/15 16:43

編集2016/10/15 16:45

###前提・実現したいこと
大きなサイズのファイル圧縮を高速化

###発生している問題・エラーメッセージ
数TBあるサイズのバイナリファイルをtarとgzipで圧縮し、退避しようとしています。
対象ファイルは複数あるため、時間効率を考えてtarコマンド(tar -zfc)をバックグラウンドで10プロセスほどで流していますが、
こうすると1プロセスあたりの処理量が極端に落ちます。

tar処理を理解していないため、どのようにしてメモリを使用しているのかが
分かりませんが、効率よく比較的高速に圧縮できる方法をご教授いただきたいです。

特にtarコマンドにこだわるつもりはないので、ほかにスマートな方法が
あればそちらを教えていただけると幸いです。

###試したこと
・pigzを利用しての圧縮

###補足情報(言語/FW/ツール等のバージョンなど)
・cpuの高騰は見られない
・メモリの使用率が跳ねる。swapはないがキャッシュは高い(vmstat)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Linuxでは空きメモリがあるかぎり原則としてディスクキャッシュに割り当てられるので、これが増えても普通気にしなくていいです。今回のボトルネックはメモリではなくI/Oだと思われます (以上、回答投稿後に追記)。


  1. 大サイズのファイルを圧縮して保存
  2. できたファイルを他のマシンにコピー
  3. コピー先で展開

最後のはすぐには必要ないかもしれませんが、とにかくどのステップでも、新たなディスク領域への保存が行われます。おまけにディスク領域をNASで確保していたりすると、トラフィックも大変なことになります。

sshを使って退避先マシンに直接コピーすれば、途中のステップを省いて作業ディスク領域とディスクI/Oやトラフィックを節約できます。

$ tar cf - パス... | gzip -6 -c - | ssh ユーザ@退避先ホスト 'cat > ファイル'

これで、退避先ホストファイルに圧縮されたアーカイブが直接コピーされます。

次のようにすれば、退避先で展開までできてしまいます。途中のアーカイブを保存するディスク領域とそのためのディスクI/Oも不要です。

投稿2016/10/15 23:46

編集2016/10/16 00:39
ikedas

総合スコア4229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ku24962001

2016/10/17 00:19

ご回答有難うございます。 退避先へのネットワークが1Gbp程度なので、 圧縮後に転送したほうが早いと考えていました。 ご回答いただいた方法でも検証してみたいと思います。
guest

0

ベストアンサー

otnさんが仰るように、HDDの読み書き(特に書き込み)がボトルネックになっていると思われます。
SSDでもシーケンシャルリードライトでなければある程度の速度劣化があり、HDDの場合特に顕著に速度が落ち込みます。

バックグラウンドで10プロセス

1つずつ圧縮コマンドを実行すると、
人が見張らなければならないのでバックグラウンドを利用されたのかと思います。
コマンドA→BのようにAの終了を待ってBを実行させる手段は色々とあります。

例えばBashなら各コマンドはecho hoge && echo pikoのように&&で括ると、
1つ目のコマンドecho hogeの実行が正常終了したことを確認して2つ目のコマンドecho pikoが実行されます。

lsやfindコマンドからパイプでxargsコマンドにバトンタッチしても良いでしょうし、
シンプルにls > hoge.shのようなコマンドでファイルに書き出してから、テキストエディタの矩形洗濯を使って10個単位のtarコマンドに変更して実行するという手段もあります。

投稿2016/10/15 18:11

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ku24962001

2016/10/17 00:26

ご回答が有難うございます。 ボトルネックがI/Oにある点について承知しました。 そうすると、tar.gzの出力先をSSDにすることで多少の向上が見られそうなので、 少し検討と検証をしてみたいと思います。 コマンドのについてもご教授有難うございます。参考にさせていただきます。 いずれにせよ何らかの方法でシリアルに処理したほうが早いということでしょうか。
miyabi-sun

2016/10/17 07:14

ハードディスクはレコードと似た仕組みです。 磁気の円盤を高速回転(約秒間100回転)させ、読み書きできる魔法の針(磁気ヘッド)を使って読み書きしています。 多数のプロセスが同時に書き込もうとすると、ヘッドの移動ばかりに時間が取られて書き込みに使う時間が殆どなくなってしまいます。 http://www.ssd.tank.jp/sokudo.html 1プロセスはシーケンシャル、沢山のプロセスを同時に走らせるとランダム4Kまで効率が低下する…くらいの認識で読んでみてください。 流石にPCも馬鹿ではないので即ランダム4K相当になるようなことは無いですが、 読み書きが遅いと感じたらシリアルでの処理を検討してみる価値はあります。
guest

0

メモリもですが、ディスクI/Oネックになるので、それぞれ物理的に別のディスクだと言うことでも無い限りは、シリアルに実行した方が早いのではないかと思います。

投稿2016/10/15 16:57

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ku24962001

2016/10/17 00:32 編集

ご回答有難うございます。 複数のHDDを束ねて、LVMで用途に応じて領域を切っているような環境になります。 ターゲットファイルとその圧縮先は別のボリュームにしています。 I/Oがボトルネックの可能性が高いとのことなので、 環境内のSSD領域を切ってシリアル処理である程度改善できないか、検証してみます。
guest

0

数TBあるサイズのバイナリファイルをtarとgzipで圧縮し、退避しようとしています。
対象ファイルは複数あるため、時間効率を考えてtarコマンド(tar -zfc)をバックグラウンドで10プロセスほどで流していますが、

a.bin, b.bin, c.bin => abc.tar.gz

が、やりたい事で合ってますでしょうか?

もし

a.bin => a.tar.gz
b.bin => b.tar.gz
c.bin => c.tar.gz

が、やりたい事であれば tar は不要です。
gzipだけでいいので、gzipだけにすれば少し早くなると思います。

投稿2016/10/16 03:23

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ku24962001

2016/10/17 00:16

ご回答有難うございます。 実施したいことは前者になります。 20GB前後のファイルが複数あり、トータルでTBある感じになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問