NVMe SSDのベンチマークをとってみた (約70万IOPS/1台)

手元にNVMe SSDがあったので、自分でベンチマークを取ってみたログ。
NVMeってのは、ストレージデバイスを接続する際の規格で、従来でいうSATAインターフェースの仲間みたいなもの。NVMeの詳細は以下のリンク先に記載があるので読んでいただきたい。

 NVMeは、SCSIやSATA(Serial ATA)と同じく、ストレージを接続するための規格だ。パイプラインやランダムアクセスなど、メモリーベースのストレージであるSSDの特徴を活用できる。また、SATAやAHCIの登場から現在までの間に進化した、データのレイテンシー(遅延時間)短縮のための手法も反映している。

 具体的な改良点としては、4KBの転送に必要なメッセージが2つではなく1つで済む点や、コマンドを処理するキューが1つではなく複数になっているという点がある。「複数」というのは、実に6万5536個である。これにより、多数のディスクI/O要求を同時に処理するサーバーでは、大幅な高速化が実現されるはずだ。一方、コンシューマー向けのパソコンでは、効果はそこまで大きくないはずである。

次世代SSDの接続規格「NVMe」とは(前) - 次世代SSDの接続規格「NVMe」とは:Computerworld


尚、今回使ったNVMe SSDの実物写真は以下。

NVMe SSD NVMe SSD

前提

ベンチマークの際に利用したのは以下のような環境。

  • サーバ: DELL PowerEdge R630
  • CPU: Intel Xeon E5-2695 v3 (2.30GHz) x2
  • メモリ: 256GB
  • NVMe SSD: (SAMSUNG製) DELL MZ-WEI8000 800GB x4
    • SAMSUNG XS1715シリーズのOEM製品?
  • OS: CentOS 6.6
  • ファイルシステム: XFS
# cat /sys/block/nvme0n1/queue/scheduler
none

# cat /etc/redhat-release
CentOS release 6.6 (Final)

# cat /proc/version
Linux version 2.6.32-504.8.1.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Jan 28 21:11:36 UTC 2015

# getconf _NPROCESSORS_ONLN
56


ベンチマークはfioを利用した。ベンチマークは下記のようなスクリプトを組んで実行した。


fioで実行する内容としては、以下のような感じ。

  • シーケンシャルアクセス(R/W)とランダムアクセス(R/W)の4パターン
  • ブロックサイズは4k
  • 同時実行ジョブ数は、1〜256
  • スループット(帯域)を測る際は、ブロックサイズ32mでシーケンシャルアクセスのみ


また、デバイスを2本または4本束ねる際は、ソフトウェアRAIDを利用しているのでそのパラメータとか、XFSまわりのパラメータは以下のような感じ。

# mdadm --create /dev/md0 --chunk=256 --level=0 --raid-devices=2 /dev/nvme0n1p1 /dev/nvme1n1p1

# mkfs.xfs -f -b size=4096 -i size=512 -l size=64m /dev/md0
# mount -t xfs -o noatime,logbufs=8 /dev/md0 /data

NVMe SSD x1

まずは、NVMe SSD 1本でのベンチマーク結果。


見事なもので、シーケンシャルリードは74万IOPSに到達。ランダムリードも70万IOPS弱出ている。ライトもシーケンシャル・ランダムともに35万IOPS強と、これまでのSATA SSDでは到達できなかったような数値。
大容量ファイルの転送を意識したスループットでは、リードで1.67GB/sと、約13Gbpsのスループットといった結果。このパフォーマンスを存分に使いこなすには、それなりの環境が必要となりそうですね。

NVMe SSD x2

次は、NVMe SSD 2本をRAID0でストライピングさせた際のベンチマーク結果。


2本束ねたところ、256スレッド並列で、リード性能は100万IOPSを超え、120万IOPS前後といったところ。スレッド数を大きくしていくと数字が伸びる傾向。しかし、リードのスループットが想像以上に伸びているのは何故だろうか・・・。3〜4GB/s前後くらいのはずだが・・・。
ライトは2本で60万IOPS付近から、スレッド数を上げてもそれほど変わらなくなってきたので、やはり1台あたり30万IOPSくらいが上限付近なのだなぁ。

NVMe SSD x4

最後に、NVMe SSD 4本をRAID0でストライピングさせた際のベンチマーク結果。


思ったほど数字は伸びなかった。というか256並列は少しやりすぎたというか、CPUリソースの方が限界なのかもしれない。リードは今回の環境では、2本束ねたときの方が数値が良い。ライトは64〜128スレッド付近で、80万IOPSを超える感じにはなっているが、それより大きくすると低下傾向。
スループットは6.7GB/sと、もう十分すぎる帯域を確保できた気分になる。

デバイス本数ごとの比較

せっかくなので、利用デバイスの本数を1,2,4本と変化させたとき、ランダムアクセスがどう変化したのかといった比較も載せておく。

ランダムリード


まず、1〜16スレッドまでは、本数が何本だろうと、ほとんどIOPS数値が変わっていない。これはそもそもツールの生み出す負荷に対して、1本で十分捌ける程度の負荷だということだろうと予測する。
32スレッドから複数デバイスが優位。こうしてグラフにしてみると、スレッド数を上げるとリニアに性能は伸びている。サーバのコンピューティングリソースが、もっと使える環境であれば、さらに数値は伸びそうな予感ではある。

ランダムライト


こちらも、ほぼ同じような感じかな・・・。4本のケースだと、この環境では64スレッド付近がMAXだったというのは、先ほども述べた通り。

おわりに

6〜7年前にSSDが出始めた頃、1万IOPSオーバーのI/O性能に興奮したものですが、5年ほど前にはPCIe接続型のSSD(Fusion-io ioDriveなど)が登場し、数十万IOPSの性能を手に入れることができましたが、なかなか高価な部類ではありました。
この3年くらいで、SATA SSDも10万IOPSを超える機種が出始め、どんどん容量単価が下がり、コストパフォーマンスは上がり、そして、この1年くらいでNVMe型のSSDが、市場に現れてくるようになりました。1本あたり70万IOPSといった破壊力。値段もまだまだ高価ですが、それでも高価なPCIe-SSDよりはお安いかなという印象です。


もう正直、ここまで高性能なデバイスのパフォーマンスを使いこなす方が大変だなぁ、というか使いこなせるのは、現状わずかな事業体くらいなのかなと思っています。デバイスが進化し、より高性能・低価格になっていくのは歓迎ですが、この高性能なデバイスでしか実現できない価値・イノベーションを産み出すことに、我々はもっと精進・努力しないといけないな、とベンチマークを取りながら非常に焦燥感を覚えてしまいました。


なんか朝から堅い話になってきたので、今日はここまで。
それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́


インテル SSD 750 Series 400GB MLC 1/2 Height PCIe 3.0 NVMe SSDPEDMW400G4R5

インテル SSD 750 Series 400GB MLC 1/2 Height PCIe 3.0 NVMe SSDPEDMW400G4R5