してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

FreeBSDでZFSを設定してみる。

[2016年12月16日版]

さて、前のページで、AzureにFreeBSDをインストールし、データディスクを追加しました。

まだの方は、以下のリンクから、Microsoft AzureのFreeBSDをインストールして、ディスクを追加してください。

このページでは、AzureのFreeBSDに追加したデータディスクを利用して、ZFSとしてマウントしてみます。

ZFSについて

FreeBSDで利用できるファイルシステムに、ZFSがあります。

ZFSは、知っている人は知っている大変便利なファイルシステムです。

もともと、ZFSは、Solaris向けに開発されたエンタープライズ向けのファイルシステムです。

機能的には、ACL、スナップショット、差分転送、圧縮、暗号化など、一通りの機能が揃った優秀なファイルシステムです。

ZFSの特徴の一つに、階層的な、ディスクキャッシュがあります。

ディスクキャッシュとは、HDDのような遅い記憶媒体の体感速度を改善するため、利用頻度の高いデータを、メインメモリのDRAM等に一時的にためておき、必要なった際に、素早く処理を行う手法です。

ZFSでは、メインメモリをディスクキャッシュとして利用するARC以外に、SSDを読み込みキャッシュ(L2ARC)、書き込みキャッシュ(ZIL)として利用する構成が使えます。

Webサーバ用途では、HDDからのコンテンツ読み込みが多くなると思うので、メインメモリの余分をディスクのキャッシュとして利用するARCではあふれてしまうことが予想されます。

そこで、ローカルSSDの7Gを、ZFSのHDDの2次キャッシュ、つまりL2ARCとして利用します。

書き込みキャッシュのZILは、有効に働くシーンが限られるので、今回は割愛します。

 

私の独断と偏見だと、ネットワークファイルシステム向けには、OpenAFS、ローカル向けのファイルシステムには、ZFSが理想型です。

ということで、FreeBSD 11.0のインストールに続いて、ZFSの設定を行います。

ZFSの機能を有効にする。

まず、ZFSの機能を有効にします。

これは、rc.confにzfs_enable="YES"の1行を追加します。

$ sudo su
# vi /etc/rc.conf
/etc/rc.conf
hostname="freebsd11vm"
ifconfig_hn0="DHCP"
ifconfig_hn0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
waagent_enable="YES"
zfs_enable="YES"

次に、サービスを開始します。

# service zfs start

これで、ZFSが使えるようになります。

ZFSストレージプールの作成

続いて、ストレージプールと呼ばれる。ディスクデバイスのグループを作ります。

以下のように、先ほど作ったデータディスクを、ストレージプールとして構成します。

コマンドとしては、zpoolコマンドを使います。

# zpool create tank /dev/da2
# zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          da2       ONLINE       0     0     0

errors: No known data errors

今回は、1つのディスクだけを使うので、あまり面白くないですが、2つのディスクでストレージプールを作る際に、RAID-1を構成できます。3つなら、RAID-Zと呼ばれる信頼性と容量の両者のバランスの良い構成も可能です。

ZFSファイルシステムの作成

さきほどのzpoolコマンドによって、ルートに/tankといったフォルダができていると思います。

これは、以下のコマンドで確認できます。

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   264K  28.8G    96K  /tank

ZFSでは、このように、ストレージプールがまずマウントされます。

早速、ストレージプールに対して、設定を行います。

お勧めは、lz4圧縮を行い、atimeを無効にする、以下の設定です。

# zfs set compression=lz4 atime=off tank

lz4圧縮は、ダイレクトにIOPSの削減に繋がります。

atimeを無効にすることで、最終閲覧時間の書き込みを行わくなるので、これもIOPSの削減に貢献します。

SSDの寿命を延ばすためにも、atimeを無効にする設定が主流になっていくと思われます。

設定の内容は、以下のコマンドで確認できます。

# zfs get all tank
NAME  PROPERTY              VALUE                  SOURCE
tank  type                  filesystem             -
(…省略…)
tank  compression           lz4                    local
tank  atime                 off                    local
(…省略…)
#

続いて、ストレージプールの下に、管理の単位となるファイルシステムを作ります。

といって、これもストレージプールのように、単なるフォルダのように見えます。

 

ファイルシステムは、zfs createコマンドで作ります。

場所は、ストレージプールや、既存のファイルシステムの配下に作ります。

たとえば、ホームディレクトリとして、各ユーザにファイルシステムを割り当てるような場合は、

# zfs create tank/home
# zfs create tank/home/yourname

と、ファイルシステムを作ります。

tankフォルダの配下に、homeや、home/yournameといったフォルダが作られるので、一見、mkdirを実行して作ったフォルダと同じように見えます。

そのため、ファイルシステムとフォルダの違いは一見して判りませんが、以下のコマンドで、ファイルシステムの一覧を取得できます。

# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
tank                            745M  28.1G    96K  /tank
tank/home                       744M  28.1G    96K  /tank/home
tank/home/yourname              744M  28.1G   744M  /tank/home/yourname			

上記一覧にあるように、作成直後の各ファイルシステムは、ストレージプールの残り(AVAIL)を共有しています。

一見、便利なように思いますが、あるファイルシステムに巨大なファイルができたりすると、他のファイルシステムが煽りを食らう可能性もあります。

そこで、特定のファイルシステムに容量を予約したり、一定以上の容量の使用を制限するクオータなどを設定できます。

ZFSファイルシステムのクオータ、予約設定

ファイルシステムに対しては、容量のクオータ(割り当て制限)や、予約を行うことができます。

たとえば、/tank/home/yournameの配下の容量を、10G以下に制限するには、ファイルシステムのクオータ(quota)プロパティを設定します。

# zfs set quota=10G tank/home/yourname

とします。

すると以下のように、AVAILが変化します。

# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
tank                            745M  28.1G    96K  /tank
tank/home                       744M  28.1G    96K  /tank/home
tank/home/yourname              744M  10.0G   744M  /tank/home/yourname			

逆に、最低、/tank/home/yourname配下に、最低5Gバイトは使用できるように保証するには、ファイルシステムの予約(reservation)プロパティを使います。

# zfs set reservation=5G tank/home/yourname

すると、今度は、USEDが変化します。

# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
tank                            5G    23.1G    96K  /tank
tank/home                       5G    23.1G    96K  /tank/home
tank/home/yourname              744M  10.0G   744M  /tank/home/yourname			

/tank/home/yourname以外のUSEDが5Gになって、AVAILが23.1Gに減っています。

この/tank/home/yourname以外のUSEDを、/tank/home/yournameが、独占的に使用できるようなってます。

それぞれ容量を確認するには、ファイルシステムに対して、以下のコマンドを使います。

$ zfs get quota,reservation /tank/home/yourname
NAME  PROPERTY     VALUE   SOURCE
tank  quota        10G     local
tank  reservation  5G      local

クオータや予約の設定を使うことで、ディスク容量不足に起因する障害を回避しやすくなります。

ZFSファイルシステムのチューニング

ZFSのファイルシステムは、さまざまな設定を行うことができます。

設定によっては、パフォーマンスを改善できます。いわゆるチューニングです。

 

zfs setコマンドでtankに設定したcompressionプロパティなどは、下位のファイルシステムに継承されます。

継承した設定では不便な場合は、クオータなどと同様、ファイルシステム単位で変更することができます。

ZFSの圧縮は、CPUパワーを使います。

ファイルシステムに保存する内容によっては、圧縮がほとんど効かないこともあります。

そこで、JPEGやMP4ファイルなど、既に圧縮が十分かかっているファイルばかりを入れるフォルダであれば、


# zfs create tank/jpeg
# zfs set compression=off tank/jpeg

とすれば、圧縮処理が入らない分、処理が速くなります。

圧縮率は、

# zfs get compressratio tank/home/yourname
NAME                           PROPERTY       VALUE  SOURCE
tank/home/yourname             compressratio  2.21x  -	

で調べることができます。

L2ARCの設定

仕上げに、SSDをHDDの2次キャッシュに使う、L2ARCの設定を行います。

まずは、ローカルSSDのフォーマットを行わない設定に変えます。

これは、Azureのエージェントの設定を変更します。

# vi /etc/waagent.conf
/etc/waagent.conf
(…省略…)
		ResourceDisk.Format=n
(…省略…)		

Azureのエージェントを再起動します。

# service waagent restart

次にマウントを解除します。

# umount /dev/da1s1

これを、zpoolのキャッシュに追加します。

# zpool add tank cache /dev/da1

追加されたかは、zpool statusコマンドで確認できます。

# zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          da2       ONLINE       0     0     0
        cache
          da1       ONLINE       0     0     0

errors: No known data errors

これで、L2ARCが有効になりました。

zfs-statsのインストール

ZFSのARC/L2ARCのキャッシュ動作などは以下のコマンドから確認することができます。

ただ、デフォルトでは入っていないので、パッケージからインストールします。

# pkg install zfs-stats
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        zfs-stats: 1.2.2_1

Number of packages to be installed: 1

9 KiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching zfs-stats-1.2.2_1.txz: 100%    9 KiB   9.5kB/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing zfs-stats-1.2.2_1...
[1/1] Extracting zfs-stats-1.2.2_1: 100%			

インストールが済んだら、試してみます。

# zfs-stats -a

------------------------------------------------------------------------
ZFS Subsystem Report                            
------------------------------------------------------------------------

System Information:
(…省略…)
System Memory:

        0.37%   12.46   MiB Active,     32.93%  1.08    GiB Inact
        48.26%  1.59    GiB Wired,      0.00%   0 Cache
        18.43%  620.96  MiB Free,       0.00%   4.00    KiB Gap
(…省略…)
------------------------------------------------------------------------
ARC Summary: (HEALTHY)
        Memory Throttle Count:                  0
(…省略…)
------------------------------------------------------------------------

ARC Efficiency:                                 17.26k
        Cache Hit Ratio:                51.86%  8.95k
        Cache Miss Ratio:               48.14%  8.31k
        Actual Hit Ratio:               51.86%  8.95k
(…省略…)
------------------------------------------------------------------------
L2 ARC Summary: (HEALTHY)
        Passed Headroom:                        9.86k
        Tried Lock Failures:                    16
        IO In Progress:                         0
        Low Memory Aborts:                      0
        Free on Write:                          1
        Writes While Full:                      31
        R/W Clashes:                            0
        Bad Checksums:                          0
        IO Errors:                              0
        SPA Mismatch:                           0

L2 ARC Size: (Adaptive)                         897.80  MiB
        Header Size:                    0.00%   0

L2 ARC Breakdown:                               7.44k
        Hit Ratio:                      0.00%   0
        Miss Ratio:                     100.00% 7.44k
        Feeds:                                  11.48k

L2 ARC Buffer:
        Bytes Scanned:                          345.45  GiB
        Buffer Iterations:                      11.48k
        List Iterations:                        45.94k
        NULL List Iterations:                   13.07k

L2 ARC Writes:
        Writes Sent:                    100.00% 86

------------------------------------------------------------------------
(…省略…)

といった感じに、ARC、L2ARCなどのキャッシュヒット率などが表示されます。

(上記は、まだL2ARCを利用するほどのディスクアクセスが無いため、HitRatiogが0ですね…)

[NEXT] >> FreeBSDのZFSのACLを設定してみる

©Copyrights 2015-2023, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。