Auriga.dev

LinodeのNVMeストレージを試す

※この記事は以前別ブログに掲載していたものを加筆修正し、再度公開したものです。

こんにちは Nafです。

今回はLinodeで提供されているブロックストレージ(NVMe SSD版)をベンチマークしてみました。

このNVMe SSDは以前から一部のリージョンで使用可能だったのですが、最近東京リージョンで提供開始されました。

(提供開始されたらメール通知するやつを申し込んだのにメールは来なかった…)

準備

まずはテスト用のサーバーを立ち上げます。
今回はLinode 2GBのプランでサーバーを作成しました。

後に作成するブロックストレージと同じリージョンでサーバーを作らないと、ストレージがアタッチできないので注意しましょう。

その後、サーバーにアタッチする用のボリュームを作成します。
現時点(2022年3月)ではNVMeストレージは全てのリージョンで利用可能とのことです。

NVMeで作成されたボリュームは専用の表示があるため、簡単に見分けが付きます。

ボリュームをアタッチしたら、マウントを行います。
マウント手順は「Show Config」から詳しく見ることができます。便利

いざベンチマーク

さて、準備ができたので実際にどれくらいの性能なのか、ベンチマークを行います。

今回、ベンチマークはPostgreSQLのベンチマークツールであるpgbenchを利用しました。(当初ブロックストレージをデーターベース用に考えていたため)

まずはpgbenchのセットアップから始めます。
確か、postgresql-contribのパッケージにpgbenchが入っていた記憶…

[naf@localhost ~]$ sudo dnf install postgresql postgresql-server postgresql-contrib

pgbenchがインストールできたら早速ベンチマークを取ります。
まずはtest_dbに対して初期化をします。

[postgres@localhost ~]$ pgbench -i test_db
dropping old tables...
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
NOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.14 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 0.41 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 0.22 s, vacuum 0.10 s, primary keys 0.08 s)

初期化が完了したらベンチマークを実行します。
今回は 「接続数10、1接続あたりのトランザクションは1000 」という条件で取りました。

pgbenchはこのようなベンチマークだけではなく、実際に使うSQLもベンチマークできるようです。実際の見積りが出来ていいですね

[postgres@localhost ~]$ pgbench -c 10 -t 1000 test_db
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
latency average = 19.021 ms
tps = 525.746350 (including connections establishing)
tps = 525.914967 (excluding connections establishing)

結果、TPSが525前後ということになりました。
めちゃくちゃざっくりとTPSが大きければ大きいほど性能が良いということで大丈夫です。

それでは、NVMeストレージをマウントして、Postgresqlのデータフォルダも変更します。

[root@localhost ~]# mkfs.ext4 "/dev/disk/by-id/scsi-0Linode_Volume_db-bench"
mke2fs 1.46.3 (27-Jul-2021)
Discarding device blocks: done                            
Creating filesystem with 13107200 4k blocks and 3276800 inodes
Filesystem UUID: 9428e668-d18d-49ef-a7c3-305127615e73
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done   

[root@localhost ~]# mkdir "/mnt/db-bench"
[root@localhost ~]# mount "/dev/disk/by-id/scsi-0Linode_Volume_db-bench" "/mnt/db-bench"
[root@localhost ~]# chown -R postgres:postgres /mnt/db-bench/pgsql/
[root@localhost ~]# chmod -R 700 /mnt/db-bench/pgsql/

データフォルダの移行はPG_DATAとかいじっていい感じにしてください。

移行が完了したら、再度同じ条件でベンチマークを取ってみます。

[postgres@localhost ~]$ pgbench -c 10 -t 1000 test_db
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
latency average = 54.972 ms
tps = 181.911595 (including connections establishing)
tps = 181.955593 (excluding connections establishing)

!?!?!?!?!?????????!?!?!?!?!?!?!?!

遅すぎワロタ

TPSがブロックストレージのほうが4,5倍遅くなっちゃった。

結論

NVMeって名前は速いと思わせているが、以外と大したことは無い速度だった。

公式ドキュメントによると、概ねスタンダードモードで350MB/s、バーストモードで525MB/sの速度になるようです。(予想してたよりあんま速くないね…)

この速度だとサーバーのストレージの方が速いので、データベースなどディスクが重要なソフトはサーバーのストレージを使うことをお勧めします。

バックアップデーターの保存とかには向いているかもしれないですね(値段も安いので…)