FORCIA CUBEフォルシアの情報を多面的に発信するブログ

圧縮アルゴリズムZstandardを導入しバッチ処理時間を短縮 データ鮮度を改善した話

2018.12.22

アドベントカレンダー2018 テクノロジー

FORCIAアドベントカレンダー2018 22日目の記事です。

 技術本部の羽間です。フォルシアでは、主に大手旅行会社の検索システムの開発をしています。旅行業界では、旅行商品の在庫・料金が目まぐるしく変動するため、データ鮮度がとても重要です。そこで、システム間のデータ連携バッチの処理時間を少しでも短くできないかということで、Zstandard(zstd)による改善を検討してみました。

zstdとは

 2015年からFacebookに所属するYann Collet氏によって開発された可逆圧縮アルゴリズムで、2016年8月にBSDライセンスでオープンソースソフトウェアとして公開されています。
 ポイントは、zip・gzip・zlib等で採用されている圧縮アルゴリズム「Deflate」よりも圧縮展開速度・圧縮効率に優れているという点です。Deflateは圧縮展開速度・圧縮効率のバランスが良く、長らく速度・効率の両面で上回るものが現れていませんでした。
 詳細は公式サイトに載っていますが、公式ベンチマーク(https://facebook.github.io/zstd)結果によると、 圧縮展開速度は2倍以上、圧縮効率も5%〜10%程度改善されていることがわかります。

インストール方法

 2018年12月現在では、自分でmakeせずともdpkg・apt, rpm・yumでzstdがサポートされています。

Ubuntu 18.04の場合
apt install zstd

CentOS7 の場合
yum install zstd

# epelレポジトリが有効になっていない場合は以下手順で有効にしてください。
#レポジトリの状態を確認
yum repolist all

# epelレポジトリのインストール
yum install epel-release

# epelレポジトリを有効化
yum-config-manager --enable epel 

基本的な使い方

圧縮
$ zstd fileName
# => fileName.zst が生成されます

# アーカイブもしたい場合
$ tar -cf dirName.tar.zst --use-compress-program=zstd dirName 
# もしくは
$ tar -c dirName | zstd  > dirName.tar.zst 

※圧縮速度よりも、圧縮効率に重きを置きたい場合は、圧縮レベル1-22(デフォルト:3)を指定することも可能です。


複数コアで圧縮
# 4コアマルチスレッドで圧縮したい場合
$ pzstd fileName  -p 4

# アーカイブもしたい場合
$ tar -cf dirName.tar.zst --use-compress-program="pzstd -p 4" dirName 
# もしくは
$ tar -c dirName | pzstd -p 4  > dirName.tar.zst 

解凍
$ zstd -d fileName.zst

# 展開もしたい場合
$ tar -xf dirName.tar.zst --use-compress-program=zstd  
# もしくは
$ zstd -dc dirName.tar.zst |tar -x  

複数コアで解凍
# 4コアマルチスレッドで解凍したい場合
$ pzstd -d fileName.zst -p 4

# 展開したい場合
$ tar -xf dirName.tar.zst --use-compress-program="pzstd -p 4" 
# もしくは
$ pzstd -dc -p 4 dirName.tar.zst |tar -x  

検証してみた pzstd vs pigz

 私が担当しているアプリのバッチ処理の一部にpigz(Parallel gzip)で複数のファイルを圧縮し、送信する処理があります。そのケースを想定して、185ファイル、計9124MBのtsvを圧縮・展開した場合で、pzstdとどのくらい性能に差異があるか簡易な検証をしてみました。

 結果は次の通りです。

圧縮

Screenshot_2018-12-21 00_Studying アドベントカレンダー 圧縮アルゴリズムZstandardを導入し、バッチ処理時間の短縮を目指す #advent_calendar.png

解凍

Screenshot_2018-12-21 00_Studying アドベントカレンダー 圧縮アルゴリズムZstandardを導入し、バッチ処理時間の短縮を目指す #advent_calendar(1).png

 処理時間、CPU使用率、ファイルサイズ、いずれもzstdが優れた結果となりました。ファイルサイズが小さければ、サーバー間で通信する際に有利ですし、処理時間、CPU使用率が低ければ、リアルタイムでの圧縮処理に応用しやすく、有用ですね。
 また、解凍処理では思ったように差が現れませんでしたが、CPUのiowaitが高かったことから推測するに検証環境のディスクI/Oがボトルネックとなってしまっていたようでした。高性能なディスクを使用して検証を行えば、差がでるものと思います。

さいごに

 pigz、gzipの代替として、zstdを導入することで圧縮展開処理時間・圧縮効率の改善が見込めると分かりました。今後はバッチ処理への組み込みを進める予定です。簡単に導入できて、効果も見込めますので皆さんも検討されてみてはいかがでしょうか。本記事が少しでも皆さんの参考になれば幸いです。

この記事を書いた人

羽間大晃

2012年度新卒入社 エンジニア
旅行・MRO・機械部品と様々な業界の検索システム開発に従事し、現在は大手旅行会社の検索システム開発を担当