差分

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

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

次のリビジョン
前のリビジョン
最新のリビジョン 両方とも次のリビジョン
blog:2020:2020-12-13 [2020-12-13 22:41]
Decomo 作成
blog:2020:2020-12-13 [2022-01-13 00:42]
Decomo
行 1: 行 1:
 ====== ZFSのSpecial Allocation ClassのSpecial VDEVの容量を見積もる ====== ====== ZFSのSpecial Allocation ClassのSpecial VDEVの容量を見積もる ======
  
-Special VDEVとしてSSDをZFSプールに追加すれば性能向上が見込めそうという事は分かったので、必要な容量を見積もってみる。+SSDをSpecial VDEVとしてZFSプールに追加すれば[[blog:2020:2020-12-08|性能向上が見込めそう]]なのは分かった。続いてSpecial VDEVに必要な容量を見積もってみる。
  
-Special VDEVに格納されるデータは大きく2種類に分けられる。+Special VDEVに格納されるデータは大きく2に分けられる。
  
   * メタデータ   * メタデータ
   * 小ブロックのデータ(スモールI/Oの結果として生成される小さなレコード)   * 小ブロックのデータ(スモールI/Oの結果として生成される小さなレコード)
  
-対象のプールでそれぞれのデータ量を確認し合算すればよい。いずれzdbコマンドで確認することができ+zdbコマンドでプールのこ現在量を確認し、Special VDEVの容量を見積もることができそうだ
  
-稼働中の家鯖のシステム用プールで実際に確認してみよう。+実際に、稼働中の家鯖のプールで実際に確認してみよう。対象プールの下表のとおり
  
-なお、zdb実行それなりにメモリを消費する注意されたし。プールの使用量がテラバイト級だと数ギガ単位で消費する。メモリ不足でzdbが落ちるようなら、Special VDEVより先にメモリを追加しましょう。何はなくともZFSはメモリが重要なので。+^  用途 | システム用プール (zroot) | 
 +^  種類 | ミラー | 
 +^  使用量/容量 | 37.2/99.8GiB | 
 +^  特記事項 | <WRAP> 
 +  * FreeBSD 12.2-RELEASEが入っている 
 +  * 9-BETAの頃から連綿と続く年季の入ったプール 
 +  * ホームディレクトリは別プールの 
 +  * 細かなファイルが多め(/usr/srcや.svnフォルダ、portsのソース&ビルドファイルなど) 
 +</WRAP>
 + 
 +なお、zdb実行はメモリの空きに注意すること。プールの使用量がテラバイト級だと数ギガ単位で消費する。メモリ不足でzdbが落ちるようなら、Special VDEVより先にメモリを追加しましょう。何はなくともZFSはメモリが重要なので。
  
 ===== メタデータ ===== ===== メタデータ =====
行 18: 行 28:
 メタデータの使用量は簡単に確認できる。 メタデータの使用量は簡単に確認できる。
  
-Allocation Classにおける「メタデータ」とは、ファイルデータとzvolデータを除いたデータである。正確に言うと、レベル0のZFS plain file(いわゆる普通のファイルのデータ)とレベル0のzvol object(zvolのデータブロック)を除いた全てのデータがSpecial VDEVに載るとのこと。+Allocation Classにおける「メタデータ」とは、ファイルデータとzvolデータを除いたデータである。正確に言うと、レベル0のZFS plain file(いわゆる普通のファイルのデータ)とレベル0のzvol object(zvolのデータブロック)を除いたがメタデータとなり、それら全てがSpecial VDEVに載るとのこと。
  
 ''zdb -bbb プール名''を実行するとプールの詳細情報がズラズラ出るが、このうちTypeがTotalのASIZEからL0 ZFS plain fileとL0 zvol objectのASIZEを引いた値がメタデータサイズとなる。 ''zdb -bbb プール名''を実行するとプールの詳細情報がズラズラ出るが、このうちTypeがTotalのASIZEからL0 ZFS plain fileとL0 zvol objectのASIZEを引いた値がメタデータサイズとなる。
行 52: 行 62:
 </code> </code>
  
-この例だと、37.2G - 35.9G - 0 = 1.3G がメタデータサイズとなる(このプールではzvol使っていないのでL0 zvol objectは出てこない)。+この例だと、37.2G - 35.9G - 0 = 1.3G がメタデータサイズとなる(zvol使っていないのでL0 zvol objectは出てこない)。
  
 ===== 小ブロックのデータ ===== ===== 小ブロックのデータ =====
行 60: 行 70:
 このプロパティはSpecial Allocation Classとして扱うブロックサイズ、すなわちSpecial VDEVへの読み書きとなる閾値で、512~128kの2の累乗値で指定する。この値**以下**の読み書きがSpecial VDEV行きとなるので、''recordsize''と同じ値にするのは危険。基本的には64k以下を指定することになるだろう。 このプロパティはSpecial Allocation Classとして扱うブロックサイズ、すなわちSpecial VDEVへの読み書きとなる閾値で、512~128kの2の累乗値で指定する。この値**以下**の読み書きがSpecial VDEV行きとなるので、''recordsize''と同じ値にするのは危険。基本的には64k以下を指定することになるだろう。
  
-''zdb -bbbb プール名''を実行すると、データの種類ごとに使用レコードサイズの分布が表示される。+''zdb -bbbb プール名''を実行すると、データの種類ごとにレコードサイズの使用状況が表示される。
  
-ここでも注目すべきはL0 ZFS plain fileとL0 zvol objectの分布である。非常に長いログのため、L0 ZFS plain fileの分布の一部のみ掲載。+ここでも注目すべきはL0 ZFS plain fileとL0 zvol objectの分布である。非常に長いログのため、L0 ZFS plain fileの一部のみ掲載。
  
 <code> <code>
行 84: 行 94:
 0:, 1:, ..., 256: はブロックサイズを、その後ろはブロック数を表す。1ブロック512バイトなので、上記の8:の行は4096バイトブロックが158789個で約620MiBと読める。 0:, 1:, ..., 256: はブロックサイズを、その後ろはブロック数を表す。1ブロック512バイトなので、上記の8:の行は4096バイトブロックが158789個で約620MiBと読める。
  
-このプルの64KiB以下のレコードは7.9GiBだった。+各レコドサイズ以下のデータ量は下表の通りだった。 
 + 
 +^  レコードサイズ  ^  データ量 
 +|  4KiB以下 | 1.69GiB | 
 +|  8KiB以下 | 2.53GiB | 
 +|  16KiB以下 | 3.40GiB | 
 +|  32KiB以下 | 4.60GiB | 
 +|  64KiB以下 | 7.9GiB | 
 + 
 +ここでSpecial VDEVをフル活用するとして、全部盛りの7.9GiBを採用する。 
 + 
 +<WRAP info>(2021-12-14追記) 
 + 
 +FreeBSD 13.0 (OpenZFS 2.0)の''zdb -bbb''でBlock Size Histogramという、まんまの情報が出ることに気づいた。ご丁寧に対象ブロック以下の合計バイト数まで出してくれるので、一撃で見積もることができる。 
 +<code> 
 +Block Size Histogram 
 + 
 +  block   psize                lsize                asize 
 +   size   Count   Size   Cum.  Count   Size   Cum.  Count   Size   Cum. 
 +    512:   310K   155M   155M   218K   109M   109M      0      0      0 
 +     1K:   353K   394M   549M   190K   225M   334M      0      0      0 
 +     2K:   149K   402M   951M   150K   392M   726M      0      0      0 
 +     4K:   346K  1.42G  2.35G   139K   747M  1.44G      0      0      0 
 +     8K:   303K  2.96G  5.31G   113K  1.24G  2.67G   773K  9.06G  9.06G 
 +    16K:   391K  8.17G  13.5G   183K  3.49G  6.16G   613K  14.4G  23.4G 
 +    32K:   528K  23.7G  37.2G   138K  6.11G  12.3G   553K  25.4G  48.8G 
 +    64K:   945K  83.4G   121G   137K  11.6G  23.8G   592K  57.7G   107G 
 +   128K:  19.5M  2.44T  2.56T  21.3M  2.66T  2.68T  20.2M  4.22T  4.32T 
 +   256K:   198K  70.1G  2.63T  11.2K  4.00G  2.69T   125K  47.3G  4.37T 
 +   512K:  39.6M  19.8T  22.4T  40.0M  20.0T  22.7T  39.7M  33.5T  37.9T 
 +     1M:   602K   602G  23.0T   602K   602G  23.3T   602K  1009G  38.8T 
 +     2M:      0      0  23.0T      0      0  23.3T      0      0  38.8T 
 +     4M:      0      0  23.0T      0      0  23.3T      0      0  38.8T 
 +     8M:      0      0  23.0T      0      0  23.3T      0      0  38.8T 
 +    16M:      0      0  23.0T      0      0  23.3T      0      0  38.8T 
 +</code> 
 + 
 +上記は26TBのプール(使用量は23TB)で、64KB以下のブロックが121GBだからプールに占める割合は0.46%となる。Special VDEVの容量は、一般的な用途ではプールの1~2%を確保しておけば十分なのかも。 
 +</WRAP> 
  
 ===== Special VDEVサイズの見積もり ===== ===== Special VDEVサイズの見積もり =====
行 90: 行 139:
 以上より、メタデータ量1.3GiBと小ブロックデータ量7.9GiBの合算、9.2GiBが現時点のSpecial Allocation Classのサイズとなる。 以上より、メタデータ量1.3GiBと小ブロックデータ量7.9GiBの合算、9.2GiBが現時点のSpecial Allocation Classのサイズとなる。
  
-プールのサイズは100GiBで37.2GiBが使用中な、今後も同じ割合でSpecial Allocation Classが増えるとすれば、Special VDEVに必要なサイズは25GiB程度となる。+プールの使用量とメタデータ量/小ブロック量関係は読み切れない部分があるけど、今後も同じ割合でSpecial Allocation Classが増えるとすれば、Special VDEVに必要なサイズは25GiB程度となる。
  
-プールサイズの25%というと結構な割合、ソースコードやSubversionの作業コピーなど、細々とした大量のファイル影響してると考えられる。実際、プールでは4KiB以下のファイルが全ファイルの8割を占めており、その中でも1KiB以下が5割を占めている。+プールサイズの25%というと結構な割合となるが、細々とした大量のファイル影響考えられる。実際、このプールでは4KiB以下のファイルが全ファイルの8割を占めており、中でも特に1KiB以下が5割を占めている。
  
 ===== 様々なプールを分析してみる ===== ===== 様々なプールを分析してみる =====
  
-Special VDEVの必要量は、プールの使われ方大きく変わると思われる。+Special VDEVの必要量は、プールの使われ方にも大きく依存すると考えられる。
  
-手元の6つのプールについてSpecial VDEVの容量に影響しそうな項目を調べてみた。+そこで、手元の6つのプールについてSpecial VDEVの容量に影響しそうな項目を調査した。
  
-^  プール名  ^  種類   容量   使用量  ^  ファイル数  ^  平均ファイルサイズ  ^  メタデータ  ^  64kB以下のレコード総量  ^  使われ方 +^  プール名  ^  種類  ^  使用量/容量 ^  ファイル数  ^  平均ファイルサイズ  ^  メタデータ  ^  64kB以下のレコード総量  ^  使われ方 
-| システムプール | ミラー |  99.8GiB |  37.2GiB |  1286414 |  0.029MiB |  1.3GiB \\ (3.5%) |  7.9GiB \\ (21.2%) | FreeBSDのシステム格納用。 \\ ホームディレクトリは別プールのため、純粋にシステムデータのみが保存されているソースコード、Subversionの作業コピー、ログなど容量な数のファイルが多め。| +| システムプール | ミラー |  37.2/99.8GiB |  1286414 |  0.029MiB |  1.3GiB \\ (3.5%) |  7.9GiB \\ (21.2%) | FreeBSDのシステム格納用。 \\ 見積作業で使ったプール。小で大のファイル成分強い。| 
-| データプール1 | ミラー |  7.12TiB |  2.54TiB |  1003104 |  2.654MiB |  20GiB \\ (0.8%) |  31.7GiB \\ (1.2%) | ホームディレクトリ用のプール。 \\ 日常生活での書類データ、数MB~数十MBの音楽ファイル、数十MBオーダーの写真などが主。 | +| データプール1 | ミラー |  2.54/7.12TiB |  1003104 |  2.654MiB |  20GiB \\ (0.8%) |  31.7GiB \\ (1.2%) | ホームディレクトリ用のプール。 \\ 日常生活での書類データ、数MB~数十MBの音楽ファイル、数十MBオーダーの写真などが主。 | 
-| データプール2 | RAIDZ1 |  20.4TiB |  20.2TiB |  229356 |  92.351MiB |  700MiB \\ (0.003%) |  6.74GiB \\ (0.03%) | データプール1より重要度が下のデータ。 \\ ギガバイト級の動画ファイル、数百KBクラスの画像、アプリのアーカイブ(ISO, zipなど様々)など。 | +| データプール2 | RAIDZ1 |  20.2/20.4TiB |  229356 |  92.351MiB |  700MiB \\ (0.003%) |  6.74GiB \\ (0.03%) | データプール1より重要度が下のデータ。 \\ 数GB級の動画ファイル、数百KBクラスの画像、アプリのアーカイブ(ISO, zipなど様々)など。 | 
-| データプール3 | 単体 |  7.1TiB |  6.49TiB |  1099395 |  6.190MiB |  10GiB \\ (0.2%) |  64.5GiB \\ (1.0%) | データプール2より重要度が下のデータ。 \\ バックアップデータ、Time Machineのスパースバンドル、~2GiB程度の動画、数百KBクラスの画像など。| +| データプール3 | 単体 |  6.49/7.1TiB |  1099395 |  6.190MiB |  10GiB \\ (0.2%) |  64.5GiB \\ (1.0%) | データプール2より重要度が下のデータ。 \\ バックアップデータ、Time Machineのスパースバンドル、~2GB程度の動画、数百KBクラスの画像など。| 
-| 業務用プール1 | RAIDZ1 |  8.93TiB |  5.09TiB |  2674793 |  1.995MiB |  30GiB \\ (0.6%) |  120.2GiB \\ (2.3%) | 実際に業務で使われているプール、その1。 \\ 主に間接部門の書類、企業活動で日々生産される刹那的なデータ以外のデータなど。 | +| 業務用プール1 | RAIDZ1 |  5.09/8.93TiB |  2674793 |  1.995MiB |  30GiB \\ (0.6%) |  120.2GiB \\ (2.3%) | 業務で使われているプール、その1。 \\ 主に間接部門の書類、資料性の高いデータ、流動性低いデータなど。 | 
-| 業務用プール2 | ミラー |  1.99TiB |  977.4GiB |  183582 |  5.451MiB |  2GiB \\ (0.2%) |  1.04GiB \\ (0.1%) | 実際に業務で使われているプール、その2。 \\ 数十KB~数百KBの多数の画像、数MBのアセットなど。|+| 業務用プール2 | ミラー |  0.954/1.99TiB |  183582 |  5.451MiB |  2GiB \\ (0.2%) |  1.04GiB \\ (0.1%) | 業務で使われているプール、その2。 \\ 数十KB~数百KBの多数の画像、数MBのアセットなど。| 
 + 
 +ファイル数が多いほど、またファイルサイズが小さいほど、メタデータと小ブロックの量は増える傾向にあるものの、一概にプール容量の何パーセントと言える感じではなさそうだ。 
 + 
 +システムプールが少々特殊な気がするので除外すると、多くの場合、Special VDEVのサイズはプールサイズの5%あれば十分と言えなくもない?が、断定するにはサンプルが不足してるかな…。少々時間はかかるけど、今のところ都度zdbで計算する方がよさげ。潤沢な資金があるならともかく、20TiBの5%は1TiBになるので、丸ごとSpecial VDEVにおごるのは勿体ない気も…。
  
 ファイルサイズの分布。 ファイルサイズの分布。
行 112: 行 165:
 {{ :blog:2020:zpool_filesize_distribution.png |}} {{ :blog:2020:zpool_filesize_distribution.png |}}
  
-レコードサイズの分布。+用途ごとにプールを分けてることもあって、ファイルサイズはプールごとにそれなりにバラつきが見られる(目論見通り)。 
 + 
 +続いてレコードサイズの分布。
  
 {{ :blog:2020:zpool_recordsize_distribution.png |}} {{ :blog:2020:zpool_recordsize_distribution.png |}}
  
-txgのおかげ殆どが128KiBレコードとなっており、グラフにする意味もなかったという流石にこの図からは何も読み取れないので、各プールの使用率上位3位のレコードサイズを表にまとめた。+ZFSのトランザクショングループ(txgのおかげ殆どが128KiBレコードとなっており、グラフにする意味もなかった。txgって予想以上効くんだね…。れでは何も読み取れないので、各プールの使用率上位3位のレコードサイズを表にまとめた。
  
 ^  プール名  ^  1位  ^  2位  ^  3位  ^ ^  プール名  ^  1位  ^  2位  ^  3位  ^
行 126: 行 181:
 | 業務用プール2 |  128k (97.7%) |  512 (1.75%) |  11k (0.02%) | | 業務用プール2 |  128k (97.7%) |  512 (1.75%) |  11k (0.02%) |
  
 +ZFSの書き込みは、ほぼほぼ128k/4k/512バイトに集約されると言っても過言ではなさそう。
  • blog/2020/2020-12-13.txt
  • 最終更新: 2022-03-30 10:34
  • by Decomo