差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
blog:2019:2019-12-31 [2019-12-31 21:09]
Decomo 作成
blog:2019:2019-12-31 [2022-02-21 00:24] (現在)
Decomo
行 1: 行 1:
-====== メモリ16GBは人権の今、ZFSの重複排除(zfs dedup)を解禁する ======+====== メモリ16GBは人権の今、ZFSの重複排除(dedup)を解禁する ======
  
-ZFSはそこそこ古いバージョン((ZFS Pool Version 21。2010年頃?))で重複排除機能(dedup)を備えたが、長らくのあいだ禁忌とされてきた。というのも、Chr〇meも真っ青のレベルでメモリを馬鹿食いするからだ。ZFSの他の機能同様、dedupも有効にした後の書き込みから機能するため、当初は問題なく動いてるように見えるが「なんか重いなぁ…」と気付いた時にはメモリが枯渇しているのだ。慌ててdedup=offにしても、既に重複排除された分はdedupが効き続けるため、メモリは減ったままなのだ。dedup地獄から抜け出すには、メモリを増設するかスワップを大量に割り当て、既存の重複排除が解除されるのをひたすら耐えるしかない。+<WRAP box caution>(2020-12-15 追記)
  
-[[https://togetter.com/li/1293731|メモリ16GB人権]]宣言から1年、フッ化水素騒も何のその、メモリ価格は下落続け個人でメモリ1TBも現実的となってきた昨今、そろそろdedup解禁しても良いのではないか。+dedup有効状態で10ヵ月弱使ってみたけど、やっぱりまだ解禁しない方がよさげ。メモリ的に余裕だが、ファイル削除に時間がかかるようになったり微妙に怪しげな挙動をすることがある(何となくレコード毎に重複チェックが走り本当に削除するかどうか決定しているような感じ。ファイルサイズと削除所用時間は比例する。要検証)。データの破損や消失は起きてないので、そういった意味での危険性はないが、有効にするなら何が起きても自己責任ってことで! 
 +</WRAP>
  
-[[https://www.amazon.co.jp/dp/B00Y32OHNM|FreeBSD Mastery: ZFS]]によると、dedupはデータ1TBあたり概ね5GBのメモリを消費する。うちの自宅サーバはメモリ64GBでメインのプールは8TBなので、dedupを有効にしてもお釣りがくる計算だ。ならば人柱よろしくdedupっちゃおうじゃないの。ちなみに、同書にはdedupメモリ消費量のより詳しい見積もり方法が書いてあるので、気になる人は買って読んでください。+ZFSは2010年頃のPool Version 21で重複排除機能(dedup)を備えたが、本機能の使用は長らく禁忌とされてきた。というのも、Chr〇meも真っ青のレベルでメモリを馬鹿食いするからだ。ZFSの他の機能同様、dedupも有効にした後の書き込みから機能するため、当初は問題なく動いてるように見える。が、徐々にメモリが使われて行き「なんか重いなぁ…」と気付いた時には既に遅し、メモリが枯渇しているのである。慌ててdedup=offにしても、既に重複排除された分は効き続けるため、メモリは減ったままというオマケ付き。dedup地獄から抜け出すには、メモリを増設するかスワップを大量に割り当て、既存の重複排除が解除されるのをひたすら耐えるしかない。 
 + 
 +そんな訳でdedupの実用は難しかったのだけども、[[https://togetter.com/li/1293731|メモリ16GBは人権]]宣言から1年、フッ化水素騒動も何のその、メモリ価格は下落を続け個人でメモリ1TBも現実的となってきた昨今、そろそろdedupを解禁しても良いのではないか。 
 + 
 +[[https://www.amazon.co.jp/dp/B00Y32OHNM|FreeBSD Mastery: ZFS]]によると、dedupはデータ1TBあたり概ね5GBのメモリを消費するそうだ。うちの自宅サーバはメモリ64GBでメインのプールは8TBなので、dedupを有効にしてもお釣りがくる計算だ。ならば人柱よろしくdedupっちゃおうじゃないの。ちなみに、同書にはdedupメモリ消費量のより詳しい見積もり方法が書いてある気になる人は買って読んでください。
  
 dedupを有効にするプール''zhome''は以下のような感じ。8TBのHDDを2本(ada5とada6)のミラー構成としている。改めてみるとファイルシステム名のつけ方が酷いな…。 dedupを有効にするプール''zhome''は以下のような感じ。8TBのHDDを2本(ada5とada6)のミラー構成としている。改めてみるとファイルシステム名のつけ方が酷いな…。
行 53: 行 58:
 ''dedup=on''ではなく''dedup=skein''なのは、チェックサムアルゴリズムとして[[https://en.wikipedia.org/wiki/Skein_(hash_function)|Skein]]を使いたいから。 ''dedup=on''ではなく''dedup=skein''なのは、チェックサムアルゴリズムとして[[https://en.wikipedia.org/wiki/Skein_(hash_function)|Skein]]を使いたいから。
  
-標準でdedupはSHA-256を使うようになっているが、manを見る限りSkeinはSHA-256/SHA-512より安全かつ高速で、更にプール固有のソルトを用いるためハッシュ衝突攻撃にも強いらしい。「何からの理由で高速なskeinが使えないシステムでsha512を使う」とも書いてあるので、基本はskeinで良さそう。+dedupは標準でSHA-256を使うようになっているが、manを見る限りSkeinはSHA-256/SHA-512より安全かつ高速で、更にプール固有のソルトを用いるためハッシュ衝突攻撃にも強いらしい。「sha512は何からの理由で高速なskeinが使えないシステムで使う」とも書いてあるので、基本はskeinで良さそう。
  
-別プールにあるISOイメージやらインストーラやらが詰まってる493GBのフォルダを、dedup有効にしたプールにコピーした結果が以下。+その後、別プールにあるISOイメージやらインストーラやらが詰まってる493GBのフォルダを、dedup有効プールにコピーした結果が以下。
 <code> <code>
 $ zpool list zhome $ zpool list zhome
行 61: 行 66:
 zhome  7.27T  1.64T  5.62T        -             3%    22%  1.11x  ONLINE  - zhome  7.27T  1.64T  5.62T        -             3%    22%  1.11x  ONLINE  -
 </code> </code>
 +
 +重複排除率が1.11xってのは……たぶん2.00xならdedupで実使用量が半分になったって事だろうから、(重複排除できたサイズ)=(1-(1/DEDUP))*(元のサイズ) なので48GBほど排除できた感じっすかね?
  
 この時のメモリ使用量の変化は下図のとおり。 この時のメモリ使用量の変化は下図のとおり。
 {{ :blog:2019:zfs_dedup_memory_usage_comparison.png |}} {{ :blog:2019:zfs_dedup_memory_usage_comparison.png |}}
  
-''loader.conf''で''vfs.zfs.arc_max="20G"''としてARCサイズは20GBに制限している。dedup前はARCを20GBフルに使ってるのに対し、dedup後は15GBになっていることから、dedup用のハッシュキャッシュはARCから確保されるっぽい?+ARCサイズは''loader.conf''で''vfs.zfs.arc_max="20G"''として20GBに制限している。dedup前はARCを20GBフルに使ってるのに対し、dedup後は15GBになっていることから、dedup用のハッシュキャッシュはARCから確保されるっぽい?
  
-493GBで5GBって冒頭の概算の2倍消費しとるやんけ!と思ったが、Skeinは512bitハッシュなので比率で考えたら見事に概算通りの結果となった。そう考えると、メモリ64GB程度ではdedupを使うにはまだ心許ない感じがするなぁ……(何というオチ)。ちなみに、将来[[https://news.mynavi.jp/article/20190924-897816/|dedupのメモリ消費量が削減される可能性がある]]っぽい。+データ493GBでハッシュ5GBって冒頭の概算の2倍消費しとるやんけ!と思ったが、Skeinは512bitハッシュなので比率で考えたら見事に概算通りの結果となった。そう考えると、メモリ64GB程度ではdedupを使うにはまだ心許ない感じがするなぁ……(何というオチ)。ちなみに、将来[[https://news.mynavi.jp/article/20190924-897816/|dedupのメモリ消費量が削減される可能性がある]]っぽい。
  
 まぁ、せっかくdedup有効にしてみたんだし、しばらく運用してみよう。NVMeなSSDも載ってるので、最悪そっちに大容量スワップ作れば何とかなるだろう。 まぁ、せっかくdedup有効にしてみたんだし、しばらく運用してみよう。NVMeなSSDも載ってるので、最悪そっちに大容量スワップ作れば何とかなるだろう。
 +
 +----
 +(2020-01-06 追記)
 +
 +dedup有効後、6日ほど経ったのでtopを見てみたら、ARCが20GBに戻ってた…。ARCからハッシュキャッシュから取られる訳ではなさそう?ちゃんと調べてみないと分かりませんな……。
 +<code>
 +last pid: 26323;  load averages:  0.21,  0.20,  0.17   up 71+13:01:17  22:29:52
 +51 processes:  1 running, 50 sleeping
 +CPU:  0.8% user,  0.0% nice,  0.3% system,  0.0% interrupt, 98.9% idle
 +Mem: 295M Active, 1465M Inact, 25G Wired, 35G Free
 +ARC: 20G Total, 11G MFU, 6802M MRU, 1530K Anon, 369M Header, 1446M Other
 +     17G Compressed, 24G Uncompressed, 1.43:1 Ratio
 +Swap:
 +</code>
 +
 +
 +===== 参考サイト =====
 +
 +  * [[https://www.freebsd.org/cgi/man.cgi?zfs(8)|zfs(8)]]
 +  * [[https://news.mynavi.jp/article/20190924-897816/|OpenZFS、重複排除機能が改善される可能性あり | マイナビニュース]]
 +  * [[https://togetter.com/li/1293731|我が国では人権はいくらでも蹂躙して構わないことになっているので「メモリ16GBは人権」といういい方はNG、という説 - Togetter]]
  • blog/2019/2019-12-31.1577794181.txt.gz
  • 最終更新: 2019-12-31 21:09
  • by Decomo