SSDの仕組みをお勉強
SATAやAHCIについて調べていたら、SSDの仕組みが気になったのでちょっと調べてみる。
ソリッドステートドライブのデータ信頼性と寿命
5年も前の資料なのでSLC主体の内容ですが、知らなかった事が色々載っていたので覚書代わりにリンク。
ここから推測される事をつらつらと妄想しよう。
以下、SI接頭辞っぽいのは2進接頭辞と解釈してください。
(例.1kバイト=2^10=1024バイトと表記しますが、正確には2^10バイト=1キビバイト (KiB) というらしいです)
- ウチのOCZ AGILITY3の容量は120,034,123,776 bytes。セクタは論理/物理共に512byte/セクタらしい
- FlashROM単体の容量は64Gbit以上が主流っぽいので、この容量にする為には最低14個のFlashROMが必要
- 物理セクタ/物理アドレスが1:1ならFlashROMの1pageは512(+α)byteってことか?
- となると、page数の表現には25bit以上が必要。恐らくは32bitだろう
- 48bitLBAとpageの対応表は(LBA48bit+PageAddress32bit)×234,441,648page分≒2.2Gbyte
- Erase Count Tableも同様に(PageAddress32bit+Erase回数2バイト?)×234,441,648page分≒1.3Gbyte
- 14個分ではこの容量は取れないのでFlashROM64Gbit×15個は使っているはず
- となると、余る容量(5,063,828,736Byte 全体の4.2%くらい)がフリーブロック?
- MicronのFlashROMの資料だと1pageあたり(ユーザーデータ)8,192+(非ユーザーデータ)448byteのものがあった
- つまりこのFlashROMを使用したSSDだと8kbyte/セクタが最も効率が良いのか?
- それともこの程度ならDRAMbufferやNCQで吸収できるのか?
- SATAコントローラが物理セクタ4kバイトで返事をしてくるなら、論理セクタを8kにしても意味が無い(1pageで収まっていないかも)
- 非ユーザーデータは全部ECCで使ってる?
- それだと単純に考えるとBCH(4096,4096+13×17,2×17+1)符号×2つ分で1ブロックあたり34bit迄の誤り訂正が出来る計算(実際にはもう少し増やせるはず)
- セルがヘタってきたら「誤り発見!」→「修正書込み」→「隣のpage(もしくはbit)が1bit変わっちゃった!」てな連鎖が起きないか?
- 書込み量に対してウェアレベリングが加速するのはこれが原因だったり
- ウェアレべリングの仕組みは結構複雑っぽい
- この実装ならtrimコマンドで無意味なデータが無くせればかなり効果がありそうな印象を受けたけど、実際にはどうだろう?
- よくよく考えるとtrimコマンドでデータがなくなってもフリーブロックが増えるわけじゃないなら効果は程々なのかも
- もし全領域を動的にフリーブロック化できるなら相当効果があるかも(速度的にも寿命的にも)
- LBAと物理アドレスの対応表があるんだから実装は難しくない。動的フリーブロックってのは既にやってそうだ
- フリーブロックは2%程度しかないのか。最近のならばもっとある?
- スタティックウェアレベリングの実装の悪さ=プチフリの原因?
- 最近のSSDはどのくらいの頻度でやってるんだろう。Wear Range Deltaの値で判断?もう一ひねりしていそうだけど
- 1GBくらいのファイル書込みならダイナミックウェアレベリングで対応できるのか。そりゃシーケンシャルライトが早いわけだ
- この実装ならtrimコマンドで無意味なデータが無くせればかなり効果がありそうな印象を受けたけど、実際にはどうだろう?
上記はいろいろ間違っている模様。まぁ妄想だしな!