「dd | gzip」 はそこまでだ！「dd | pigz」にするだけで20倍速くなった件

#unix使いの皆様ならば、「ちょいとしたバックアップ・レストア」の用事はすべて dd コマンドで済ませていらっしゃることかと思います：
今回は「nvmeSSD 500GB から SATA HDD」へのバックアップです
(GPUマシン化する前に、プリインストールのWindowsをバックアップ)

```terminal
sudo dd if=/dev/nvme0n1 of=/somedrive/bkp.image

...
# 途中で止めて速度チェック
347762688 bytes (348 MB, 332 MiB) copied, 21.6687 s, 16.0 MB/s
```


##ちょいちょいオプションを付けてあげると良い感じなことも、ご存知かと思います
・bs=16MB ある程度まとめて読んだほうが速いよ
・nocache ディスクキャッシュが埋まるの回避

```terminal
sudo dd if=/dev/nvme0n1 of=/somedrive/bkp.image \
  bs=16MB \
  iflag=nocache \
  oflag=nocache,dsync

...
# 途中で止めて速度チェック
434501120 bytes (435 MB, 414 MiB) copied, 24.5498 s, 17.7 MB/s
# ssdだと案外速度変わらないのですね？昔はbsサイズ指定は必須だった記憶ですが
```


###Unixですので gzip にパイプしてあげれば圧縮されてディスクスペースの節約になるのもご存知でしょう。

```terminal
sudo dd if=/dev/nvme0n1 \
  bs=16MB \
  iflag=nocache \
  oflag=nocache,dsync \
  | pv | gzip > /somedrive/bkp.image.gz

  # pvは、進捗を表示してくれる便利なユーティリティコマンドです

...
# pvの出力
810MiB 0:00:17 [21.6MiB/s]
```
ちょっと速くなりました。CPUコストよりディスクコストが高い処理なので、圧縮した方が多くのデータを処理できるようです。

##さて、
僕はもう10年以上これが当たり前だと思っていましたが、
ふと気づきました：
<b>「メニーコアCPUが当たり前の時代なんだから、並列処理でもっと早く圧縮できるんじゃないのー？」</b>

#あったー！！！  「<b>pigz</b> = <b>P</b>arallel <b>I</b>mplementation of <b>GZ</b>ip」=「並列実装 gzip」

```terminal
❯ pigz --help
                                                                                           ─
Usage: pigz [options] [files ...]
  will compress files in place, adding the suffix '.gz'. If no files are
  specified, stdin will be compressed to stdout. pigz does what gzip does,
  but spreads the work over multiple processors and cores when compressing.

```
素晴らしいです。僕みたいな凡人が思いつくことなんて、だいたい先に頭の良い人が思いついてるもので。
単純に gzip コマンドのドロップイン置き換えで使えます。

# やってみよう

```terminal
sudo dd if=/dev/nvme0n1 of=/somedrive/bkp.image \
  bs=16MB \
  iflag=nocache \
  oflag=nocache,dsync \
  | pv | pigz > /somedrive/bkp.image.gz  # この行だけ違う gzip -> pigz


...
[  99168000000 bytes (99 GB, 92 GiB) copied, 265 s, 374 MB/s92.7GiB 0:04:26  [ 359MiB/s] 
[  99552000000 bytes (100 GB, 93 GiB) copied, 266 s, 374 MB/s93.1GiB 0:04:27 [ 381MiB/s] 
[  99952000000 bytes (100 GB, 93 GiB) copied, 267 s, 374 MB/s93.4GiB 0:04:28 [ 335MiB/s] 
```
# 21.6MB/s -> 374 MB/s 17.3倍速いー！！！


```terminal_progress
[  498288000000 bytes (498 GB, 464 GiB) copied, 1271 s, 392 MB/s 464GiB 0:21:12 [ 428MiB/s] 
[  498736000000 bytes (499 GB, 464 GiB) copied, 1272 s, 392 MB/s 464GiB 0:21:13 [ 430MiB/s] 
[  499200000000 bytes (499 GB, 465 GiB) copied, 1273 s, 392 MB/s 465GiB 0:21:14 [ 456MiB/s]
```
処理後半では更にスピードアップ。未使用セクタなどがゼロで埋まっていた場合に圧縮が効きまくったと予想します。
21倍速ですね！

pigz
ピッグズ 
ぴっぐず
(忘れないように3回書きました)

笑うほど簡単に爆速化しますので、

覚えておいて損は無いと思います！

```terminal
# おまけ
-rwxrwxrwx 1 root root 29G Dec  6 12:28  bkp.image.gz 
生SSD 500G -> 29G に怒涛の圧縮です。やったぜありがとう pigz

# 既存のスクリプトのgzipを置き換えるワンライナー (上書きするのでバックアップは取っておいてくださいね)
sed -i 's/gzip/pigs/g' somescript.sh

# ubuntu18ではデフォルトで入ってました
# Macの方は
brew install pigz
# にて
```

```terminal
# おまけ２ - こんなマシンです
> ls /dev/disk/by-id
nvme-Samsung_SSD_960_EVO_500GB_S3X4NB0K142330K -> ../../nvme0n1
ata-WDC_WD40EZRZ-00GXCB0_WD-WCC7K6ZX6483 -> ../../sda

❯ sudo cat /proc/cpuinfo | grep "model name" | uniq                                                        ╯
model name	: Intel(R) Core(TM) i9-7900X CPU @ 3.30GHz
# 10コア20スレッドのCPUです。(だから「20倍ちょい」だったのかな)
```

[EOF]