ねこルーム

テキトーな趣味と技術系。

TrueNAS で 10G NAS を構築してみた(宅内だけ)

前回のあらすじ。

nekoy3.hateblo.jp

10G NAS 作ろうかな〜とかおもってパーツとか色々考えてた。

事件もあった。

これは 32GBx2 の ECC メモリ!

サーバ一号機を NAS にして、新サーバ四号機にこいつを乗せようと思ったらチップセットが Registered DIMM に対応してなくて爆死!!!

仕方ないのでラックサーバに食わせてメモリを 112GB にしました。

あと今回からちょっと Markdown で書いてみようってお試しでやってる。

NAS 君の構成

前回全く触れてなかったが、今回NASにするサーバ機の構成は以下の通り。

種類 パーツ名 備考
M/B GIGABYTE B365M DS3H BIOS改造済み
CPU Intel Core i7-8750H アリエクで買った謎のゲタ付きES品ノートCPU
RAM DDR4 8GB + 16GBx2 (40GB) 本当は8GBx2だけど刺さらん
PSU なんか過剰性能のやつ 80+ GOLD 700Wとか
ROM SATA M.2 128GB x2 セットで購入しPCIe経由接続
SATA M.2 256GB x2 高速ストレージ用途
HDD 2TB x2 通常データ保管用途

組み立て初期から電源ユニット変えたくらいで、ほぼ変わらずおよそ4、5年間初期は Ubuntu Desktop を、その後は proxmox サーバとして動き続けてくれたマシン。 ・・・を。別にまだ壊れても無いしスペック的にも Windows が動くにはちょっとキツいかもしれないが、Unix 系 OS しか入れないし。 まだまだ働いてもらおう。NASとして。

B365M が、MicroATX サイズだが PCIe スロットが4つくらいあるはずなので、10G NIC とか M.2 増設とか色々挿して運用する。

あれ?

NVMe M.2 SSD はどこいった??

前回の記事では、L2ARC 用途で NVMe M.2 を搭載するみたいな話をしていた気がする。

なんだけど、マザーボードの M.2 スペーサがなくなってて付けられなかった・・・

本当はつけたかったが、マザーボード取り外してスペーサーつけるのが面倒なので、メモリ 40GB でゴリ押すことにした。多分 128GB ( 96GB ) までは増やせるし。

というわけでストレージ六台構成。

構成例について

「余物のパソコンにTrueNASをつっこんでNASにしたい」程度の熱量の人間が多数だと思う。

私のは、10G NASを搭載することで高速伝送を可能にした NAS ということで構築しているのでこのような構成になっている。

しかし、本気で高速化したいのであれば

  • SFP+ しか刺さらんようなL2スイッチ
  • 宅外からも 10G クライアントで通信するためには、10G 回線をまず引くことが前提
  • ストレージは全て NVMe M.2 SSD ( + PCIe 4.0 以上)

みたいな構成が望ましいわけで、無限にお金がかかるんですね。

なので、高速でやり取りしたいデータは SATA SSD に入れて、それ以外は HDD に置くと。そういう構成にしている。

伝送速度ボトルネックの話も後述。

OS のインストール

今更だが、Markdown 記法にしたので見出しがh1になりました。(みたまま編集だとh3から始まるんだよね)

OS のインストールは以下リンクを参考に行った。

バージョンは TrueNAS Core 13.0。

kirishima.it

特に独特な設定をしているわけではない。

ただ、ブート用ストレージには増設した SATA SSD M.2 2枚を指定。SATA SSD 2枚と HDD 2枚はそれぞれデータストレージ用。 なので合計容量は2.25TBくらいかな?

何故 TrueNAS CORE なのか?

現在、TrueNAS Scale と CORE の2種類が存在しており、それぞれバージョンが異なるので調べ物する際は注意。

何が違うのかというと、 Debian ベース(Scale)か FreeBSD ベース(CORE)か。

とは言っても、違いがよーわかってないので歴の長い Core を選ぶのが安定な気がする。

TrueNAS のセットアップ

kirishima.it

このサイトを見てセットアップ。

主にやったのは

基本設定

プールと共有フォルダ

それぞれのやり方については上記のサイトに書いてあるので省略。

有効化しているサービス

有効化しているサービスは以下。

  • FTP
    なんとなく有効化。

  • NFS
    Proxmox VE の仮想マシン用。

  • S.M.A.R.T.
    HDD等の状態監視。

  • SMB(samba)
    Android / Windows / Fedora / macOS で接続可能。

    ACL (権限関連)の設定は大変かもしれないが、記事通り進めれば問題なし。

  • SNMP
    監視用(監視したいという願望)。

  • SSH
    メンテナンス用途。

  • UPS
    UPS接続用。以前は Proxmox VE 上に UPS 管理VMを置いていたが、TrueNAS CORE につないでやってみようかなと。

    • APC の300W UPS(2万円程度)でも使える。
    • 他のマシンはこの UPS サービスを参照して連動できるんかな?(スイッチ接続前提)

スピード検証

おそらく全人類が期待しているであろうこのセクション。(?)

iperf3

まず iperf3 でネットワーク速度について検証した。

メイン PC と NAS を SFP+ 経由で接続しているので、10G 出るはず!!

Bitrate 9.39 Gbits/s !!

10G の恩恵をめちゃくちゃ得られてるね。素晴らしい。

Proxmox は 1G に最適化された設定になってるぽいんだけど( mtu が1500だったり)、TrueNAS では何の設定もせずに(なんなら iperf3 も最初から入ってるし)このスピードが出る。素晴らしい。

CrystalDiskMark

お次は CrystalDiskMark での検証。

メインPC ( Windows 10 ) から TrueNAS に対して Read/Write の速度を測ってみる。

まず HDD pool の検証。

明らかに HDD の速度上限を超えている気がする(大体 150MB/s 前後)。おそらくキャッシュに一度データを貯めるような挙動をするからじゃないかな?

次に SSD pool。

SSD とはいえ、NVMe M.2 ではなく SATA SSD なので、速度上限は 500MB/s とか。

こちらは HDD より少し早いかな?程度になった。

実際にデータを伝送して速度を測ってみよう

メインPC ( Windows 10 ) から TrueNAS に対して実際の動画データを送受信して、どのくらいのスピードが出ているのかを検証する。

これが問題だった。

この画像を見てもらうと、スピードが一定の箇所から遅くなっている。

それに加えて、最高速度で 150MB/s くらいしか出てない。

これは 39.2GB の動画データを送信したときのスピード。

  • share(hdd)

計測タイム:5分1秒(伝送130.2MB/s)

計測タイム:4分59秒(伝送131.1MB/s)

ほぼ変わらないじゃん!!

と思って色々調べたら、ポンコツな理由だった。

元の動画ファイルを HDD に置いてあるやんけ!!!

これはまごうことなきアホ。

というわけで、メインのCドライブ ( NVMe M.2 ) に動画データを置き、再度データ伝送。(さっきと異なる動画ファイルだが・・・)

すると、NAS から Download するときは 270MB/s 程度、速度が常にほとんど一定で通信できている。

これでも SSD の上限スピードには遠いがとりあえず置いておく。

問題は、メインPC から TrueNAS にアップロードするとき、一定のデータを伝送した後急激にスピードが落ちた。

これはどういうことか?

「実際にデータを伝送して速度を測ってみよう」のセクションでは、SSD も HDD もほとんど同じ速度になっている。 これは、

  • メインPC 側のボトルネック(約150MB/s)

  • 同じような速度減衰が起きている

ため。

ChatGPT マンに投げてみたら、「Dirty Throttling」が原因ではないかと言われた。

データを NAS に伝送した時、CrystalDiskMark の結果を見ると HDD の伝送で上限値以上の値が出ていたのは、最初メモリ上に Dirty Page としてストレージに書き込む必要があるデータとしてメモリ上に一時的に置いてからストレージに書き込みしている。

で、この dirty page量 が dirty limit を超えてしまうと、CPU が書き込み速度を抑制してしまうことで速度が低下する、と。

じゃあどうすれば改善するのかというと、応急処置的な話で言えばこの dirty limit を上げること、長期的な話で言えば L2ARC を搭載するとか、ストレージ自体の伝送速度を RAID 組むなり NVMe M.2 搭載するだったりで高速化するとか。

ちなみに、応急処置の話で、 dirty limit を上げるというのは、zfs_dirty_data_max という値を設定することで底上げできる。

Module Parameters — OpenZFS documentation より。

zfs_dirty_data_max の設定ができるんだけど、初期値は搭載メモリの 10% らしく。

最初 8GB しか積まずに OS をインストールした気がするので、極端に小さかった可能性があるけれども。

設定方法や推奨容量は OS や搭載メモリ量に応じて変わると思うので、調べたり AI に食わせてみてね。

私の環境の場合、40GB 積んでいて、かつデータ伝送以外のメモリ消費量はそこまで激しくないので、32GB 前後は割り当てても良いと言われた。本当に正しいのかはわからん。

ちなみにこの値を初期値から 16GB に変更したところ、こんな感じのグラフになった。

相変わらず dirty throttling のようなものが起きて急激に速度が低下するタイミングがあるが、その後速度が復活するようになった。

あくまでも応急処置的なものであり、ストレージ伝送速度をあげて I/O ボトルネックを解消できれば最高だが、それが今できないので、とりあえず一時的に蓄える量を増やした、という感じ。

これ設定するだけでも平均伝送速度はかなり変わってくるので(測り損ねたけど、1.5~2倍近く早かった気がする)、人によっては設定する意味があるかも。

ただしメモリ積んで無いと OOM Killer とかが動く可能性があるので注意。スワップがどういう挙動するのかもわからんし。

実際に使ってみた感想

結局この記事を書くのにも一ヶ月とか時間かけちゃってて、普段から使っていての感想。

スピードぶっちゃけ要るか・・・?

本末転倒すぎる。

だけど、Proxmox の仮想マシンは全て HDD に入れているが I/O が遅すぎてキレそう!とか不具合起きた!とかなったことは無いし、動画データとか画像データは結局 SSD ではなく HDD の方に入れちゃったりしてる。

ここまでやっといて・・・

まとめ

NAS 用のハードウェア構成を考えて、組み立て、稼働してみた。

スピード重視で今回は作った。色々書いたが結局 NAS って「常に使えること(可用性)」「不正アクセスされないこと(機密性)」「データが破損しにくいこと(完全性)」が大事。あとUPSつけて、停電時にも安全に停止できるような耐障害性とか。

そっちの方が大事だと思うけど今回はロマンを追い求めて 10G NAS を作ってみた。

ちなみに、今 NVMe M.2 SSD を4枚刺せるミニPCサイズの NAS とかもあるらしいので、ぜひ使ってみてはいかが!?(

スピードはロマン。

p.s. バッファローの型落ち NAS とかだと 20MB/s もスピードが出なかったりする。そこまで遅いと流石にストレスが溜まるので、 150MB/s しか出ないとしても、恩恵はかなりあると思う。ただ、これ以上高速化させるのは複数人で使うとか特殊な用途でも無い限り意味ないんじゃ無いかなと思う。