差分
このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
|
blog:2020:2020-12-13 [2020-12-13 22:41] Decomo 作成 |
blog:2020:2020-12-13 [2022-03-30 10:34] (現在) Decomo |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== ZFSのSpecial Allocation ClassのSpecial VDEVの容量を見積もる ====== | ====== ZFSのSpecial Allocation ClassのSpecial VDEVの容量を見積もる ====== | ||
| - | Special VDEVとしてSSDをZFSプールに追加すれば性能向上が見込めそうという事は分かったので、必要な容量を見積もってみる。 | + | <WRAP info> |
| - | Special VDEVに格納されるデータは大きく2種類に分けられる。 | + | 実際にテストしてみた→[[blog: |
| + | </ | ||
| + | |||
| + | SSDをSpecial VDEVとしてZFSプールに追加すれば[[blog: | ||
| + | |||
| + | Special VDEVに格納されるデータは大きく2つに分けられる。 | ||
| * メタデータ | * メタデータ | ||
| * 小ブロックのデータ(スモールI/ | * 小ブロックのデータ(スモールI/ | ||
| - | 対象のプールでそれぞれのデータ量を確認し合算すればよい。いずれもzdbコマンドで確認することができる。 | + | zdbコマンドでプールのこれらの現在量を確認し、Special VDEVの容量を見積もることができそうだ。 |
| + | |||
| + | 実際に、稼働中の家鯖のプールで実際に確認してみよう。対象プールの下表のとおり。 | ||
| - | 稼働中の家鯖のシステム用プールで実際に確認してみよう。 | + | ^ 用途 | システム用プール |
| + | ^ 種類 | ミラー | | ||
| + | ^ 使用量/ | ||
| + | ^ 特記事項 | < | ||
| + | * FreeBSD 12.2-RELEASEが入っている | ||
| + | * 9-BETAの頃から連綿と続く年季の入ったプール | ||
| + | * ホームディレクトリは別プールの | ||
| + | * 細かなファイルが多め(/ | ||
| + | </ | ||
| - | なお、zdbの実行ではそれなりにメモリを消費するので注意されたし。プールの使用量がテラバイト級だと数ギガ単位で消費する。メモリ不足でzdbが落ちるようなら、Special VDEVより先にメモリを追加しましょう。何はなくともZFSはメモリが重要なので。 | + | なお、zdb実行時はメモリの空きに注意すること。プールの使用量がテラバイト級だと数ギガ単位で消費する。メモリ不足でzdbが落ちるようなら、Special VDEVより先にメモリを追加しましょう。何はなくともZFSはメモリが重要なので。 |
| ===== メタデータ ===== | ===== メタデータ ===== | ||
| 行 18: | 行 33: | ||
| メタデータの使用量は簡単に確認できる。 | メタデータの使用量は簡単に確認できる。 | ||
| - | 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に載るとのこと。 |
| '' | '' | ||
| 行 52: | 行 67: | ||
| </ | </ | ||
| - | この例だと、37.2G - 35.9G - 0 = 1.3G がメタデータサイズとなる(このプールではzvolを使っていないのでL0 zvol objectは出てこない)。 | + | この例だと、37.2G - 35.9G - 0 = 1.3G がメタデータサイズとなる(zvolは使っていないのでL0 zvol objectは出てこない)。 |
| ===== 小ブロックのデータ ===== | ===== 小ブロックのデータ ===== | ||
| 行 60: | 行 75: | ||
| このプロパティはSpecial Allocation Classとして扱うブロックサイズ、すなわちSpecial VDEVへの読み書きとなる閾値で、512~128kの2の累乗値で指定する。この値**以下**の読み書きがSpecial VDEV行きとなるので、'' | このプロパティはSpecial Allocation Classとして扱うブロックサイズ、すなわちSpecial VDEVへの読み書きとなる閾値で、512~128kの2の累乗値で指定する。この値**以下**の読み書きがSpecial VDEV行きとなるので、'' | ||
| - | '' | + | '' |
| - | ここでも注目すべきはL0 ZFS plain fileとL0 zvol objectの分布である。非常に長いログのため、L0 ZFS plain fileの分布の一部のみ掲載。 | + | ここでも注目すべきはL0 ZFS plain fileとL0 zvol objectの分布である。非常に長いログのため、L0 ZFS plain fileの一部のみ掲載。 |
| < | < | ||
| 行 84: | 行 99: | ||
| 0:, 1:, ..., 256: はブロックサイズを、その後ろはブロック数を表す。1ブロック512バイトなので、上記の8: | 0:, 1:, ..., 256: はブロックサイズを、その後ろはブロック数を表す。1ブロック512バイトなので、上記の8: | ||
| - | このプールの64KiB以下のレコードは約7.9GiBだった。 | + | 各レコードサイズ以下のデータ量は下表の通りだった。 |
| + | |||
| + | ^ | ||
| + | | 4KiB以下 | 1.69GiB | | ||
| + | | 8KiB以下 | 2.53GiB | | ||
| + | | 16KiB以下 | 3.40GiB | | ||
| + | | 32KiB以下 | 4.60GiB | | ||
| + | | 64KiB以下 | 7.9GiB | | ||
| + | |||
| + | ここではSpecial VDEVをフル活用するとして、全部盛りの7.9GiBを採用する。 | ||
| + | |||
| + | <WRAP info> | ||
| + | |||
| + | FreeBSD 13.0 (OpenZFS 2.0)の'' | ||
| + | < | ||
| + | Block Size Histogram | ||
| + | |||
| + | block | ||
| + | | ||
| + | 512: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | 16K: | ||
| + | 32K: | ||
| + | 64K: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | 16M: 0 0 23.0T 0 0 23.3T 0 0 38.8T | ||
| + | </ | ||
| + | |||
| + | 上記は26TBのプール(使用量は23TB)で、64KB以下のブロックが121GBだからプールに占める割合は0.46%となる。Special VDEVの容量は、一般的な用途ではプールの1~2%を確保しておけば十分なのかも。 | ||
| + | </ | ||
| ===== Special VDEVサイズの見積もり ===== | ===== Special VDEVサイズの見積もり ===== | ||
| 行 90: | 行 144: | ||
| 以上より、メタデータ量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程度となる。 | + | プールの使用量とメタデータ量/ |
| - | プールサイズの25%というと結構な割合だが、ソースコードやSubversionの作業コピーなど、細々とした大量のファイルが影響してると考えられる。実際、本プールでは4KiB以下のファイルが全ファイルの8割を占めており、その中でも1KiB以下が5割を占めている。 | + | プールサイズの25%というと結構な割合となるが、細々とした大量のファイルの影響が考えられる。実際、このプールでは4KiB以下のファイルが全ファイル数の8割を占めており、中でも特に1KiB以下が5割を占めている。 |
| ===== 様々なプールを分析してみる ===== | ===== 様々なプールを分析してみる ===== | ||
| - | Special VDEVの必要量は、プールの使われ方で大きく変わると思われる。 | + | Special VDEVの必要量は、プールの使われ方にも大きく依存すると考えられる。 |
| - | 手元の6つのプールについてSpecial VDEVの容量に影響しそうな項目を調べてみた。 | + | そこで、手元の6つのプールについてSpecial VDEVの容量に影響しそうな項目を調査した。 |
| - | ^ プール名 | + | ^ プール名 |
| - | | システムプール | ミラー | 99.8GiB | + | | システムプール | ミラー | |
| - | | データプール1 | ミラー | 7.12TiB | + | | データプール1 | ミラー | |
| - | | データプール2 | RAIDZ1 | 20.4TiB | | + | | データプール2 | RAIDZ1 | 20.2/20.4TiB | 229356 | 92.351MiB | 700MiB \\ (0.003%) | 6.74GiB \\ (0.03%) | データプール1より重要度が下のデータ群。 \\ 数GB級の動画ファイル、数百KBクラスの画像、アプリのアーカイブ(ISO, |
| - | | データプール3 | 単体 | 7.1TiB | + | | データプール3 | 単体 | |
| - | | 業務用プール1 | RAIDZ1 | 8.93TiB | + | | 業務用プール1 | RAIDZ1 | |
| - | | 業務用プール2 | ミラー | 1.99TiB | + | | 業務用プール2 | ミラー | |
| + | |||
| + | ファイル数が多いほど、またファイルサイズが小さいほど、メタデータと小ブロックの量は増える傾向にあるものの、一概にプール容量の何パーセントと言える感じではなさそうだ。 | ||
| + | |||
| + | システムプールが少々特殊な気がするので除外すると、多くの場合、Special VDEVのサイズはプールサイズの5%あれば十分と言えなくもない?が、断定するにはサンプルが不足してるかな…。少々時間はかかるけど、今のところ都度zdbで計算する方がよさげ。潤沢な資金があるならともかく、20TiBの5%は1TiBになるので、丸ごとSpecial VDEVにおごるのは勿体ない気も…。 | ||
| ファイルサイズの分布。 | ファイルサイズの分布。 | ||
| 行 112: | 行 170: | ||
| {{ : | {{ : | ||
| - | レコードサイズの分布。 | + | 用途ごとにプールを分けてることもあって、ファイルサイズはプールごとにそれなりにバラつきが見られる(目論見通り)。 |
| + | |||
| + | 続いてレコードサイズの分布。 | ||
| {{ : | {{ : | ||
| - | txgのおかげで殆どが128KiBレコードとなっており、グラフにする意味もなかったという。流石にこの図からは何も読み取れないので、各プールの使用率上位3位のレコードサイズを表にまとめた。 | + | ZFSのトランザクショングループ(txg)のおかげか殆どが128KiBレコードとなっており、グラフにする意味もなかった。txgって予想以上に効くんだね…。これでは何も読み取れないので、各プールの使用率上位3位のレコードサイズを表にまとめた。 |
| ^ プール名 | ^ プール名 | ||
| 行 126: | 行 186: | ||
| | 業務用プール2 | 128k (97.7%) | 512 (1.75%) | 11k (0.02%) | | | 業務用プール2 | 128k (97.7%) | 512 (1.75%) | 11k (0.02%) | | ||
| + | ZFSの書き込みは、ほぼほぼ128k/ | ||