ablog

不器用で落着きのない技術者のメモ

Oracle Database の I/O 負荷テストツール SLOB(The Silly Little Oracle Benchmark) の紹介

JPOUG Advent Calendar 2017 の21日目のエントリーです。昨日は JPOUG in 15 minutes at db tech showcase Tokyo 2017 開催報告 でした。
JPOUG Advent Calendar に参加するのも6年目になりました。
今年は「SLOB(The Silly Little Oracle Benchmark) 」というOracle Database 向けの I/O 負荷テストツールを使って、AWS で RDS Oracle にI/O負荷をかける手順を紹介します。
I/Oベンチマークツールには iomater、fio のような汎用的なベンチマークツールから Oracle ORION のような Oracle Database の I/O パターンをシミュレートするものなどがありますが、SLOB は Oracle Database に実際に SQL を発行してストレージの I/O 性能(I/Oレイテンシ、IOPS、I/Oスループット)を計測したいときに有益なツールです。

SLOB とは

SLOB(The Silly Little Oracle Benchmark) は Kevin Closson が開発した Oracle Database 向けのI/O負荷テストツールです。Cで書かれた小さなプログラムで、sqlplus で Oracle Database に SQL を発行してI/O負荷をかけるコマンドラインツールです。
Oracle ORIONDBMS_RESOURCE_MANAGER.CALIBRATE_IO の中間でかつ Swingbench のようなトランザクション発行機能を備えたリアルな Oracle Database のI/O負荷テストツールです。詳しくは Introducing SLOB – The Simple Database I/O Testing Toolkit for Oracle Database を参照してください。
人気・実績のあるツールで、以下のベンダーが SLOB によるベンチマーク結果を公開しています。

  • flashgrid.io
  • VMware
  • A joint paper co-branded by Intel and Quanta Cloud Technologies
  • VCE
  • Nutanix
  • Netapp
  • HPE
  • Pure Storage
  • Nimble
  • IBM
  • Red Hat
  • Dell EMC
  • Red Stack Tech.
SLOB Use Cases By Industry Vendors. Learn SLOB, Speak The Experts’ Language. | Kevin Closson's Blog: Platforms, Databases and Storage

作者の Kevin Closson について

Kevin Closson は元 Oracle の Exadata のパフォーマンス・アーキテクトで、EMC で XtremIO のチーフパフォーマンスアーキテクトを経て、現在は AWS のソリューションアーキテクトです。 その前は、HP、IBM、Sequent、Veritas などで商用UNIXにおける Oracle Database の性能向上に関わっていた人で、SMP/NUMAのロックやデータベースのキャッシングの特許の発明者というディープなバックグラウンドを持った人です。詳しくはコチラ

構成

  • EC2(Amazon Linux AMI release 2017.03)
  • RDS Oracle (Oracle EE 12.1.0.2.v10)
    • STATSPACK を含めたオプショングループを使わないと SLOB の実行でエラーになります。

インストール・設定手順

EC2 に Oracle Instant Client をインストールする
$ rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64
$ rpm -ivh oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
EC2 に gcc をインストールする
$ sudo yum -y install gcc
EC2 に SLOBをインストールする
$ tar xfz 2017.06.14.slob_2.4.2.tar.gz
$ cd SLOB/wait_kit
$ make
rm -fr *.o mywait trigger create_sem
cc     -c -o mywait.o mywait.c
cc -o mywait mywait.o
cc     -c -o trigger.o trigger.c
cc -o trigger trigger.o
cc     -c -o create_sem.o create_sem.c
cc -o create_sem create_sem.o
cp mywait trigger create_sem ../
rm -fr *.o
SLOBの設定をする
  • tnsnames.ora を設定する。
$ mkdir slob_test
$ cd slob_test
$ vim tnsnames.ora
slob =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = orcl1210.******.ap-northeast-1.rds.amazonaws.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )
$ export TNS_ADMIN=`pwd`
$ echo $TNS_ADMIN
/home/ec2-user/slob_test
$ sqlplus awsuser@slob
  • SLOB用の表領域を作成する
SQL> @./misc/ts
  • バッファキャッシュのサイズを確認する
    • バッファキャッシュより大きいデータサイズにしてI/Oを発生させるため、バッファキャッシュのサイズ / 80MB(SLOB のデフォルトのテーブルのサイズ)を計算して、あとで setup.sh や runit.sh を実行する際に使用する。
    • slob.conf で SCALE を 80M から 300M に変更した。
SQL> show sga
Total System Global Area 1.2482E+10 bytes
Fixed Size		    2938208 bytes
Variable Size		 6308235936 bytes
Database Buffers	 6140461056 bytes
Redo Buffers		   30613504 bytes

SQL> select round(6140461056/(80*1024*1024)) from dual;

ROUND(6140461056/(300*1024*1024))
--------------------------------
			      20
  • slob.conf を設定する
SCALE=300M
(中略)
SQLNET_SERVICE_BASE=slob
SQLNET_SERVICE_MAX=slob
(中略)
DBA_PRIV_USER="awsuser"
SYSDBA_PASSWD="********"
$ cp -pi setup.sh setup.sh.org
$ vi setup.sh
$ diff setup.sh.org setup.sh
179c179,180
< for exe in sqlplus tnsping
---
> #for exe in sqlplus tnsping
> for exe in sqlplus
273,279c274,280
< if ( ! tnsping $svc >> $LOG 2>&1 )
< then
< 	f_msg FATAL ""
< 	f_msg FATAL "${FUNCNAME}: tnsping failed to validate SQL*Net service ( $svc )"
< 	f_msg FATAL "Examine $LOG"
< 	return 1
< fi
---
> #if ( ! tnsping $svc >> $LOG 2>&1 )
> #then
> #	f_msg FATAL ""
> #	f_msg FATAL "${FUNCNAME}: tnsping failed to validate SQL*Net service ( $svc )"
> #	f_msg FATAL "Examine $LOG"
> #	return 1
> #fi
$ sh ./setup.sh IOPS 20
  • 作成されたテーブルを確認する。
$ cat cr_tab_and_load.out

SLOBでI/O負荷をかける

  • 負荷をかける。
$ sh ./runit.sh 20
  • Statspack レポートを出力する。
SQL> select snap_id, snap_time from stats$snapshot order by 1;
SQL> exec RDSADMIN.RDS_RUN_SPREPORT(5,6);
  • AWSマネジメントコンソールからダウンロードして確認する。

STATSPACK report for

Database    DB Id    Instance     Inst Num  Startup Time   Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
          1487923022 ORCL                1 21-Dec-17 05:22 12.1.0.2.0  NO

Host Name             Platform                CPUs Cores Sockets   Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     ip-10-7-1-139    Linux x86 64-bit           4     2       1         15.7

Snapshot       Snap Id     Snap Time      Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Begin Snap:          5 23-Dec-17 01:26:35      122       1.0
  End Snap:          6 23-Dec-17 01:31:39       42       1.1
   Elapsed:       5.07 (mins) Av Act Sess:      79.9

補足

  • Oracle Instant Client には tnsping は含まれない。

apparently oracle removed tnsping from the instant client 11.2.0.2.

adding tnsping to the instant client 11.2 | pfierens