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 と、ファイルシステムを作ります。 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ですね…)
| |||||||||||||||||||||||||||||||||||||||||