5400rpm

人生シングルスレッド

Crucial MX300 1050GB検証

概要

コンシューマ向けのSSDとして容量とスペック、価格のバランスの良いCrucil MX300 1050GB(CT1050MX300SSD1)の検証です。

検証目的

過去M500の頃から乗り継ぎで利用していましたがMX200からの変更としてNANDがMLCからTLCになりました。
速度面での変化や、一部で噂されていた大きいファイルの取り扱いが苦手などの実際のところを調査します。
またfioを用いて大量のwriteを実行し書き込み寿命の減り方を計測する

まとめ

長いので先にまとめを。詳細は続きを読んでください

  1. ディスクのIO性能上限の書き込みを続けると100日程度で寿命となる
  2. ディスクキャッシュに乗る範囲であれば十二分に高速
  3. trimタイミングなどは検証では追い切れず予想の範囲にとどまる
  4. 利用環境での想定IOによってはSSD選定時の良い選択肢となる

写真

外箱

f:id:uyT4vEne:20161228214950p:plain

中身と基盤表

f:id:uyT4vEne:20161228215607j:plain

基盤裏

f:id:uyT4vEne:20161228215834p:plain

ラベル情報

f:id:uyT4vEne:20161228220040p:plain

物理的なポイント

NAND実装が8枚なのではじめは何も考えず128GiB * 8枚 = 1024GiBで1024GiB = 1099GBで ≈ 1050GBかと思ったがNANDが6枚+2枚の二種混合なので不明

全体的に効率化 & 低コスト化が進んでおり遂にSSD本体はスクリューレス
爪で固定されているだけなので精密用途のマイナスドライバーで浮かせれば開腹できます
筐体はアルミで、コントローラのチップセットが熱伝導用のグリスで筐体に触れるようになっており、ケースがそのままヒートシンクの役割を果たしています
写真2枚目のケースに付いてる正方形の灰色の四角い物体が熱伝導用シートです

基盤の固定もケースの突起に引っかけるのみで内部的にもネジの使用は無し

NANDの表面記載の型番で検索したところこちらの情報が出てきました

www.nordichardware.se

ベンチマークにおいてとても参考になりました。感謝。

検証環境

Supermicro製1Uサーバに装着
OSはCentOS7.2をこのデバイスにインストールした上で各種検証を実施
ファイルシステムはOSデフォルトのもの(xfs)を利用

SMART情報

$ sudo /usr/sbin/smartctl -iA /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     Crucial_CT1050MX300SSD1
Serial Number:    [           ]
LU WWN Device Id: 5 00a075 113462c92
Firmware Version: M0CR021
User Capacity:    1,050,214,588,416 bytes [1.05 TB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-3 (unknown minor revision code: 0x006d)
SATA Version is:  SATA >3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Thu Sep 29 10:43:26 2016 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   100   000    Pre-fail  Always       -       0
  5 Reallocated_Sector_Ct   0x0032   100   100   010    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       19
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
173 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   000    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   070   067   000    Old_age   Always       -       30 (Min/Max 27/33)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   100   100   000    Old_age   Always       -       0
202 Unknown_SSD_Attribute   0x0030   100   100   001    Old_age   Offline      -       0
206 Unknown_SSD_Attribute   0x000e   100   100   000    Old_age   Always       -       0
246 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       3941471
247 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       126377
248 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       226832
180 Unused_Rsvd_Blk_Cnt_Tot 0x0033   000   000   000    Pre-fail  Always       -       4377
210 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
hdparm
$ sudo hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   33962 MB in  2.00 seconds = 17010.54 MB/sec
 Timing buffered disk reads: 1440 MB in  3.00 seconds = 479.83 MB/sec

書き込みによる消耗計測

`/var/tmp/fio/07_fio_mx300` という設定ファイルを作成

[global]
ioengine=libaio
numjobs=16
iodepth=6
group_reporting
direct=1
bs=4k
size=16g
overwrite=1
loops=100

[RandWrite]
rw=randwrite

実行用のシェルスクリプトを設置しループで実行する

#!/bin/sh

testnumber=0

while :
do
  echo $testnumber
  cd /var/tmp/fio/
  mkdir -p /var/tmp/fio/${testnumber}/
  cd /var/tmp/fio/${testnumber}/
  /usr/bin/fio /var/tmp/fio/07_fio_mx300 | tee -a /var/tmp/fio/LOG.${testnumber}
  cd /var/tmp/fio/
  rm -rf /var/tmp/fio/${testnumber}/
  testnumber=`expr $testnumber + 1`
  sleep 1
done

72時間後のSMART状況

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   100   000    Pre-fail  Always       -       0
  5 Reallocated_Sector_Ct   0x0032   100   100   010    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       116
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
173 Unknown_Attribute       0x0032   097   097   000    Old_age   Always       -       49
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   000    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   053   052   000    Old_age   Always       -       47 (Min/Max 27/48)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   100   100   000    Old_age   Always       -       0
202 Unknown_SSD_Attribute   0x0030   097   097   001    Old_age   Offline      -       3
206 Unknown_SSD_Attribute   0x000e   100   100   000    Old_age   Always       -       0
246 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       32351612002
247 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1010996703
248 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       2539844662
180 Unused_Rsvd_Blk_Cnt_Tot 0x0033   000   000   000    Pre-fail  Always       -       4377
210 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0

Crucialのドキュメントを読む限り 202 が Percent lifetime remaining で寿命となる
上記のベンチマーク設定で休みなく実施した場合は3日で3%≒1日1%で100日程度しか持たないと予測される

初回ベンチマーク

前述の消耗計測後にベンチマーク計測をした

bandwidth iops
Seq-read 330184KB/s 82545
Seq-write 120861KB/s 30215
Rand-read 81716KB/s 20429
Rand-write 37995KB/s 9498

Crucialサイトによるカタログスペックはこちら

f:id:uyT4vEne:20161228223258p:plain

現状のステータスではカタログスペックに遠く及ばず

SSDのディスクキャッシュを有効にしたベンチマーク

TLC製品のアレコレを眺めると、多くの高速なTLC SSDについては
writeが弱いという特性を回避するためにキャッシュを有効活用している旨の記事を多く見る

前のコメントのテストはキャッシュをOFFにしてベンチマークしている
conf中の direct を1から0にしてキャッシュ込みでの性能を見てみる

$ grep direct= *
01_fio_Seq_Read:direct=0
02_fio_Seq_Write:direct=0
03_fio_Random_Read:direct=0
04_fio_Random_Write:direct=0

まだカタログスペックに劣るものの大きく改善
特にRand-WriteではSeqを超える値となった

bandwidth iops
Seq-read 516026KB/s 129006
Seq-write 444327KB/s 111081
Rand-read 140969KB/s 35242
Rand-write 679034KB/s 169758

キャッシュサイズ以上のファイルサイズでのベンチマーク計測

同時にキャッシュ搭載系のSSDの記事で多いのは
キャッシュサイズを上回るサイズのファイルを操作すると極端に速度が低下するという内容

そのため、10GBのファイルでベンチマークを実施する
またファイルサイズが多いとベンチマークに時間がかかるため、プロセス数を減らした

bandwidth iops
Seq-read 389904KB/s 97476
Seq-write 192363KB/s 48090
Rand-read 35426KB/s 8856
Rand-write 156984KB/s 39245

引き続きキャッシュは有効のままだが値としては無効状態に近いスコアになった
無効状態より良いのはキャッシュが効いていたタイミングで下駄を履けたからか

今回実際に実運する環境では複数本でのRAID0更生での運用を検討しているため、
書き込み先が分散され大きなIOは単発よりは発生しづらいとは思われるが要検証

小さいファイルでのキャッシュ挙動

20MB x 32プロセスで実施
キャッシュは公式では未公開ながら先に貼った記事るのであれば1GB
今回は20MB * 32で640MBと完全にキャッシュに乗り切る状態でのテストとなる

bandwidth iops
Seq-read 517970KB/s 129492
Seq-write 3150.9MB/s 806623
Rand-read 286787KB/s 71696
Rand-write 2600.8MB/s 665788

結果は一目瞭然でWrite系がかなり速い値となっている
Read系はほぼカタログスペックの値のため
キャッシュはほとんど書き込みに利用され、読み込みにはあまり使われないものと思われる

キャッシュの乗り方の調査


キャッシュの乗り方

「1GBのキャッシュ以上のファイルサイズだとどんな操作でも即性能低下」
だと困るので、2.5GBのファイルを一度作成してベンチ。その後 overwrite オプションを無効化して試す

$ perl -i -p -e 's/overwrite=1/overwrite=0/g' *
$ perl -i -p -e 's/size=20m/size=2500m/g' *
$ perl -i -p -e 's/numjobs=32/numjobs=2/g' *

1回目、ファイルの作成があるので全容量キャッシュに乗って速度は出ないと予想

bandwidth iops
Seq-read 491396KB/s 122849
Seq-write 410012KB/s 102503
Rand-read 35695KB/s 8923
Rand-write 985587KB/s 246396

結果、現時点でもキャッシュに全部乗った場合よりは劣るもののまだ高速なラインを維持できてる。
そして二回目、いつもはテストのたびにファイルを削除しているが今回は作成済みのものを再利用

bandwidth iops
Seq-read 426506KB/s 106626
Seq-write 470164KB/s 117540
Rand-read 25690KB/s 6422
Rand-write 495975KB/s 123993

結果は同じWriteでもRandは低下、Seqは改善。
Seqだと連続領域だから作成済みのファイルへの更新はキャッシュに乗り切って、Randだと領域をまたいだ時に1GBを超えたタイミングで低下とか?
スコア自体もキャッシュ絡みだとガッと変動するので読み切れず
ただ完全にキャッシュで収まっていた時よりは遅いため、部分更新などであっても1GBのキャッシュに乗りきらない場合は速度低下することがわかった

trimの実行タイミング

寿命を削るためのループも周回によって時間のかかり方がだいぶ違うことに気づいた
5周目(LOG.4)だけまだ途中だけれども。

$ ls -ltr LOG.*
-rw-r--r-- 1 root root 2734 104 09:48 LOG.0
-rw-r--r-- 1 root root 2826 104 21:09 LOG.1
-rw-r--r-- 1 root root 2747 105 01:04 LOG.2
-rw-r--r-- 1 root root 2749 105 09:05 LOG.3
-rw-r--r-- 1 root root  117 105 09:05 LOG.4

夜中はは速く朝は遅いように見える
他に何かやってるサーバではないので日中でも負荷は変わらないはず

$ ls -ltr LOG.*  --time-style='+%s' | awk '{print $6}'
1475542092
1475582995
1475597046
1475625940

f:id:uyT4vEne:20161228230019p:plain

結構大きな時間差になったけれど、これが書き込み領域のtrim走ったタイミングによるものなのだろうか
SSDの容量が1050GBに対してテストファイルの総量が512GBなので、2回目のテスト中にtrimが走るのと、3回目のテスト中はtrim対象にならないというのなら2回目が遅くて3回目が早いのには一応筋が通ってる

5周目が終わって6周目用のファイルを作ってるタイミングでtrimの明示実施
timeを付けるのを忘れていたが約10分かかった

$ fstrim -v /
/: 781.6 GiB (839196921856 bytes) trimmed

trim完走後に打ったdfの数値がこんな感じ。
データが乗ってない場所ほぼ全体にtrimがかかったとみて良さそう

$ df /
ファイルシス   1K-ブロック      使用    使用可 使用% マウント位置
/dev/sda3       1021953492 370227400 651726092   37% /

先ほどのfioのスコア比較で4,5周目が近似なスコアだったのは、上書きするタイミングで上書きするファイルだけtrimされたからではという予想もできる

SMARTのID 173、ブロックの平均消去回数について

MicronのSMARTのA値は ID:173が Average block erase count
寿命を削るループ中、合わせてこの値を観測していた
cronで5分毎にSMARTを実行しuniqカウントをとる。 左の値 x 5分がカウントアップに要した時間

$ cat watch_ID173  | uniq -c
     16 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       68
     15 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       69
     14 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       70
     15 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       71
     15 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       72
     14 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       73
     21 173 Unknown_Attribute       0x0032   096   096   000    Old_age   Always       -       74
     19 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       75
     19 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       76
     19 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       77
     15 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       78
     19 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       79
     20 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       80
     19 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       81
     19 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       82
     16 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       83
     13 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       84
     15 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       85
     13 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       86
     16 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       87
     16 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       88
     14 173 Unknown_Attribute       0x0032   095   095   000    Old_age   Always       -       89
     16 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       90
     20 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       91
     19 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       92
     18 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       93
     15 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       94
     17 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       95
     21 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       96
     19 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       97
     18 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       98
     19 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       99
     14 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       100
     20 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       101
     21 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       102
     18 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       103
     19 173 Unknown_Attribute       0x0032   094   094   000    Old_age   Always       -       104
     16 173 Unknown_Attribute       0x0032   093   093   000    Old_age   Always       -       105
     17 173 Unknown_Attribute       0x0032   093   093   000    Old_age   Always       -       106
     21 173 Unknown_Attribute       0x0032   093   093   000    Old_age   Always       -       107
     19 173 Unknown_Attribute       0x0032   093   093   000    Old_age   Always       -       108
     19 173 Unknown_Attribute       0x0032   093   093   000    Old_age   Always       -       109
      2 173 Unknown_Attribute       0x0032   093   093   000    Old_age   Always       -       110

急に極端に短くなったなどはなく、15(75分)~20(100分)の範囲でそれなりに安定している