grasys blog
grasysブログ

圧縮コマンドのススメ

圧縮系コマンドの試験

弊社の長谷川の記事[圧縮形式検証(MongoDBのDumpがでかい!)]を見て「圧縮コマンドについてもっと知りたい!」と思い、居ても立っても居られなくなりました。さあshimichan、検証をしましょう。

ローカルに置くにしても、GCSへ上げるにしても、データサイズは極力小さくしておきたいものです。

人気コンテンツにもなるとバックアップデータが巨大になり、GCSなんかへデイリーでそのままバックアップしようものなら加速度的に料金もバカにできない大きさに膨れ上がります。

そんな訳でリソースの使用時間を極力減らしつつ(圧縮速度上げつつ)、圧縮効率も上げれないかな(もっと小さくできないかな)ー、ついでにいざという時のために伸張速度も早いと良いなー、という感じの視点で調べてみます。特に今回は大きなファイルを。

環境など諸々

今回は tar コマンドのドキュメントに載っている圧縮ツールの試験をしてみました。(LINK)

バージョン

バージョンについては、基本gceの centos7 のイメージにデフォルトで入ってる物を使用。

入ってないのは yum でササっと入れました。

拡張子コマンドバージョンdefault(GCE)
.gzgzip1.51.5
.bz2bzip21.0.6(yum)none
.lzlzip1.19(yum)none
.lzmalzma5.2.2(yum)none
.lzolzop1.03(yum)none
.xzxz5.2.25.2.2

環境

os : CentOS Linux release 7.5.1804 (Core)

カーネル : 3.10.0-862.14.4.el7.x86_64

ディスク:xfs でマウントしたHDD

使用するデータ : mongodumpで取得したそれぞれ1G, 5G, 10Gのバイナリデータ

1g_sample_dump5g_sample_dump10g_sample_dump
size1048136 byte5154744 byte10475816 byte

実施方法

  • time コマンドを使い、各データを3回圧縮・伸張を行って real の平均時間を出す。
  • 今回はデフォルトと –fast オプションの二つをそれぞれ実施。(lzma, xzについては非推奨なので、一つ上の -1 のcompression levelで実施しています)
  • 1G, 5G, 10Gのmongoのdumpデータをそれぞれ圧縮・伸張する
  • 圧縮速度・圧縮率・伸張速度の3つの観点で見てみます。
  • デフォルトがマルチコア対応のものは、条件を合わせるため全てシングルスレッドで試験

※ lzop については、 -U で他と同様、圧縮後に元ファイルを削除するオプションをつけて実施

※ bizipの オプションは厳密にはcompression levelではないけど、一応。。。

ひとまず実施結果

結果どーん。

圧縮速度

コマンド1g_sample_dump5g_sample_dump10g_sample_dump
gzip (-6)0h0m31.86s0h2m17.46s0h4m35.21s
gzip (–fast)0h0m11.86s0h0m58.9s0h1m59.36s
bzip2 (-9)0h1m34.48s0h7m45.12s0h15m43.78s
bzip2 (–fast)0h1m23.61s0h6m46.22s0h13m43.93s
lzip (-6)0h12m12.72s1h65m32.42s2h134m54.43s
lzip (–fast)0h0m23.21s0h1m51.59s0h3m47.4s
lzma (-T 1 -6)0h11m53.49s1h63m27.59s2h133m21.53s
lzma (-T 1 -1)0h0m42.05s0h3m24.48s0h6m49.97s
lzop (-3 -U)0h0m9.59s0h0m50.05s0h1m40.39s
lzop (–fast -U)0h0m9.04s0h5m0.57s0h13m34.83s
xz (-T 1 -6)0h12m24s1h65m40.22s2h133m32.43s
xz (-T 1 -1)0h0m43.81s0h3m30.86s0h7m12.14s

伸張速度

コマンド1g_sample_dump5g_sample_dump10g_sample_dump
gzip (-6)0h0m7.57s0h0m40.36s0h1m27.05s
gzip (–fast)0h0m7.95s0h0m44.08s0h1m31.25s
bzip2 (-9)0h0m33.37s0h2m31.42s0h5m0.2s
bzip2 (–fast)0h0m20.21s0h1m37.74s0h6m49.16s
lzip (-6)0h0m13.17s0h1m1s0h2m2.26s
lzip (–fast)0h0m13.34s0h1m3.17s0h2m9.12s
lzma (-T 1 -6)0h0m10.78s0h0m37.73s0h1m39.11s
lzma (-T 1 -1)0h0m9.19s0h0m43.81s0h1m30.32s
lzop (-3 -U)0h0m4.97s0h0m45.35s0h1m37.39s
lzop (–fast -U)0h0m4.83s0h4m17.91s0h13m31.61s
xz (-T 1 -6)0h0m12.21s0h0m57.82s0h1m52.18s
xz (-T 1 -1)0h0m10.57s0h0m50.68s0h1m43.31s

圧縮率

コマンド1g_sample_dump5g_sample_dump10g_sample_dump
gzip (-6)135,708 byte(12.95%)633,740 byte(12.29%)1,291,588 byte(12.33%)
gzip (–fast)152,584 byte(14.56%)702,816 byte(13.63%)1,419,108 byte(13.55%)
bzip2 (-9)98,488 byte(9.40%)492,268 byte(9.55%)1,000,812 byte(9.55%)
bzip2 (–fast)102,032 byte(9.73%)491,240 byte(9.53%)984,252 byte(9.40%)
lzip (-6)64,024 byte(6.11%)311,504 byte(6.06%)635,196 byte(6.06%)
lzip (–fast)87,668 byte(8.36%)410,000 byte(8.13%)851,788 byte(8.15%)
lzma (-T 1 -6)63,776 byte(6.08%)313,524 byte(6.08%)637,204 byte(6.08%)
lzma (-T 1 -1)80,380 byte(7.67%)365,428 byte(7.22%)756,620 byte(7.22%)
lzop (-3 -U)233,656 byte(22.29%)1,052,644 byte(20.07%)2,102,668 byte(20.07%)
lzop (–fast -U)233,852 byte(22.31%)1,053,744 byte(20.09%)2,104,680 byte(20.95%)
xz (-T 1 -6)63,784 byte(6.09%)63,784 byte(6.08%)63,784 byte(6.08%)
xz (-T 1 -1)80,392 byte(7.67%)80,392 byte(7.09%)80,392 byte(7.22%)

順位

ちょっと見辛いので順位を見てみます

1Gの圧縮速度5Gの圧縮速度10Gの圧縮速度1Gの伸張速度5Gの伸張速度10Gの伸張速度平均圧縮率
1位lzop (–fast -U)lzop (-3 -U)lzop (-3 -U)lzop (–fast -U)lzma (-T 1 -6)gzip (-6)lzip (-6)
2位lzop (-3 -U)gzip (–fast)gzip (–fast)lzop (-3 -U)gzip (-6)lzma (-T 1 -1)lzma (-T 1 -6)
3位gzip (–fast)lzip (–fast)lzip (–fast)gzip (-6)lzma (-T 1 -1)gzip (–fast)xz (-T 1 -6)
4位lzip (–fast)gzip (-6)gzip (-6)gzip (–fast)gzip (–fast)lzop (-3 -U)lzma (-T 1 -1)
5位gzip (-6)lzma (-T 1 -1)lzma (-T 1 -1)lzma (-T 1 -1)lzop (-3 -U)lzma (-T 1 -6)xz (-T 1 -1)
6位lzma (-T 1 -1)xz (-T 1 -1)xz (-T 1 -1)xz (-T 1 -1)xz (-T 1 -1)xz (-T 1 -1)lzip (–fast)
7位xz (-T 1 -1)lzop (–fast -U)lzop (–fast -U)lzma (-T 1 -6)xz (-T 1 -6)xz (-T 1 -6)bzip2 (-9)
8位bzip2 (–fast)bzip2 (–fast)bzip2 (–fast)xz (-T 1 -6)lzip (-6)lzip (-6)bzip2 (–fast)
9位bzip2 (-9)bzip2 (-9)bzip2 (-9)lzip (-6)lzip (–fast)lzip (–fast)gzip (-6)
10位lzma (-T 1 -6)lzma (-T 1 -6)lzma (-T 1 -6)lzip (–fast)bzip2 (–fast)bzip2 (-9)gzip (–fast)
11位lzip (-6)lzip (-6)xz (-T 1 -6)bzip2 (–fast)bzip2 (-9)bzip2 (–fast)lzop (-3 -U)
12位xz (-T 1 -6)xz (-T 1 -6)lzip (-6)bzip2 (-9)lzop (–fast -U)lzop (–fast -U)lzop (–fast -U)

さて検証

色々データを出してみたところで、色々みてみます。

圧縮速度

lzopについてはデータが大きくなると –fast よりデフォルトで動かす方が倍早いという結果に。

おなじみの gzip は圧縮率(12%〜15%)に関しては、相対的に順位こそ下ですが、全体的な速度としては5位以内に入っています。 –fast オプションをつけるとしっかり早くなってくれるので流石の安定感といったところです。

lzip と lzma はオプション無しだと使うのはなかなかしんどいかも。。。

伸張速度

全体的に伸張速度はそこまで気にする差ではないですね。

ただ、 bzip デフォルト(-6) & --fast と lzop --fast はデータが大きくなればなるほど大きくスピードが落ちている。

また、 lzop の方ですが、データが大きくなると –fast オプションの方がデフォルトのcompression levelより遅いという結果に。デフォルトの圧縮の速さはすごく見えますが gzip –fast とほぼ同じ。圧縮率が20%を超えているので、無理にlzopを使う必要はさなさそう。

圧縮率

しっかりと時間をかけてやれば、デフォルトの lzip , lzma , xz のLZMAアルゴリズムを使ったコマンドが同列の1位(差分±0.01)。ただ、オプション無しのこの3強は、圧縮速度がぶっちぎりで遅いのが難点(どれも10G圧縮に2時間超え)。あまりに大きいファイルに関しては、compress levelのオプション指定無しに運用するのはちょっと辛いかもですね。

ちなみに圧縮率と順位を並べてみるとこんな感じ。

順位コマンド平均圧縮率
1位lzip (-6)6.07%
2位lzma (-T 1 -6)6.08%
3位xz (-T 1 -6)6.08%
4位lzma (-T 1 -1)7.33%
5位xz (-T 1 -1)7.33%
6位lzip (–fast)8.15%
7位bzip2 (-9)9.50%
8位bzip2 (–fast)9.55%
9位gzip (-6)12.52%
10位gzip (–fast)13.91%
11位lzop (-3 -U)20.93%
12位lzop (–fast -U)20.95%

いったん速度を置いておいて、 gzip を基準に見てみると、どれも優秀な印象を受けます

LZMA系のコマンドはどれもgzipの半分ですね。 xz や lzip はたまにアップデートを続けているようです。

個人的な評価

今回はあくまでも “大きなファイルに対してのパフォーマンス” の試験です。

そして個人的な見解ですが、

まず、やっぱり gzip スゲー。

圧縮率でこそ今回試験したコマンドの中では下位の順位ですが、それに勝る圧縮・伸張の速さと安定感。

gzip の –fast オプションはそこまで圧縮率に影響がない(差分2%未満)にも関わらず 、圧縮速度が約2〜3倍となったので、速度に困ったらとりあえず –fast オプションをつければいいかな、といったところでしょうか。

先ほども触れましたが、 lzop は圧縮速度こそぶっちぎりの一位ですが、圧縮率がどうしても悪く見えてしまいます。伸張速度の観点でも触れましたが、オプションをつければ逆にパフォーマンスが落ちるので、大きなファイルには動作が安定していない印象。よほど圧縮速度にこだわらない限りはインストールしてまで使う必要はないと思います。( lzop を抜きに見れば gzip が圧縮・伸張ともにダントツ一位。。。)

bzip も全体的に目立って良い訳ではないので、今回の観点以外でメリットを見つけれない限りは大きなファイルに対して使う機会は少なそう。

そこで gzip の次に成績が良かったのは lzip --fast 。圧縮・伸張は gzip --fast の倍時間がかかります(それでも十分早い!)が、圧縮率は gzip --fast の約40%圧縮効率を高めてくれます( デフォルトの gzip と比べると 35%)。 圧縮率を優先するなら lzip --fast かな〜といったところ。デフォルト使うには圧縮に時間がかかり過ぎ( gzip や lzip –fast に比べると約30〜35倍、)なので、compress levelの指定無しには大きなファイルを扱うのはちょっと厳しい。1core丸々を圧縮のためだけに使うのは。。。

ただ、今回条件を揃えるために lzma と xz はスレッド数を -T 1 に指定して実行していたので、ちゃんとしたポテンシャルを発揮できてはいないです。 どの compress levelが一番良いかは別途検証する必要がありますね。

まとめ

大きなファイルに対して。

1スレッドで動かす場合の基本的な運用は gzip で十分でしょうか。

そして、 gzip 以外の選択肢としては大まかにこんなパターンで使い分けする方が良いのかな〜と。

1 長時間 cpu の負荷が高騰する (もう少し速度欲しいなって)時

→ gzip --fast オプションをつけて、圧縮時間を短縮。とりあえず半分ぐらいにはなる。

2 圧縮率をあげたい

→ lizip , xz , lzma のいずれかお好みの compress level オプション指定で圧縮。(丁度いいさじ加減探す必要有)

3 とにかく gzip 以上の圧縮率で、可能な限り早く!

→ lizip , xz , lzma に --fast オプションをつける

小さいファイルに対しての圧縮や、マルチコアを使った処理など色々検証すべき点はありますが、それはまたの機会に比べてみたいと思います。

ではでは。


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。