DRAMレスSSDと上手につきあう4つの方法

# はじめに
　DRAMを搭載しないSSD、俗に言う「DRAMレスSSD」が増えました。私たち一般消費者が店頭で購入できる製品では、概ね、高い性能を追求する製品はDRAMを搭載し、コストパフォーマンスを追求する製品はDRAMを搭載しない、のような棲み分けがなされています。

　またそのDRAMレスSSDでも、NVM Express (NVMe)が規定するHost Memory Buffer (HMB)という機能<sup>[1]</sup>を利用しホストシステムのDRAMの一部をSSD用に割り当ててもらうことで、DRAM非搭載によるデメリットを緩和している製品もあります<sup>[2]</sup>。

　SSDにおけるDRAM有無のメリットとデメリットを説明するWebページは既に多数存在しますので、ここでは「DRAMレスSSDを上手く使う方法」をまとめます。

　結論から言うと、「典型的なパーソナルユースのコンピュータ向けのストレージ」の使いかたであれば、たいていの場合、DRAMレスSSDを上手く活用できます。

# まとめ
　DRAMレスSSDをより良く使うには、以下のポイントを意識すると良い。
 
 * 大きいサイズで、もしくはシーケンシャルにアクセスする
 * 空き容量を多くする
 * 書き込みを少なくする
 * 暇な時間（アイドル時間）を作る

# その1：大きいサイズもしくはシーケンシャルにアクセスする
　SSDはDRAMの有無にかかわらず小さいサイズのランダムアクセスよりも大きいサイズのシーケンシャルアクセスのほうが得意であり、DRAMレスSSDは特にこの傾向が強くなります。これはSSDの内部処理に由来します。

　一般的なシステムでは、ホストはSSDに対して「どのデータを読み書きしたいのか」ということを先頭アドレス(Logical Block Address: LBA)とその先頭アドレスからのデータサイズ（セクタ数）で指定します。

　するとSSDは、ホストからコマンドを受信した際に「SSD（主にNANDフラッシュメモリ）のどこにどのLBAのデータが記録されているか」というテーブル、いわゆる「住所録」を参照します。この住所録のことはよく「マッピングテーブル」と呼ばれます。

　このマッピングテーブルは少なくともSSDの電源が切れている時はNANDフラッシュメモリに記録されていますので、SSDの起動時などにこのマッピングテーブル全体を読み出さない限り、ホストからコマンドを受信する度にNANDフラッシュメモリから必要なマッピングテーブルを読み出す時間がかかります。

　図1は、NVMe SSDにおける、DRAM有無によるマッピングテーブル参照処理の違いを示したイメージ図です。この図1はNVMe SSDの場合ですが、SATA SSDなどの場合でも(2-C)のパターンが存在しないだけで他の部分は同じです。

![DRAM有無によるコマンド処理時のマッピングテーブル参照処理の違い（NVMe SSDでのイメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/fdca8e2c-b03a-8cd9-08b8-5c4fc458c0fc.png "DRAM有無によるコマンド処理時のマッピングテーブル参照処理の違い（NVMe SSDでのイメージ）")
_図1：DRAM有無によるコマンド処理時のマッピングテーブル参照処理の違い（NVMe SSDでのイメージ）_

　サイズの大きいアクセスもしくはシーケンシャルアクセスであれば、読み出したマッピングテーブルを効率良く使用できます。住所録の1ページを1回に読み出し可能なマッピングテーブルに例えると、サイズの大きいアクセスもしくはシーケンシャルアクセスであれば、住所録1ページでそのアクセスの大半をカバーできる可能性が高いからです。

　逆に、サイズが小さいもしくはランダムアクセスの場合、何度も住所録のページをめくる必要があります。マッピングテーブルを置くためのDRAMを備えその容量が十分であれば「住所録のページをめくる」処理はDRAMアクセスのみで済みますが、そうでない場合、マッピングテーブルの読み出しが必要になります。その結果、アクセス性能が低下します。

　「SSDのどのLBAにどのデータを書き込むか」は、通常OS（ファイルシステム）が決定して管理します。このためユーザとしては読み書きするファイルのサイズをできるだけ大きくすることが望ましいことになります。
 
　これに対し、組み込み系システムなどでSSD内でのデータ記録位置をある程度自由に設計できる場合、SSDへのアクセスがシーケンシャルになるように設計すると、DRAMレスSSD使用時のアクセス性能の改善や安定につながります。

# その2：空き容量を多くする
　これはひとえにGarbage Collection (GC)の発生頻度を抑え、また処理時間を短縮するためです。

　GCは、「データを読み書きする」というストレージとして最低限の機能を維持するために必要不可欠な、NANDフラッシュメモリの使用効率を改善して空きブロックを作り出す処理です。

　しかし、GCは「NANDフラッシュメモリからデータを読み出してそのデータをNANDフラッシュメモリの別の場所に書き込む」という処理（コピー処理）です。この「コピーのために読み出したデータ」を一時的に置いておく場所が広ければ広いほどこのGCの処理効率は高くなります。

　高い性能を実現するにはこの置き場にRAM（SRAMやDRAM）を使うべきですが、DRAMレスSSDではその他のRAMをやりくりしてコピーするデータの読み出しと書き込みをしなければなりません。

　この不利な状況をできるだけ作らないために、「できるだけGCが発生しないようにする」こと、また影響を緩和するために「コピーするデータのサイズを少なくする」こと、の2つが有効であり、SSDの空き容量を多く保つことでこの2つを実現可能です。

# その3：書き込みを少なくする
　これは「そもそも書き込みが少なければGCの実行頻度も低いよね」という理由です。

　データを保存することが機能のひとつであるストレージの性格上、ホストからの書き込みがゼロになることはあり得ません。

　しかし、「一度書き込んだデータを何度も読み出すような使いかた」は存在します。例えば、写真や音楽そして映像などのメディアコンテンツデータを多数保存して何度も読み出して楽しむ、などの使いかたです。このような使いかたであれば、空き容量をきちんと確保しておけばGCの発生頻度を低く抑えることができます。

　PCに複数台のSSDを搭載する場合など、使いかたを基準にしてデータの保存先SSDを別々にすることが可能な場合、「記録したデータを書き換えることがあるか？（頻度が高いか？）」という視点で保存先を決めてかつ使用するSSDを選定すると効果的です。 
 
# その4：暇な時間（アイドル時間）を作る
　前述の通り、DRAMレスSSDを使う際はできるだけGCを実行しないことが理想ですが、データを蓄積しながら使い続けていく中でGCの実行をゼロにすることは困難です。

　「であればGCを実行する（GCに専念する）時間を作ればいいよね」というのがこの内容です。

　人間が操作する機器（PCなど）であればこのアイドル時間を作りやすいです。休憩のために席を外すだけでも十分な時間を作ることができる場合が多いです（離席中もPCは処理を継続していますが）。インダストリアル系機器では実稼働時のアクセスパターンを想定する（見積もる）ことが可能だと思いますので、そのアクセスパターンが十分なアイドル時間を持つかどうか確認すれば良いです。

　なお、アイドル時間を有効に活用するにはSSDが「アイドル時にGCを実行する」という機能を持つ必要もあります。しかしアイドル時にGCを実行すると、アイドル状態を脱した直後のコマンド処理に時間がかかる（レイテンシが長くなる）場合があります。また消費電力低減のためにアイドル時に積極的に動作を停止するSSDも存在します。
 
　前者の挙動が起きないようにするため、そして後者を確実に実現するために、「アイドル時のGC」という機能を持たない（無効にしている）SSDも存在しますので注意が必要です。

# さいごに
　今回の記事では、「DRAMレスSSDを上手く使う方法」を4点説明しました。

　SSDは使いかたに応じて性能や寿命が変わるデバイスですので、DRAMレスSSDの活用には「DRAMレスSSDが適した使いかた」を理解して自分の使いかたがこれに当てはまるかどうかで判断する必要があります。

　家庭やオフィスで使用する典型的なパソコン向けのストレージであれば、たいていの場合DRAMレスSSDを活用可能です。逆にそれとは異なる使いかた、例えば24時間365日稼働する機器や過酷な環境で動作する機器、さらには特殊な要件を持つ機器向けのストレージの場合は、DRAMレスSSDの特徴を良く理解して選定する必要があります。

# References
[1] キオクシア、_「[HMB(Host Memory Buffer)技術開発とDRAMレスSSDの実現](https://www.kioxia.com/ja-jp/rd/technology/topics/topics-14.html)」_、2018年8月28日
[2] Fixstars Tech Blog /proc/cpuinfo、_「[NVMe HMB機能を使ってみた](https://proc-cpuinfo.fixstars.com/2018/06/nvme-hmb/)」_、2018年6月28日

# ライセンス表記
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この記事は<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。