差分
このページの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: |
- | Special VDEVに格納されるデータは大きく2種類に分けられる。 | + | Special VDEVに格納されるデータは大きく2つに分けられる。 |
* メタデータ | * メタデータ | ||
* 小ブロックのデータ(スモールI/ | * 小ブロックのデータ(スモールI/ | ||
- | 対象のプールでそれぞれのデータ量を確認し合算すればよい。いずれもzdbコマンドで確認することができる。 | + | zdbコマンドでプールのこれらの現在量を確認し、Special VDEVの容量を見積もることができそうだ。 |
- | 稼働中の家鯖のシステム用プールで実際に確認してみよう。 | + | 実際に、稼働中の家鯖のプールで実際に確認してみよう。対象プールの下表のとおり。 |
- | なお、zdbの実行ではそれなりにメモリを消費するので注意されたし。プールの使用量がテラバイト級だと数ギガ単位で消費する。メモリ不足でzdbが落ちるようなら、Special VDEVより先にメモリを追加しましょう。何はなくともZFSはメモリが重要なので。 | + | ^ 用途 | システム用プール (zroot) | |
+ | ^ 種類 | ミラー | | ||
+ | ^ 使用量/ | ||
+ | ^ 特記事項 | < | ||
+ | * FreeBSD 12.2-RELEASEが入っている | ||
+ | * 9-BETAの頃から連綿と続く年季の入ったプール | ||
+ | * ホームディレクトリは別プールの | ||
+ | * 細かなファイルが多め(/ | ||
+ | </ | ||
+ | |||
+ | なお、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に載るとのこと。 |
'' | '' | ||
行 52: | 行 62: | ||
</ | </ | ||
- | この例だと、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行きとなるので、'' | このプロパティは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: | 行 94: | ||
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: | 行 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程度となる。 | + | プールの使用量とメタデータ量/ |
- | プールサイズの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: | 行 165: | ||
{{ : | {{ : | ||
- | レコードサイズの分布。 | + | 用途ごとにプールを分けてることもあって、ファイルサイズはプールごとにそれなりにバラつきが見られる(目論見通り)。 |
+ | |||
+ | 続いてレコードサイズの分布。 | ||
{{ : | {{ : | ||
- | txgのおかげで殆どが128KiBレコードとなっており、グラフにする意味もなかったという。流石にこの図からは何も読み取れないので、各プールの使用率上位3位のレコードサイズを表にまとめた。 | + | ZFSのトランザクショングループ(txg)のおかげか殆どが128KiBレコードとなっており、グラフにする意味もなかった。txgって予想以上に効くんだね…。これでは何も読み取れないので、各プールの使用率上位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/ |