Linux上でのストレージ構成に関する考察 2021 秋

2021-09-23

基本部分

ここのところ、PCIe 3.0 SSDとSATA3 SSD RAID0という構成で色々と試していたが、ある程度見えてきたことがある。

そもそもなんでLinuxで特別な考察がいるかというと、次のような特徴を活かすためである。

  • Windowsと違って複数ディスクを複合して使うのが容易で、分散して使うのにも苦がない
  • Linuxシステム自体はIO waitがかなり少なく、IO量自体も少ない (ほぼキャッシュアクセス)
  • 任意のデバイスでソフトウェアRAIDを組むのが簡単

Windowsの場合、ほぼ「できるだけ速いディスクを、できるだけ大きく」以外の選択肢がない。 ディスクの分散はjunctionやsymlinkを使ってもあまり機能しないし、そもそもかなりやりづらい。

対して複数ディスクを使えるからこそ、Linuxの場合は非常に高いエクスペリエンスを生み出すのに利用できる。 (利用できる、という意味ではオーソドックスなUnixシステムならだいたいできる。)

だが、それをいかにして実現するか、だ。

Windowsではあまり起こりにくいが、Linuxはシーケンシャルライトが大きいと、その書き込みはかなり優先的に処理される。 この関係でリードの要求が通りにくくなる。結果的に、大きなシーケンシャルライトが発生しているディスクがキャッシュで読み書きされるといったことがあると、そうしようとしているアプリが止まる。

なので、重要なのは「キャッシュを分ける」だ。

また、Linuxはメモリを使える限りバッファに費やすため、バッファに回せる大きさより小さいwriteに関してはディスクの書き込み速度はほとんど気にしなくて良い。 だから、メモリを積むことで解決するという方法もある程度ある。

SATA SSD RAID

実は最近、SATA SSDの扱いは難しくなってきている。

TLCやQLCで大容量化したは良いが、大きなデータの書き込みでHDDより遅い、という問題が発生しているためだ。 なお、この関係で8ディスクRAID5のようなHDD群は大きなデータの書き込みでもかなり速い傾向があり、必ずしもHDDが遅いとは言い切れないようになってきている。 ランダムアクセスはSSDのほうが速いが、大きなシーケンシャルライトはちょっと話が違う。

RAID0で運用してきたが、結論としては「RAID0にしてもシーケンシャルライトで十分速いとは言えない」である。 現在RAIDを構成しているのはADATA SU630とKIOXIA EXCERIA Sだが、RAID0の問題として、「一番遅いディスクに引っ張られる」というのがあり、SU630が特に遅いため、このRAIDで十分な速さを持つことができていない。

ただし、書き込み量が分散されることで遅くなるまでかける量は増える。増えるが、しかし遅い。

つまり、この考え方は前提として「なんのSATA SSDを選択するか」が要求される話だと思う。

In other words, もしもデータキャッシュとしてPCIe SSDが用意できるのであれば、SATA SSDをそのように使うメリットはない。 また、空きのSSDを使うのであれば、シーケンシャルでの速さは考えるべきではない。

データキャッシュとして使う場合、つまりデータはNASなどに保管されるが、NASをシャットダウンした状態でもよく使うメディアデータにアクセスしたいといった使い方の場合だが、基本的にデータをセットアップするときはシーケンシャルライトだから時間がかかる。 この時間がかかるを許容できるかどうかがポイントで、このとき同ディスクへのリードはできないと考えたほうが良いから、使い方について考える必要がある。

現状、このデータキャッシュにキャッシュディレクトリを置いているが、これは失敗であった。素直にルートファイルシステムのPCIe SSDに置いたほうが速い。

現在私が把握している、シーケンシャルライトの落ち込みが少ない2.5インチSSDは

  • Crucial MX500
  • Western Digital WD Blue 3D
  • SanDisk SSD Ultra 3D

である。

TLC SSDにおいて、Crystal Diskの結果は全く参考にならない。 今私はSU630をどうしたものか、とても悩んでいる。

PCIe SSD (ルートファイルシステム)

キャッシュを分ける前提である場合、Linuxにおけるルートファイルシステムの速度というのは、だいたいルートファイルシステム配下のユーザーデータ読み書きの速度の問題だと考えて良い。 ただし、GNOMEでtrackerを使う場合や、KDEでBalooを使う場合に関しては、非常に多くのファイルに対して頻繁にアクセスすることになるから話が違う。使い方によっても変わってくるだろう。 (もっとも、大きなディスクを検討する上でtrackerやBalooはinotifyを食いつぶすから、これらを止めるほうが話が早いと思う)

しかし、ベストなパフォーマンスを求めるなら、やはりできるだけ速いディスクが良い。 このディスクに対して大きなデータのシーケンシャルライトを想定しないなら、Crystal Diskの結果もある程度参考になるだろう。

もしも、PCIe 3.0とPCIe 4.0のディスクを用意するのであれば、ルートファイルシステム側をPCIe 3.0にしたほうが良さそうだ。 エクスペリエンスへの影響としては、キャッシュができるだけ干渉せず速いほうが速い。

今注目を集めているディスクはCrucial P5 Plusで、次いでWD Black SN850、Samsung 980Proとなるようだ。

ルートファイルシステムの容量だが、基本的には250GBで足りると思う。 しかし、容量が大きいほうが速いものになっているため、結局1TBくらいを用意することになるだろうか。

現在、私は会社の仕事で使うデータをデスクトップで持つようにした関係でデータ容量が圧迫され、Force MP510B(960GB)に変更した。 この変更はP5(250GB)よりも速度が上がっている。

キャッシュディスク

ここでいうキャッシュは、データストレージという意味ではなく、まんま/var/cache~/.cacheをどこに置くかという話である。

基本、キャッシュへの書き込みのせいでシステムがフリーズする可能性があるからルートファイルシステムとは分けたいのだが、キャッシュがブロックされても結局アプリはフリーズするので、データキャッシュに置いても問題は変わらない。悪化してしまう。

ルートファイルシステムが高速なPCIeディスクであるならば、大きなデータ書き込みの少ないルートファイルシステムと共存させたほうが速い。 つまりこの場合、特にキャッシュディレクトリをどこかに分けたりはしない、という話だ。

もし2台のディスクに分けられるのであれば、より高速なSSDを割り当てたい。

もしも2つのM.2スロットがLinuxとWindowsによって使われるのであれば、Windowsから500GB程度の領域をもらってcacheに使うという方法もある。 これは、NTFS上に置くという意味ではなく、パーティションを切るという話だ。

ただ、私が使っている限りだとそこそこゲームを入れてしまうと2TBでも余裕は全くないので、500GBの領域を捻出するのは、結構難しい。

だが、これも考えようかもしれない。 私の場合は原神やProject Carsなど、Steamを含む大型タイトルも入ってはいるが、それ以上にエロゲーが容量を圧迫している。 だが、エロゲーは割と素直なつくりであることが多く、単にファイルがあれば許されるケースが多い。 アドベンチャーゲーム形態のものであればSSDの速度にそこまでシビアということもないので、ロードが長いと感じるゲームでなければ別にSATA SSDに置いても良いように思う。

具体的には、CM3D2やCOM3D2など、KISSのゲームは総じてロードが長いのでPCIeのほうが良いだろうけど、私が好んでいるHOOKSOFT/SMEEのゲームなどは別にSATAディスク上に置いても支障はない。動作的にもどこにでも置けるようになっているため、SATAディスクに置くことで困ったりはしない。

また、Radeon ReLiveの場合、4k 60FPSでも30Mbps程度であるため、SATAディスクに書いても支障はなく、%HOMEPATH%\VideoをSATAディスクへのシンボリックリンクにする手も悪くない。

私の場合はこうした方法により500GBを捻出することは不可能ではなさそうだが、Steamでよく買い物をする人であれば2TBでは到底足りないだろう。 また、DTMでも2TBというのは結構苦しいラインだ。Windowserは一体どうやってやりくりしているのか不思議だ。

結局、「別のPCIeディスクが割り当てられるのであればそれが良いが、できないのであればおとなしく速いNVMeディスクのルートファイルシステムに乗せておけば良い」ということになりそう。

PCIeを3枚載せたい

結論、こういうことになる。

だが、これは現実的に難しい要素があって、Ryzen 5000シリーズのPCIeレーン数は24。 16レーンがGPU、4レーンがPCIe、そして4レーンがチップセットリンクである。

チップセット側にM.2スロットがひとつあるとすると、そんなに足を引っ張る要素はないのだが、それより多くのM.2スロットを使うとチップセットとCPUの間は4レーンしかないためパフォーマンスはどうしても落ちる。

そのため、「2つのPCIeディスク、ほかはSATA」というのが現実的なチョイスとなり、LinuxとWindowsでやっていこうとする場合はスロットが足りない。 そこで前述の「なんとかしてWindowsのディスクから容量を融通してもらう」という話となり、どうしてもそれができないならシンプルにNVMeをルートファイルシステムにして、データキャッシュにSATA SSDを用意するというところに落ち着く。

Windowsを窓から投げ捨てるのがベストなのだけど。最近、色々ゲームを始めてしまったので、余計投げ捨てられなくなってしまった。