FreeBSD で ZFS を利用する – キャッシュを構成・設定する

ZFS

今回は「FreeBSD で ZFS を利用する – ZFS のキャッシュの仕組みを理解する」で説明した ARC の設定,L2ARC および SLOG デバイスの構成を実施します.

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

------------------------------------------------------------------------

負荷のかかってない状態で実施しているため変化がほぼ無い結果の出力で申し訳ありませんが,操作および表示については理解できるかと思います.

今回は以上としまして,次は重複排除について触れたいと思います.

コメント

タイトルとURLをコピーしました