Chienomi

PNY CS2241とMonster Storage MS950 (YMTC232層) PCIe NVMe SSD

製品・サービス::hardware

まず、メインシステムのシステムストレージから。

PCIe NVMeは960GBのLinuxシステムと、2TBのWindowsシステムのディスクで構成されている。

LinuxシステムはWindowsディスクから200GBほどを取っており、また内蔵ディスクでSATA 2TBを2台でのRAID0がある。 USBエンクロージャを含めると通常で9TB、フル装備だと13TBほどになり、十分なディスク容量がある。

対して、WindowsはDTM用のシステムで、1.8TBが1つあるだけなのでディスクはカツカツである。

そこへ、Radeon RX7900XTXを導入し、ゲームもできるようにして、メインシステムをより積極的に使おうという方向性になったが、ゲームだとゲーム本体とRadeon ReLiveでの録画データを収納するディスクスペースが必要で、Windowsシステムにその余裕がない。

そこで、3月に「ゲーム用のWindowsディスク」としてPNYのCS2241を購入した。 1TBで8000円ほどと当時としてはかなり安かった。 NTT-Xでセールされている安いSSDがどんなものか知りたかったのもあるし、SATA SSDは確証のあるもの以外は容量全域書けないレベルで使い物にならないのが当たり前になっているが、仮にもハイエンドのPCIe NVMe SSDであれば最悪エンクロージャでデータ置き程度には使えると踏んだ。

PNY CS2241

コスパの良いSSDとして有名なPNYだが、日本ではあまり見かけない。

とりあえずS.M.A.R.T.によるshort testを実行し、問題なし。 Windowsで使うため、全域書き込みのテストは行わなかった。

Windows上でNTFSにフォーマットし、ゲームを従来のシステムドライブであるSX8200から移動する。 データは原神と崩壊スターレイル、そしてSteamで合わせて120GBほどであった。

ところが、この120GBの移動でもう、転送が止まる、30MB/s程度まで落ち込む。 嫌な予感しかしない。

なんとか移動はできたものの、そこからゲームを起動すると相当かくつく。

安定してreadできず、かなりの頻度でストールしている印象だ。

あまりにひどいため、Monster Storageのディスクに入れ替えたが、その後データ置きにするためBtrfsで組み直しデータを転送したところ、300GBほどのwriteでストール、一切書き込めなくなった。

その後、時間をおけば数十GBほどは書き込めるのだが、書き込み速度は30MB/s程度。 その間も頻繁にストールするため、実時間における書き込み速度は1MB/s程度である。

さらに、ストールを一度発生させるとreadができない。 シャットダウンすればまたreadできるようになるが、デバイスがbusyになるためシャットダウンさせるのはかなり難しい。

ディスクのライフとしても総書き込み量は600GBに満たず、デバイスの全容量である1TBに到達することなく事実上書き込み不能になっている。

これはSSDにおいてよくある、悪質なパターンである。 ディスクの状態は健康であり、エラーもない。 そして、時間をおけば一瞬普通に読み書きができるように見える。 だから不良ではないのだ。 ただ、ディスクの全容量に対してまともに書き込むこともできず、しょっちゅう停止し、実書き込み速度が1MB/s程度しかない粗悪なゴミであるというだけだ。

救いがない。 なにせデータをまともに書き込むことができず、書こうとしたときに書き込みが完了できない可能性がある。 つまり、書き込みによってデータを失う可能性があるわけだが、書き込み速度が遅いのでアーカイブのキャッシュにもならない。 そして、読み込みが安定せずしょっちゅう止まるから、仮に書き込めたとしてもデータ置きに使うとストレスがものすごい。

つまり、私は8000円を払ってゴミを買ったわけで、私から言えるのはPNYの製品は絶対に買うなということだけである。

以下は追加で行ったテストで、ブロックデバイスレベルでの書き込みテスト。 後述するsanity check用のスクリプトを使って行っており、計測条件としては一般的なベンチマークソフトウェアによるものに近い。 (ただし、urandomを用いているため、最大速度は600MB/s程度になる)

書き込み速度グラフ

出だしは50MB/s程度だが、その後は30MB/s程度で非常に安定している。 30MB/sというと、動画キャプチャも困難なレベルであり、ほとんど使いみちはない。 デバイスレベルシーケンシャルでこの速度はかなり絶望的。 ただ、ストールはしていない感じだ。

読み出しグラフ

読み出しは550〜600MB/sの範囲で安定しており、これだとデータを置いてしまえば普通に使えそうに見える。 書き込みのあとは4時間程度時間を置いてテストを行った。

Monster Storage MS950

Monster Storage MS950は中国YMTCの232層NANDを搭載したSSDとして話題になった。 なにせ2TBで12980円という驚異の価格である。

これはもともとApple製品のために作られたNANDであり、アメリカの禁輸措置によって生産していたものがあまり、在庫処分のために格安で様々なメーカーに払い出した、というのがもっぱらの噂。 チップは非選別品であると思われるが、Apple製品に搭載するために作ったものであれば良いチップの性能は期待できるだろう。

YMTCのチップは必ずしも評判がいいわけではないが、急速に発展、中国の公金投入もあり、トップクラスで勝負できる製品を出してくるようになったと言われている。

MS950は、最近はハイエンドのPCIeストレージでもブリスターパックが増えている中、箱の中にトレーがあり、さらにプラスチックの上蓋もあるという豪華パッケージ仕様。 そしてMonster Storageのラベルが貼られてパックに埋め込まれている……のだが、ラベルは両面に貼られており、製品ラベルが貼られている、つまり表になっていたほうは裏、という罠であった。

パッケージはかなりしっかりした日本語パッケージで、ちゃんとした日本の代理店が作ったかのよう。 英語版パッケージでは1TB=1,000,000,000,000Bytesだという説明があるようだが、実際は2048GBある製品だった。 このちょっと容量が多いディスクはSSDでは珍しいのだが、容量が多くて嬉しい反面、クローニングには苦労する。

当初、データがうまく書き込めず、非常に苦労したが、これはつまり「データを移動する元がPNYのディスクなので、読み出しが死んでいた」という問題だった。 PNYのディスク上にあるデータは、別にインストールすればいいだけの内容であったため、最終的には破棄して入れ直した。

今回は1TBから2TBになった関係で、前半分をWindowsのゲーム用、後ろ半分をLinux用に割り当てた。 Linux用ではLUKS+Ext4で構成したが、試しに200GBほどデータコピーしてみたところ、速度は安定して920MB/sを越えた。

SSDのベンチマークに慣れている人には大したことないように感じられるかもしれないが、実際のファイルシステム上でのデータ書き込みにおいて900MB/sを超えるというのは驚異的であり、私が持っている高速ストレージ、つまりCorsair MP510B, ADATA SX8200, Samsung 960Evo, Crucial P5のいずれでも到達していない値である。

また、900MB/sが最速値というわけではない。 当たり前の話だが、データを書き込もうとすると書き込むためのデータが必要である。 小さなデータならばメモリから出せば単純にストレージ性能を図ることができるが、大きなデータの書き込みを試そうとするならば、どこかしらからそのデータを持ってくる必要がある。

それがディスクtoディスクであれば、読み出し側ディスクの速度を上回ることができない。 今回の場合、SATA SSDのRAID0で、1GB/sはディスクの実性能の限界と言って良い。 このことから、このストレージの性能は「少なくとも1GB/s以上のシーケンシャルライトが可能」ということになる。

速度としては無限ではないが、urandomから直接書き込むようにするとCPUの性能次第ではストレージのシーケンシャルライトの性能を測ることができる。 ただし、urandomでディスクに直接書くのは、実運用では登場しない非現実的な値が出てしまうのであまり意味がない。

また、urandomの速度はddを使ってRyzen5 5600Xで630MB/sくらい。 なので、PCIeディスクの性能を実運用を想定して測れるような方法というと、超高速なPCIeディスクのストライプにシーケンシャルで書いたデータくらいしかなく、それ以外でより高速な0埋めや同一データのループコピーは実運用からはかけ離れた速度が記録される。

SSDのベンチマークを信奉することが馬鹿げている理由の一端が見えるかと思う。

後述のddテストにより500GB files writeを試したが、480〜540MB/s程度で、かなり安定して高速な書き込みが可能であった。

YMTC232層 500GB File write (btrfs)

今の有名ハイエンドモデルがどの程度かは分からないが、かなり優秀なストレージであるようだ。 あまりに良いので追加購入を検討中。

全域テストの必要性

今回の2台ではやらなかったが、もしディスクの性能をチェックしようと考えるならば、全域ライトチェックは必須である。

というのも、ベンチマークでやればどんな腐ったストレージでも公称値に近い値は出るものであり、「公称値よりちょっと低い」なんて実用性のない話題をしても意味がないのだ。

それよりも、「大きなシーケンシャルライトで止まってしまう」「ディスク全域そもそも書き込めない」みたいなSSDがいっぱいあるので、ベンチマークテストをするくらいならば最低限全域書き込みテストをしたほうが良い。

HD Tune Proで測定したデータを載せているようなサイトもあったりするが、有料ベンチマークなのでやっている人はごく一部なようだ。 だが、全域に対してランダムな書き込みを行うこと自体は難しいことではなく、特にWindowsでなければ簡単にできる。

たとえば、もともとはSanDiskにRMA申請するためのテストに使ったのがこのスクリプト。

まずはwrite。 引数にテストするブロックデバイスを取る。実際に書き込みを行うため、ブロックデバイスのデータは消滅する。 この出力をgraphスクリプトに渡すことでグラフ化できる。

私の手元だと600MB/sくらいまでは計測できる。 5秒単位で書いた累計ブロックの数を出力する。1ブロックは4MBである。

なお、バッファリングの関係で、全部終わるまで出力されない。

#!/bin/ruby

$counter = Object.new
class <<$counter
  def succ
    @wrote += 1
  end
  
  attr , true
end
$counter.wrote = 0

BLOCK_SIZE = 1024 * 1024 * 4

Thread.new do 
  File.open("write.log", "w") do |f|
    while sleep 5
      f.print "#{$counter.wrote}\n"
    end
  end
end

File.open(ARGV.shift, "w") do |disk|
  File.open("/dev/urandom") do |urandom|
    while val = urandom.read(BLOCK_SIZE)
      disk.write val
      $counter.succ
    end
  end
end

どれくらいのペースで書いているかは、topで%CPUを見ればだいたいわかる。 書き込みを行っている間は停止していて、残りはurandomとループなので、ストレージが十分に高速なら100%に張り付く。

読み出しはこちら。

#!/bin/ruby

$counter = Object.new
class <<$counter
  def succ
    @read += 1
  end
  
  attr , true
end
$counter.read = 0

BLOCK_SIZE = 1024 * 1024 * 4

Thread.new do 
  File.open("read.log", "w") do |f|
    while sleep 5
      f.print "#{$counter.read}\n"
    end
  end
end

File.open(ARGV.shift, "r") do |disk|
  while val = disk.read(BLOCK_SIZE)
    $counter.succ
  end
end

これらの結果を引数に与えることで、gnuplotに食べさせることができるデータを出力する。

#!/bin/ruby

last = 0
count = 1

ARGF.each do |line|
  current = line.chomp.to_i * 4
  diff = current - last
  psec = diff / 5
  printf "%d %d\n", count, psec
  count += 1
  last = current
end

gnuplot -e 'plot ./write-graph.dat' みたいにしてグラフにできる。

このようなブロックデバイスに直接シーケンシャルで書き込む方法は、実際のファイルシステム上ではまともに読み書きができないような状態のディスクでもかなり良好な値が出るため、性能テスト的にはあまり意味のないものではある。 どちらかといえば、ATAエラーのような「デバイス的にそもそも安定して読み書きできない」という問題がないかをテストするためのものだ。

もう少し別のアプローチ。 どちらかといえばファイルとしてランダムな値を書くほうがより現実的な計測になる。

そこで、Zshでこんな感じ。

(( left = 500 * 1000 / 4 ))
while (( left > 0 ))
do
  (( ct = RANDOM / 10 ))
  (( ct < 1 )) && continue
  dd if=/dev/urandom of=$left.random bs=4M count=$ct
  (( left -= ct ))
done

leftに入れている500は書き込むファイルの総容量(GB)。 これ「以上」書き込む。

ddは毎回速度を表示してくれる。 ランダムで4MB〜26.212GBのファイルを書き込んでいく。

これを実行することで、書き込み速度が維持されたのか、それともどこかで大きく低下したのかというのを見ることができる。 urandomを使ったddなので速度はあまり出ないから、ストレージがどれほど高速かというよりは、ちゃんと健康に書き込んでいけるかを見るテストといった感じ。