SMR HDDとSSDは似た者同士？(2/2)

# はじめに
　[前回の記事](https://qiita.com/ken-yossy/items/8b662f15e032a7788157)で、SMR方式を採用したHDD (SMR HDD)の書き込み方式および性能特性について、以下のことを説明しました。

* SMR HDDはCMR方式のHDD (CMR HDD)と同じ性能特性（安定した性能）を得られないことがある
* SMR HDDでは、キャッシュ領域（CMR方式で読み書きする領域；CMR領域）が枯渇する（しそうになる）と、SMR方式で読み書きする領域（CMR領域）との間でRead Modify Writeが必要になり、性能が低下する
* 前記Read Modify Writeは、NANDフラッシュメモリを不揮発性記憶媒体とするSolid State Drive（以降単にSSDと記載します）におけるGarbage Collection (GC)と似ている
* このため、SMR HDDの書き込み性能特性はSSDのそれと似ていると推測される

　そこで今回の記事では、SMR HDDの実際の書き込み性能特性の説明およびSSDとの比較を行い、最後にCMR / SMR HDDとSSDの使い分けについてまとめます。

# まとめ
* SMR HDDの書き込み性能特性がSSDと似ていることを実験結果から確認
* 同じ使いかたであれば「コストを優先する場合は(SMR) HDD、それ以外の場合はSSD」という選択が無難
* SSDはオーバープロビジョニングを大きくすれば性能低下度合いを低減可能

# 再掲：SMR HDDとSSDの書き込み方式の類似点と相違点
　SMR HDDは、キャッシュ領域（CMR方式で読み書きする領域；CMR領域）が枯渇する（しそうになる）とSMR方式で読み書きする領域（SMR領域）との間でRead Modify Writeを行います。

　このRead Modify Write処理は、SMR領域からデータを読み出して、CMR領域のデータで上書きして、SMR領域に書き戻します。このため、処理中はホストからのコマンドに対するデータの読み書きができず、性能が落ちます。

![SMR HDDのRead Modify Write処理イメージ（再掲）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/4e92ae50-68eb-64db-5677-0ee3c10881a6.png "SMR HDDのRead Modify Write処理イメージ（再掲）")
図1：SMR HDDのRead Modify Write処理イメージ（再掲）

　SSDは、書き込み可能なNANDフラッシュメモリのブロックの数が減るとGCを行います。このGCでは、NANDフラッシュメモリからデータを読み出して、別のブロックに書きこんで、Erase可能にしたブロックをEraseします。GCのためにNANDフラッシュメモリからデータを読み出して書き込んでいる間はホストからのコマンドに対するデータの読み書きができず、やはり性能が落ちます。

![SSDにおける上書きの仕組み（再掲）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/0f43b4d5-1003-ba2e-7634-5b46745b4031.png "SSDにおける上書きの仕組み（再掲）")
図2：SSDにおける上書きの仕組み（再掲）

　このことから共通点は、**SMR HDDではCMR領域からSMR領域からへのRead Modify Write処理が必要な時に、SSDではGCが必要な時に、性能が落ちること**、です。

　一方で相違点は、**一般的にSSDのGCのほうがSMR HDDのRead Modify Writeと比較して効率が良いため、SSDのほうが性能の落ち具合が小さい**、ことです。

# SMR HDDとSSDの書き込み性能特性比較
　それでは具体的に性能評価結果を見ていきます。

## SMR HDDの書き込み性能特性
　SMR HDDの書き込み性能は[1]に詳細な調査結果が示されています。[1]に掲載されている性能測定結果のイメージを図にすると図3のようになります。

![SMR HDDのランダムライト性能測定結果イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/82f6a5c4-e4b3-8ec9-d039-2e3ceffed680.png "SMR HDDのランダムライト性能測定結果イメージ")
図3：SMR HDDのランダムライト性能測定結果イメージ（[1]より引用）

　128 KBのランダムライト実行時、CMR領域（＝[1]中のメディアキャッシュ）に空きがあるうちは15 MB/sほど出ていたのが、CMR領域とSMR領域の間でのRead Modify Writeが開始したと思われる辺りから最大で0.6 MB/s程度となるまで低下しています。

　ランダムライトの性能を数値で表現する際はバンド幅（MB/sなど）だけでなくIOPSで表現することも多いです。128 KB単位の書き込みで15 MB/sから0.6 MB/sへの低下ですと、117 IOPSから4.6 IOPSへの低下となります。およそ1/25 (4%)への低下です。

　[1]では、CMR領域のサイズが23 GB程度ではないかと推測しています。

## SSDの書き込み性能特性
　SSDについても、SATA SSDで同じく128 KB単位のランダムライト性能測定を測定しました。SSDの容量は500 GBです。

　測定に用いたソフトウェアは[1]と同様にTxBench<sup>[2]</sup>です。アクセスパターンの設定は図4の通り。これもできる限り[1]での評価時設定と合わせました。

![SATA SSDのランダムライト性能測定アクセスパターン設定(TxBench)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/a3bd803a-c50e-3ddd-0b2d-6d562f9a2676.png "SATA SSDのランダムライト性能測定アクセスパターン設定(TxBench)")
図4：SATA SSDのランダムライト性能測定アクセスパターン設定(TxBench)

　測定結果は図5のようになりました。

![SATA SSDのランダムライト性能測定結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/97481ba6-d6cc-7bed-02a5-9fb24c4a6b10.png "SATA SSDのランダムライト性能測定結果")
図5：SATA SSDのランダムライト性能測定結果

　性能が落ちるまでにかかる時間は異なりますが、SMR HDDの測定結果（図3）と同様に、ある時間が経つと性能が落ちています。

　具体的には380 MB/s程度から230 MB/s程度に落ちているようです。IOPSで表現すると2,968 IOPSから1,796 IOPSへの低下です。こちらはおよそ60%への低下です。

　なお、性能が落ち始めるまでに書き込んだ総書き込み量（サイズ）は約7 GBでした。

## 比較考察
　この2つの性能評価結果を比較します。

　図3と図5の評価結果からは、SMR HDDとSSDの書き込み方式から推測した「SMR HDDではCMR領域からSMR領域からへのRead Modify Write処理が必要な時に、SSDではGCが必要な時に、性能が落ちること」が実際に見て取れました。

　このことから、「**SMR HDDとSSDの書き込み性能特性が似ている**」という推測が正しいことがわかりました。

　また性能低下度合いについては、SMR HDDではRead Modify Write開始後は開始前の4%にまで低下しましたが、SSDではGC開始前の60%程度で済んでいます。

　このことから、「**SSDのほうがSMR HDDよりも性能低下度合いは小さい**」という推測も正しいことがわかりました。

　加えて、今回の実験からわかることは以下の通りです。

* SMR HDDとSSDは、書き込み性能特性は似ているが性能の絶対値の差はとても大きい
* SMR HDDのCMR領域（メディアキャッシュ）サイズとSSDのSLCキャッシュサイズ、正確には「SMR HDDでRead Modify Writeが始まる条件」と「SSDでGCが始まる条件」をSSDの外部（ホスト側）から知るおよび制御することは難しい

# CMR/SMR HDDとSSDをどう使い分けるべきか
　ここまででSMR HDDとSSDの書き込み性能特性の共通点と相違点をまとめました。

　これらを踏まえて、SSDとHDD特にSMR HDDをどのように使い分けるかを考えます。

## SMR HDDとSSDで高い書き込み性能を得る使いかた
　使い分けの話に入る前に、今回確認した書き込み性能特性から「SMR HDDとSSDで高い書き込み性能を得る使いかた」を考えます。

　なぜなら、**「書き込み性能特性が似ている」ということは、「高い書き込み性能を出す使いかたも似ている」ことを指す**からです。

　結論から言うと、以下の3点が、**「SMR HDDとSSDで高い書き込み性能を得る使いかた」**になります。

1. 使用容量を減らす
    * 【SMR HDD】メディアキャッシュの容量に収まるサイズしか使わない
    * 【SSD】SLCキャッシュの容量に収まるサイズしか使わない、もしくはオーバープロビジョニングを大きくする
1. 読み書きの間に時間を空ける
1. ランダムライトしない

### 使用容量を減らす
　「使用容量を減らす」という使いかたで高い書き込み性能を得る方法には2つあります。

　ひとつは「可能な限り内部処理を発生させない」方法で、もうひとつは「内部処理が発生した場合の性能低下度合いを小さくする」方法です。

　**「可能な限り内部処理を発生させない」方法は、「メディアキャッシュもしくはSLCキャッシュの容量分しか使わない」という方法です。**

　これは、図3や図5で示した通り、SMR HDDのメディアキャッシュやSSDのSLCキャッシュにデータを書き込んでいてRead Modify WriteやGC（以降「内部処理」と記載します）が発生していない状態ではそれぞれ書き込み性能が高いことからわかります。

　なお、**ここで言う容量（サイズ）とは総書き込み量ではなく使用するLBA領域の広さ（サイズ）であることに注意が必要**です。使用するLBA領域の広さを意図したサイズに制限するもしくは確実に減らすには、「容量クリッピング」が確実です。例えば、120 GBのSSDを40 GBにクリッピングする、などです。

　ただ、SMR HDDのメディアキャッシュやSSDのSLCキャッシュはそのサイズがわかりにくい上にドライブ容量と比べるとかなり小さいため、使用するLBA領域の広さをそのサイズに限定するような使いかたができるのはとても限定的です。

　もうひとつの**「内部処理が発生した場合の性能低下度合いを小さくする」は、SSDではオーバープロビジョニング(Over Provisioning)を大きくすることで実現できます。**SMR HDDでも似た概念がありそうですが、ここではSSDについてのみ説明します。

　SSDのオーバープロビジョニングを操作することは、GCの発生そのものを左右するというよりも、GCの効率を操作することを意味します。

　オーバープロビジョニングを大きくすると、GC実行時にコピーするデータサイズが小さくなり、その結果GCの効率が向上してGC発生時の性能低下度合いを小さくできます。

　SSDのオーバープロビジョニングを大きくするには、先ほど説明した「容量クリッピング」が最も簡単です。

　つまりSSDは、容量クリッピングによりGC発生時の性能低下度合いをとても柔軟に調整可能だということです。

　「オーバープロビジョニングをどの程度に設定するのが良いか」という具体的な値は、製品（SSDコントローラのファームウェア）や使いかたに依存しますので、万能な「適正値」はありません。

　ビジネス向けであれば、SSDメーカーに問い合わせた上で実ワークロードでの評価を経て最適値を決定するのが確実です。

### 読み書きの間に時間を空ける
　これは、図3や図5の性能評価結果から判明したこと、つまり「SMR HDDとSSDは内部処理が必要な時に性能が落ちる」理由が、ベンチマークソフトウェアにより連続的にデータ書き込みを続けた結果だからです。

　前回の記事でも説明した通り、内部処理の影響でSMR HDDとSSDのデータ読み書き性能が落ちるのは、それら内部処理によるメディアの読み書きがホストからのコマンドの処理を邪魔するためです。

　つまり、ホストからのコマンドと内部処理がバッティングしなければ、正確に言えば内部処理に十分な時間をドライブに与えられれば、ホストからのコマンド処理に対するデータ読み書き性能は落ちない、ということになります。

　それではどの程度の「空き時間」を作れば良いかということですが……これはSMR HDDとSSDでは異なりますし、さらには同じSMR HDD同士やSSD同士でも異なるので、やはり一概に「コレ」という値を示すことはできません。

　感覚的に言えば、人間のパソコン操作で発生するコマンド発行頻度程度であればSMR HDDでもSSDでも内部処理とホストからのコマンドの処理とがバッティングする確率は大きく低減し、仮にバッティングした場合でも性能低下度合いを少なくできます。

　そもそもRead Modify WriteやGCが発生しない（不要）で済むように使うのが、高い性能を安定して出すためには最も効果的です。

### ランダムライトしない
　シーケンシャルライトだけしていてもSMR HDDとSSDにおいて内部処理が不要になるとは限らないのですが、内部処理の効率がとても良くなるため内部処理にかかる時間が短くなります。

　このことから、ホストからのコマンド処理が内部処理に邪魔をされる確率が低くなり、たとえ内部処理が行われても性能低下度合いが小さくて済む可能性が高くなる、という結果が期待できます。

　これはSMR HDDの有効利用に特化したファイルシステムなどを使用することで実現できます。

## HDDとSSDのどちらを選ぶべきか
　最後に、この記事の目的である「HDDとSSDの使い分け」についてまとめます。

　今回一連の記事で説明したように、SMR HDDとSSDは書き込み性能の特性が似ています。したがって、**使いかた（ワークロード、アクセスパターン）が同じであれば、コスト以外の理由でSSDではなくSMR HDDを選択する理由はないと考えられます**。

　図3や図5に示した通り、性能の絶対値はSSDのほうがはるかに高いです（桁が違います）。使いかたを調整（工夫）してストレージに優しく使うにも限界がありますから、**ある程度の書き込み性能低下を許容して選択するのであればSSDを選択したほうが無難**、と考えられます。

　一方、**とにかく使いかたに依存しない安定した性能を求めるのであればCMR HDDが選択肢に挙がります**。ただし、前回の記事の冒頭で説明した通り今後CMR HDDは価格の低下が緩やかもしくは横ばい状態になる可能性があります。

　またランダムアクセス性能の絶対値はCMR HDDよりSSDのほうが高いですから、**「ある一定以上の性能が出ればよい」という基準であれば、SSDのほうがその基準を充足しやすいことは明らか**です。

　言葉で書くとわかりにいのでフローチャートにしました（図6）。

![ストレージ選択フローチャート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/7accea75-2b56-7ba2-2e67-ff9735eebfcf.png "ストレージ選択フローチャート")
図6：ストレージ選択フローチャート

　図3や図5で示したような性能低下を許容できるかどうか(Q1)が最初のチェック項目になります。

　許容できない場合、ワークロード調整(Q2)や容量クリッピング(Q4)などの性能低下対策を打つことが可能かどうか確認します。

　特にSSDの場合は、容量クリッピングつまりオーバープロビジョニングの拡大が、GCによる性能低下度合いの低減に大きな効果があるので、可能な限りこの性能低下対策を打つことが望ましいです。

　もし対策が打てない場合、SSDかCMR HDDが選択肢となりますが、Q1で性能低下は許容できないという選択をしているため、より性能（特にランダムアクセス性能）の高いSSDになることが多いはずです。

　一方、性能低下対策を打てる場合、HDDについてはSMR HDDが選択肢になり得ます。SMR HDDとSSDのどちらを選択するかは、コストと性能のどちらを重視するかが決め手になります。

　そもそも性能低下を許容できる場合は、コストと性能のどちらを重視するかでHDDかSSDかを決定できます。

# まとめ
　実験結果から、SMR HDDの書き込み性能特性がSSDと似ていることが確認できました。SMR HDDはSSDと比較してベースの性能が低いため、同じ使いかたであれば、「コストを優先する場合はSMR HDD、それ以外の場合はSSD」という選択が無難です。

　SSDは容量クリッピングによるオーバープロビジョニングの拡大でGCによる性能低下度合いの低減が可能ですので、性能低下対策を講じやすいという意味では使いやすいです。

　SMR HDDやSSDと比較してCMR HDDは常に安定した書き込み性能特性を示しますが、今後価格面でHDDのメリットが徐々に薄くなる可能性があります。

　今後ストレージを選択する際のお役に立てば幸いです。

# References
[1] PC Watch、「[ネットの論客にファイナルアンサー!? ～「もしかして……SMR!?」。最新2TBプラッタHDDをとことんイジメる](https://pc.watch.impress.co.jp/docs/news/1156085.html)」、2018年12月3日（2021年5月21日閲覧）

# ライセンス表記
<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>の下に提供されています。