今回は「FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する」で説明した ARC の設定,L2ARC および SLOG デバイスの構成を実施します.
- ZFS に関するお話
- FreeBSD で ZFS を利用する – ZFS 概要
- FreeBSD で ZFS を利用する – ZFS プールの作成 (パーティション切らない編)
- FreeBSD で ZFS を利用する – ZFS プールの機能について理解する
- FreeBSD で ZFS を利用する – ファイルシステムを管理する
- FreeBSD で ZFS を利用する – send/recv を使い倒す
- FreeBSD で ZFS を利用する – RAWボリュームを切り出す & iSCSI として提供する
- FreeBSD で ZFS を利用する – ファイルシステムの圧縮を利用する・比較する
- FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する
- FreeBSD で ZFS を利用する – キャッシュを構成・設定する
- FreeBSD で ZFS を利用する – 重複排除を利用する・確認する
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (1)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (2)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (3)
- FreeBSD で ZFS を利用する – ZFS ファイルシステムの機能について理解する (4)
ARC の設定
ARC はデフォルトで搭載メモリ -1G が最大値となっています.ですので,他のサービスを動作させようとする場合,ARC にメモリが持っていかれて他サービス側に影響を及ぼすことがあります.
したがって,ARC に割り当てる最大値を明示的に設定する事をお勧めします.
sysctl の該当のノブ名およびデフォルトの値は次のとおりです.
# sysctl vfs.zfs.arc_max vfs.zfs.arc_max: 0
最大値を設定する際,バイト単位で値を入力します.昔は M などの単位も使えたのですが今は次のとおりの結果となります.例は3G を最大値に指定しようとした場合です.
# sysctl vfs.zfs.arc_max=3072M sysctl: invalid unsigned long '3072M'
ですので,バイト単位の値で設定する必要があります.3G をバイトになおすと 3221225472 ですので,これで設定してみます.
# sysctl vfs.zfs.arc_max=3221225472 vfs.zfs.arc_max: 0 -> 3221225472
この通り,0 から値が変更されました.
再起動後も設定を反映させるために /boot/loader.conf にも追記しましょう.
# cat /boot/loader.conf vfs.zfs.arc_max=3221225472
L2ARC の設定
SSD/NVMe デバイスを L2ARC として設定したい場合,方法は二通りあります.プールの作成時に指定するか後から追加するかです.結果に違いはありません.
今回はすでにあるプール pool0 に対して L2ARC を追加してみます.わかりやすさで NVMe デバイスを搭載,指定しています.
まずは現状のプールの状態を確認します.
# zpool status pool0
pool: pool0
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
da4 ONLINE 0 0 0
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
errors: No known data errors
これに L2ARC のキャッシュデバイスを追加してステータスを確認します.
# zpool add pool0 cache nvd0
# zpool status pool0
pool: pool0
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
da4 ONLINE 0 0 0
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
cache
nvd0 ONLINE 0 0 0
L2ARC は「FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する」で解説している通りデバイスのロストによる影響はありませんので,mirror として組み込む意義はありません.キャッシュ用として二つの SSD/NVMe デバイスを持っている場合はもう一つ素直に追加して容量を増やす事の方が有意義です.
SLOG の設定
SLOG も SSD/NVMe デバイスを設定したい場合,方法は二通りあります.プールの作成時に指定するか後から追加するかです.結果に違いはありません.
上記のプールの状態の所に単体の SLOG デバイスを追加する場合は次のとおりになります.
# zpool add pool0 log nvd1
# zpool status pool0
pool: pool0
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
da4 ONLINE 0 0 0
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
logs
nvd1 ONLINE 0 0 0
cache
nvd0 ONLINE 0 0 0
SLOG デバイスは同期書き込み時のバッファーとして利用される事から,このデバイスがロストするとハードディスクに反映前のデータが失われる事になります.その為,L2ARC と違い SLOG はミラーで構成する事が望ましいです.
一度単体ドライブとして追加している SLOG を削除,ミラーで追加する.ということを実施してみます.
# zpool remove pool0 nvd1
# zpool status pool0
pool: pool0
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
da4 ONLINE 0 0 0
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
cache
nvd0 ONLINE 0 0 0
# zpool add pool0 log mirror nvd1 nvd2
# zpool status pool0
pool: pool0
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
da4 ONLINE 0 0 0
da5 ONLINE 0 0 0
da6 ONLINE 0 0 0
logs
mirror-5 ONLINE 0 0 0
nvd1 ONLINE 0 0 0
nvd2 ONLINE 0 0 0
cache
nvd0 ONLINE 0 0 0
logs の所が mirror として表示されており,ミラー化されている事が確認できます.
利用状況を確認する
zfs iostat で確認する
L2ARC および SLOG の利用状況を確認するには,一番手っ取り早い方法が zpool iostat コマンドでの確認になります.次のとおり -v を付ける事で各デバイスの IO 状況,L2ARC や SLOG であれば使用状況も出力する事ができます.
# zpool iostat pool0
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
pool0 14.7G 581G 0 13 17.4K 69.6K
root@bsd13-1:~ # zpool iostat -v pool0
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
pool0 14.7G 581G 0 13 17.3K 69.4K
raidz1-0 7.34G 291G 0 6 8.51K 31.9K
da1 - - 0 2 2.86K 10.6K
da2 - - 0 2 2.86K 10.6K
da3 - - 0 2 2.78K 10.6K
raidz1-1 7.35G 291G 0 6 8.16K 31.0K
da4 - - 0 2 2.72K 10.3K
da5 - - 0 2 2.74K 10.3K
da6 - - 0 2 2.70K 10.3K
logs - - - - - -
mirror-5 0 19.5G 0 0 2.97K 28.4K
nvd1 - - 0 0 2.83K 14.2K
nvd2 - - 0 0 147 14.2K
cache - - - - - -
nvd0 176K 20.0G 0 0 2.12K 1.00K
---------- ----- ----- ----- ----- ----- -----
zpool iostat は iostat 同様に引数に数字を付ける事で n秒毎の状況を確認する事が可能です.
その場合,iostat 同様に最初の出力は無視して,二つ目以降の値を見ていくのが良いです.
# zpool iostat -v pool0 5
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
pool0 14.7G 581G 0 11 14.1K 56.5K
raidz1-0 7.34G 291G 0 5 6.94K 26.0K
da1 - - 0 1 2.33K 8.66K
da2 - - 0 1 2.33K 8.67K
da3 - - 0 1 2.27K 8.66K
raidz1-1 7.35G 291G 0 5 6.65K 25.3K
da4 - - 0 1 2.21K 8.43K
da5 - - 0 1 2.23K 8.43K
da6 - - 0 1 2.20K 8.43K
logs - - - - - -
mirror-5 0 19.5G 0 0 1.48K 14.2K
nvd1 - - 0 0 1.41K 7.10K
nvd2 - - 0 0 73 7.10K
cache - - - - - -
nvd0 176K 20.0G 0 0 1.21K 587
---------- ----- ----- ----- ----- ----- -----
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
pool0 14.7G 581G 0 0 0 0
raidz1-0 7.34G 291G 0 0 0 0
da1 - - 0 0 0 0
da2 - - 0 0 0 0
da3 - - 0 0 0 0
raidz1-1 7.35G 291G 0 0 0 0
da4 - - 0 0 0 0
da5 - - 0 0 0 0
da6 - - 0 0 0 0
logs - - - - - -
mirror-5 0 19.5G 0 0 0 0
nvd1 - - 0 0 0 0
nvd2 - - 0 0 0 0
cache - - - - - -
nvd0 176K 20.0G 0 0 0 0
---------- ----- ----- ----- ----- ----- -----
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
pool0 14.7G 581G 0 0 0 0
raidz1-0 7.34G 291G 0 0 0 0
da1 - - 0 0 0 0
da2 - - 0 0 0 0
da3 - - 0 0 0 0
raidz1-1 7.35G 291G 0 0 0 0
da4 - - 0 0 0 0
da5 - - 0 0 0 0
da6 - - 0 0 0 0
logs - - - - - -
mirror-5 0 19.5G 0 0 0 0
nvd1 - - 0 0 0 0
nvd2 - - 0 0 0 0
cache - - - - - -
nvd0 176K 20.0G 0 0 0 0
---------- ----- ----- ----- ----- ----- -----
zfs-stats パッケージを利用する
別の方法として zfs-stats パッケージを利用する方法があります.
パッケージは pkg install コマンドで簡単にインストールする事ができます.
# pkg install zfs-stats
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 2 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
perl5: 5.34.3_3
zfs-stats: 1.3.2
Number of packages to be installed: 2
The process will require 61 MiB more space.
15 MiB to be downloaded.
Proceed with this action? [y/N]: y
[1/2] Fetching zfs-stats-1.3.2.pkg: 100% 10 KiB 10.3kB/s 00:01
[2/2] Fetching perl5-5.34.3_3.pkg: 100% 15 MiB 15.2MB/s 00:01
Checking integrity... done (0 conflicting)
[1/2] Installing perl5-5.34.3_3...
[1/2] Extracting perl5-5.34.3_3: 100%
[2/2] Installing zfs-stats-1.3.2...
[2/2] Extracting zfs-stats-1.3.2: 100%
zfs-mon
zfs-mon プログラムは,ARC の状況をリアルタイムに表示するプログラムです.
以下のとおり -a オプションで全てを表示になり,キャッシュヒット・キャッシュミスの状態も含めて表示してくれます.
停止は Ctrl+C で止める事になります.
# zfs-mon -a
ZFS real-time cache activity monitor
Seconds elapsed: 3
Cache hits and misses:
1s 10s 60s tot
ARC hits: 0 1 1 1
ARC misses: 0 0 0 0
Cache efficiency percentage:
10s 60s tot
ARC: 100.00 100.00 100.00
zfs-stats
zfs-stats プログラムは,起動後からの ARC などの利用状況をサマリーとして出力してくれるプログラムです.
-a オプションで全部表示できますが,500行くらいになります.-A オプションで ARC のサマリーを,-E オプションで ARC のキャッシュ利用状況を.また,-L オプションで L2ARC のステータスを表示できますので,通常はこちらの三つのオプションを利用するのが良いと思います.
-A : ARC summary
# zfs-stats -A
------------------------------------------------------------------------
ZFS Subsystem Report Mon Dec 25 22:21:53 2023
------------------------------------------------------------------------
ARC Summary: (HEALTHY)
Memory Throttle Count: 0
ARC Misc:
Deleted: 29
Mutex Misses: 0
Evict Skips: 3
ARC Size: 0.44% 13.53 MiB
Target Size: (Adaptive) 4.13% 126.89 MiB
Min Size (Hard Limit): 4.13% 126.89 MiB
Max Size (High Water): 24:1 3.00 GiB
Compressed Data Size: 685.00 KiB
Decompressed Data Size: 24.96 MiB
Compression Factor: 37.32
ARC Size Breakdown:
Recently Used Cache Size: 50.00% 63.44 MiB
Frequently Used Cache Size: 50.00% 63.44 MiB
ARC Hash Breakdown:
Elements Max: 338
Elements Current: 100.00% 338
Collisions: 0
Chain Max: 0
Chains: 0
------------------------------------------------------------------------
-E : ARC efficiency
# zfs-stats -E
------------------------------------------------------------------------
ZFS Subsystem Report Mon Dec 25 22:22:30 2023
------------------------------------------------------------------------
ARC Efficiency: 37.71 k
Cache Hit Ratio: 99.10% 37.37 k
Cache Miss Ratio: 0.90% 340
Actual Hit Ratio: 98.96% 37.32 k
Data Demand Efficiency: 100.00% 0
CACHE HITS BY CACHE LIST:
Anonymously Used: 0.14% 53
Most Recently Used: 41.32% 15.44 k
Most Frequently Used: 58.54% 21.88 k
Most Recently Used Ghost: 0.00% 0
Most Frequently Used Ghost: 0.00% 0
CACHE HITS BY DATA TYPE:
Demand Data: 0.00% 0
Prefetch Data: 0.00% 0
Demand Metadata: 99.86% 37.32 k
Prefetch Metadata: 0.14% 53
CACHE MISSES BY DATA TYPE:
Demand Data: 0.00% 0
Prefetch Data: 0.00% 0
Demand Metadata: 78.82% 268
Prefetch Metadata: 21.18% 72
------------------------------------------------------------------------
-L : L2 ARC statistics
# zfs-stats -L
------------------------------------------------------------------------
ZFS Subsystem Report Mon Dec 25 22:23:02 2023
------------------------------------------------------------------------
L2 ARC Summary: (HEALTHY)
Low Memory Aborts: 0
Free on Write: 0
R/W Clashes: 0
Bad Checksums: 0
IO Errors: 0
L2 ARC Size: (Adaptive) 175.50 KiB
Decompressed Data Size: 9.10 MiB
Compression Factor: 53.10
Header Size: 0.00% 0 Bytes
L2 ARC Breakdown: 241
Hit Ratio: 0.00% 0
Miss Ratio: 100.00% 241
Feeds: 1.58 k
L2 ARC Writes:
Writes Sent: 100.00% 42
------------------------------------------------------------------------
負荷のかかってない状態で実施しているため変化がほぼ無い結果の出力で申し訳ありませんが,操作および表示については理解できるかと思います.
今回は以上としまして,次は重複排除について触れたいと思います.
コメント