2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NVMe のパフォーマンス測定まとめ

Last updated at Posted at 2020-04-22

NVMeの性能測定に関するメモ。
次の3つのツールを使用してNVMeのパフォーマンスを測定します。

1、ddコマンド
2、fioツール
3、vdbenchツール

OS: CentOS 7.7
NVMe: Micron 9100 3.2TB
CPU: Xeon Gold 5117M 14Core x2個
Memory: 32GB 2400 x6
System:1029U-TN10RT(Supermicro)

#ddコマンドでサクッとシーケンシャル性能
書込みコマンド > 結果:1.7GB/s
time dd if=/dev/zero of=/nvme/testfile bs=1024k count=8192 oflag=direct
読出しコマンド > 結果:2.2GB/s
time dd if=/nvme/testfile of=/dev/null bs=1024k iflag=direct

[root@localhost Downloads]# time dd if=/dev/zero of=/nvme/testfile bs=1024k count=8192 oflag=direct
8589934592 bytes (8.6 GB) copied, 4.95339 s, 1.7 GB/s

[root@localhost Downloads]# time dd if=/nvme/testfile of=/dev/null bs=1024k iflag=direct
8589934592 bytes (8.6 GB) copied, 3.85802 s, 2.2 GB/s

[root@localhost Downloads]#

#有名なfioツールで測定

Ubuntuだとapt-get install fioでインストール可能です。

CentOS だとyumで持ってきてくれないっぽいので理研さんから拝借。
libpmemパッケージが無いとインストール時にエラーになるかもしれなないので入れておく。

#yum install libpmem-devel
#wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/f/fio-3.1-1.el7.x86_64.rpm
#rpm -ivh fio-3.1-1.el7.x86_64.rpm
#fio <テスト設定ファイル>

テスト用設定ファイルのサンプルは下記な感じで作りました。
ランダムアクセスは4KでQueue Depth深め
シーケンシャルは1MBでQueue Depthは浅め

###ランダムアクセス用の設定ファイル
ファイル名:random.fio

[global]
bs=4k
ioengine=libaio
iodepth=32
size=1g
numjobs=16
direct=1
refill_buffers=1
runtime=60
directory=/nvme
group_reporting=1
filename=ssd.test.file

[rand-read]
rw=randread
stonewall

[rand-write]
rw=randwrite
stonewall

結果は、下記のように鬼速いですが、CPUがほぼ100%使用されているので、実際のアプリでどう制御するかは検討事項になるかも。
ランダム読出し:419,000 IO/S 
ランダム書込み:331,000 IO/S 

省略
rand-read: (groupid=0, jobs=16): err= 0: pid=101145: Tue Apr 21 14:27:33 2020
   read: IOPS=419k, BW=1637MiB/s (1716MB/s)(95.9GiB/60001msec)
  lat (usec) : 50=0.01%, 100=0.01%, 250=0.01%, 500=0.04%, 750=0.30%
  lat (usec) : 1000=8.95%
  lat (msec) : 2=90.27%, 4=0.43%, 10=0.01%, 20=0.01%
  cpu : usr=4.36%, sys=91.72%, ctx=4582969, majf=0, minf=18859
 
rand-write: (groupid=1, jobs=16): err= 0: pid=101170: Tue Apr 21 14:27:33 2020
  write: IOPS=331k, BW=1294MiB/s (1357MB/s)(75.8GiB/60001msec)  
  lat (usec) : 50=0.01%, 100=0.01%, 250=0.01%, 500=0.15%, 750=0.35%
  lat (usec) : 1000=0.30%
  lat (msec) : 2=97.12%, 4=2.04%, 10=0.04%
  cpu : usr=5.20%, sys=92.32%, ctx=1623406, majf=0, minf=13469
  

###シーケンシャル用の設定ファイル
ファイル名:seq.fio

[global]
bs=1024k
ioengine=libaio
iodepth=4
size=1g
numjobs=4
direct=1
refill_buffers=1
runtime=60
directory=/nvme
group_reporting=1
filename=ssd.test.file

[seq-read]
rw=read
stonewall

[seq-write]
rw=write
stonewall

結果 はこちらも鬼速いですが、CPUもそんなに使わないので、ストリーミングやファイルサーバー的には無問題でしょう。
順次読出し:3081MB/s
順次書き込み:2235MB/s

seq-read: (groupid=0, jobs=4): err= 0: pid=101279: Tue Apr 21 14:32:02 2020
   read: IOPS=2938, BW=2939MiB/s (3081MB/s)(172GiB/60004msec)
  lat (usec)   : 1000=0.01%
  lat (msec)   : 2=0.08%, 4=19.51%, 10=79.91%, 20=0.43%, 50=0.08%
  cpu          : usr=0.34%, sys=25.11%, ctx=142386, majf=0, minf=13361

seq-write: (groupid=1, jobs=4): err= 0: pid=101291: Tue Apr 21 14:32:02 2020
  write: IOPS=2131, BW=2132MiB/s (2235MB/s)(125GiB/60006msec)
  lat (usec)   : 750=0.01%, 1000=0.05%
  lat (msec)   : 2=2.48%, 4=15.78%, 10=74.68%, 20=7.00%
  cpu          : usr=23.27%, sys=10.63%, ctx=71113, majf=0, minf=16003

#vdbenchでRAWデバイスを直接測定

ファイルシステムではなく直接デバイスにRead/Writeするとどうでしょうか?
ダウンロードはこちらから
https://www.oracle.com/downloads/server-storage/vdbench-downloads.html
それとは別にJava(jre)が必要になるので、下記も落としておく。
最新の物で良いと思いますが、Java関連はいつもトラブるので実績あるやつを使っています。
jre-7u1-linux-x64.rpm
https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html

#rpm -ivh jre-7u1-linux-x64.rpm
#unzip vdbench.zip
#cd vdbench
#./vdbench -f <設定ファイル>.prm

テスト用の設定ファイルrandom.prmは下記の通り。
1, /dev/nvme0n1の所は使用環境に合わせたデバイス名
2, xfersizeがテストするファイルサイズ
3, seekpct=0は、ランダムシークの%なので100だとランダム、0だとシーケンシャル
4, rdpctはReadのパーセンテージなので100だと読み出しのみ0だと書き込みのみ
5, forthreadsはスレッド数
6, elapsedは実行時間(秒)
あとはユーザーガイドのPDFを読んでくださいね。

compratio=1
*
sd=s1,lun=/dev/nvme0n1,align=4096,openflags=o_direct
*
wd=wd1,sd=(s1),xfersize=4KB,seekpct=100,rdpct=100
*
rd=rd1,wd=wd*,iorate=max,forthreads=32,elapsed=300,interval=1

ランダム読出しの実行結果 (ワークロード:1)
平均: 219081.86 IO/s

Apr 21, 2020  interval        i/o   MB/sec   bytes   read     resp     read    write     resp     resp queue  cpu%  cpu%
                             rate  1024**2     i/o    pct     time     resp     resp      max   stddev depth sys+u   sys

18:06:23.050        33  188037.00   734.52    4096 100.00    0.024    0.024    0.000    0.971    0.000   4.4   9.0   3.3
18:06:24.054        34  216224.00   844.63    4096 100.00    0.024    0.024    0.000    1.337    0.000   5.2  10.3   4.3
18:06:25.046        35  217075.00   847.95    4096 100.00    0.024    0.024    0.000    1.878    0.000   5.3  10.1   4.0
18:06:26.054        36  224799.00   878.12    4096 100.00    0.024    0.024    0.000    2.129    0.000   5.5  10.5   4.3
18:06:50.048  avg_2-60  219081.86   855.79    4096 100.00    0.024    0.024    0.000    4.086    0.000   5.2   9.9   3.9

ランダム書込みの実行結果 (ワークロード:1)
平均:263525.95 IO/s

Apr 21, 2020  interval        i/o   MB/sec   bytes   read     resp     read    write     resp     resp queue  cpu%  cpu%
                             rate  1024**2     i/o    pct     time     resp     resp      max   stddev depth sys+u   sys
18:16:46.088         1  155367.00   606.90    4096   0.00    0.033    0.000    0.033    0.196    0.000   5.2   6.6   1.6
18:16:47.012         2  194912.00   761.38    4096   0.00    0.033    0.000    0.033    3.979    0.000   6.3  11.2   3.8
18:16:48.052         3  274287.00  1071.43    4096   0.00    0.041    0.000    0.041    1.344    0.000  11.2  13.2   5.6
18:17:45.061  avg_2-60  263525.95  1029.40    4096   0.00    0.036    0.000    0.036    5.737    0.000   9.6  12.2   4.7

OutputディレクトリにHTML形式でログを見易く保存してくれる。
ヒストグラムでレイテンシーも見れる。

  min(ms) <     max(ms)        count    %% cum%%  '+': Individual%; '+-': Cumulative%

    0.000 <       0.020    7,578,813  58.6  58.6  +++++++++++++++++++++++++++++
    0.020 <       0.040    4,734,960  36.6  95.3  ++++++++++++++++++-----------------------------
    0.040 <       0.060       90,903   0.7  96.0  -----------------------------------------------
    0.060 <       0.080       20,341   0.2  96.1  -----------------------------------------------
    0.080 <       0.100       15,663   0.1  96.2  ------------------------------------------------
    0.100 <       0.200      483,566   3.7 100.0  +------------------------------------------------

贅沢にNVMeを6本使って測定するとどうでしょうか?

設定ファイルはこんな感じ。

sd=s1,lun=/dev/nvme2n1,align=4096,openflags=o_direct
sd=s2,lun=/dev/nvme3n1,align=4096,openflags=o_direct
sd=s3,lun=/dev/nvme4n1,align=4096,openflags=o_direct
sd=s4,lun=/dev/nvme5n1,align=4096,openflags=o_direct
sd=s5,lun=/dev/nvme4n1,align=4096,openflags=o_direct
sd=s6,lun=/dev/nvme5n1,align=4096,openflags=o_direct
*
wd=wd1,sd=(s1),xfersize=1024KB,seekpct=0,rdpct=100
wd=wd2,sd=(s2),xfersize=1024KB,seekpct=0,rdpct=100
wd=wd3,sd=(s3),xfersize=1024KB,seekpct=0,rdpct=100
wd=wd4,sd=(s4),xfersize=1024KB,seekpct=0,rdpct=100
wd=wd5,sd=(s4),xfersize=1024KB,seekpct=0,rdpct=100
wd=wd6,sd=(s4),xfersize=1024KB,seekpct=0,rdpct=100
*
rd=rd1,wd=wd*,iorate=max,forthreads=4,elapsed=60,interval=1


結果は、、18GB/s!  こんなに簡単に10GB/sを超えてくるとは。。。
4K編集でも8K編集でもイケそうな気がしてきた。

Apr 21, 2020  interval        i/o   MB/sec   bytes   read     resp     read    write     resp     resp queue  cpu%  cpu%
                             rate  1024**2     i/o    pct     time     resp     resp      max   stddev depth sys+u   sys
15:38:59.052        55   18509.00 18509.00 1048576 100.00    1.943    1.943    0.000    2.933    0.000  36.0   2.9   2.2
15:39:00.052        56   18592.00 18592.00 1048576 100.00    1.935    1.935    0.000    4.156    0.000  36.0   2.5   2.2
15:39:01.054        57   18552.00 18552.00 1048576 100.00    1.939    1.939    0.000    2.804    0.000  36.0   2.6   2.3
15:39:02.054        58   18590.00 18590.00 1048576 100.00    1.937    1.937    0.000    2.914    0.000  36.0   2.7   2.3
15:39:03.048        59   19280.00 19280.00 1048576 100.00    1.939    1.939    0.000    2.756    0.000  37.4   2.7   2.3
15:39:04.053        60   17825.00 17825.00 1048576 100.00    1.940    1.940    0.000    2.741    0.000  34.6   2.6   2.3
15:39:04.083  avg_2-60   18524.08 18524.08 1048576 100.00    1.941    1.941    0.000    6.164    0.000  36.0   2.7   2.2

ランダム性能もワークロードを上げていくと性能も上がる!
Random Readで3,500,000 IO/s越え・・・ だと!?
けどCPUがみるみるレッドゾーンへまっしぐらになるので要注意。
上げ過ぎたらなんかWarning 出ちゃった。

Apr 21, 2020  interval        i/o   MB/sec   bytes   read     resp     read    write     resp     resp queue  cpu%  cpu%
                             rate  1024**2     i/o    pct     time     resp     resp      max   stddev depth sys+u   sys
15:32:41.052        55 3571729.00 13952.07    4096 100.00    0.050    0.050    0.000   19.540    0.000 179.5  87.8  61.1
15:32:42.052        56 3602147.00 14070.89    4096 100.00    0.050    0.050    0.000   14.770    0.000 180.5  87.6  61.7
15:32:43.051        57 3623401.00 14153.91    4096 100.00    0.050    0.050    0.000   18.074    0.000 181.1  87.7  61.9
15:32:44.051        58 3591990.00 14031.21    4096 100.00    0.050    0.050    0.000   19.873    0.000 179.6  87.6  61.6
15:32:45.051        59 3739079.00 14605.78    4096 100.00    0.050    0.050    0.000   12.645    0.000 186.6  87.7  61.7
15:32:46.053        60 3453817.00 13491.47    4096 100.00    0.050    0.050    0.000   14.438    0.000 172.7  87.8  61.5
15:32:46.096  avg_2-60 3613343.63 14114.62    4096 100.00    0.050    0.050    0.000   29.592    0.000 180.5  87.7  61.8

15:32:46.097 * Warning: average processor utilization 87.68%
15:32:46.097 * Any processor utilization over 80% could mean that your system
15:32:46.097 * does not have enough cycles to run the highest rate possible


2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?