こんにちは。並河(@namikawa)です。
すっかり春の陽気ですね。花見の春。スギ花粉の春。ラーメンの春。ちょっと複雑な気分です。
さて、以前に以下のブログエントリでも紹介したのですが、弊社のサービスは、今をときめく Google Cloud Platform 上で動かしているものが多くなってきました (移行中)。
で、その中でも Google Compute Engine (以下、GCE) がメインといった使い方にはなっているのですが、以下の点が気になったので、ディスク(SSD)ベンチマークを取得してみました。
- 容量によってランダムIOPSやスループットの上限が決まっているが、シーケンシャルアクセスはどうか
- ディスクを複数本束ねていくと、実際のとことろ上限は変化するのか
ということで、実際にやってみましたよ、と。
前提
使用した環境は以下の通りです。
- インスタンス構成
- n1-highcpu-32 (32core, 28.8GB)
- SSD (persistent disks, 1000GB) x2
- Local SSD (NVMe, 375GB) x2
- OS
- Ubuntu 16.04.2 LTS
- Linux version 4.8.0-46-generic (buildd@lcy01-15) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) )
- I/Oスケジューラ
- noop
- ファイルシステム
- XFS
- ベンチマークツール
- fio (2.2.10)
尚、ベンチマークは下記のようなスクリプトを組んで実行しました。
fioで実行する内容としては、上記のスクリプト通りではありますが、要約すると以下のような感じで指定しました。
- シーケンシャルアクセス(R/W)とランダムアクセス(R/W)の4パターン
- ブロックサイズは4k
- 同時実行ジョブ数は、1~256
- スループット(帯域)を測る際は、ブロックサイズ32mでシーケンシャルアクセスのみ
また、デバイスを2本束ねる際は、ソフトウェアRAIDを利用しているのでそのパラメータとか、XFSまわりのパラメータは以下のような感じです。
# mdadm --create /dev/md0 --chunk=256 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 # mkfs.xfs -f -b size=4096 -i size=512 -l size=64m /dev/md0 # mount -t xfs -o noatime,logbufs=8 /dev/md0 /data
GCE SSD関連の性能仕様
ベンチマーク結果の前に、GCEのドキュメントではスペックが公開されていますので、確認しておきましょう。
最新情報・詳細はこちらをご覧ください。
現時点(2017/04)の数字で要点だけまとめておくと
- SSD(persistent disks)では、1GBあたり30IOPS(ランダムアクセス)の性能が出る
- 例えば、100GBのSSDボリュームでは3000IOPS、500GBのSSDボリュームだと15000IOPSという具合
- ただしSSDのIOPSは、以下の条件で上限が設けられている
- 15コア以下のインスタンスでは Read/Write で 15000IOPS / 15000IOPS まで
- 16コアから31コアまでのインスタンスでは Read/Write で 25000IOPS / 25000IOPS まで
- 32コア以上のインスタンスでは Read/Write で 40000IOPS / 30000IOPS まで
- Local SSD(NVMe)は1本あたり、 Read/Write で 170000IOPS / 90000IOPS の性能
- ただし1インスタンスあたりでは、 Read/Write で 680000IOPS / 360000IOPS まで
そんなところで実際の数値を確認するべくベンチマークを取得してみました。
SSD (1000GB) x1
このベンチマークでは、1000GBのSSD(persistent disks)を割り当てたものを使っているので、このグラフ通り、公称値通りの結果となりました。
シーケンシャル・ランダムアクセスのRead/Writeともに、30000IOPS超で綺麗にキャップされています。
スループットに関しても、Readが480MB/s超、Writeが400MB/s超と、こちらも公称値通りの結果です。
SSD (1000GB) x2
次に、1000GBのSSD(persistent disks)を2本、RAID0(ソフトウェア)で束ねて計測してみました。
こちらは、シーケンシャル・ランダムアクセスのReadが40000IOPS超、Writeが30000IOPS超のところでキャップされました。
上記のGCEの仕様で記載した「32コア以上のインスタンスでは(Read/Write)で 40000IOPS / 30000IOPS まで」というインスタンス単位での上限ですね。
尚、32コアインスタンスのスループット上限に関しては Read/Write が 800MB/s / 400MB/s になっているのですが、Readが約490MB/s程度の結果でした。
これは、60秒間通信を続けて平均をとっているのですが、最初の30秒程度は800MB/s近く出ているのですが、そのあと不安定な波形となっていて、時間的に不調だったのかもしれません。余裕があれば、後日追試してみたいと思います。
Local SSD (NVMe, 375GB) x1
ついでに Local SSD (NVMe) も計測してみました。
ランダムリードは公称値の170000IOPS超、ランダムライトは83000IOPS超でした。
シーケンシャルアクセスも、ランダムアクセスとほぼ同じ伸びをしていますが、同時実行ジョブ数が増えてくると若干ながら伸び悩む傾向です。ただし32コアのインスタンスで計測したものなので、大きなジョブ数での数値は参考値程度、です。
Local SSD (NVMe, 375GB) x2
次に、Local SSD (NVMe) を2本、RAID0(ソフトウェア)で束ねて計測してみました。
ランダムリードは、2本束ねた通りの綺麗な伸びをしています。シーケンシャルリードはそれに及ばないもののきっちり伸びていますね。
ライトに関しては、シーケンシャル・ランダムアクセスの双方とも82000IOPS超あたりから伸びていませんでした。
先ほどの Local SSD 1本の時も同じ話が言えるのかもしれませんが、今回のベンチマークのようなマルチスレッドではなく非同期I/Oを使用したベンチマークでは、きちんとした数字がのってくるのかもしれません。
おわりに
今回は、GCEのインスタンスに、SSD (persistent disks) と Local SSD (NVMe) それぞれで、ベンチマークを取得してみました。
結果としては、概ね公式ドキュメントに記載してある公称値通りの結果となっています。その他は各々のケースで考察として記載した通りです。
仕様的には、SSDボリューム単位での性能上限とインスタンス単位での性能上限が別々であるので、そこだけ注意しておけば問題ないかと思います。
尚、前述の通りですが、Local SSDのような高速なIOPSが実現できるケースでは、(その上で動かすミドルウェアのI/O方式を確認の上で)マルチスレッドな実行だけではなく、非同期I/Oでの計測も確認した方が良いとは思います。
このベンチマーク結果が何かの参考になれば幸いです。
最後にお約束ですが、そんなGCPを使って自社サービス開発・運用であったり、大量のデータ基盤をなんとかしてくれるエンジニアを絶賛募集しておりますので、是非下部のバナーから(ry
今日はここまで。それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́