作成日:2021/12/21 更新日:2022/01/02

概要

本ページではクラウド移行で大きく性能影響を与える可能性があるDBのレイテンシを計測、考察します。

初めに

2021年現在、オンプレミス環境からAWSなどのクラウド環境への移行が加速しています。 オンプレミス環境からクラウドへ移行するにあたってレイテンシが大きく変化する場合があるため AWSのRDS(ORACLE)サービスやローカル環境でレイテンシを比較、考察していきます。

※本ページでのレイテンシとはSQLを実行するたびにかかるオーバーヘッド時間を指します。

環境・スペック

  • 同じVPCに属するEC2 -> RDSへ接続
  • DB接続する言語(ライブラリ)はpython(cx_Oracle)を利用
  • リソーススペックは以下の通り
    • EC2:t3a.micro(2CPU、1GBメモリ)
    • RDS:db.m4.large(2CPU、8GBメモリ)

検証方法

EC2からRDSへ20000回「select systimestamp from dual」を実行した処理時間を計測します。

ソースコードは以下の通りです。

dbTest.py
import cx_Oracle
import datetime

#環境固有値(パスワードやdsn名はxxxでマスク)
db_user  ='admin' 
db_pass  ='xxx'
db_dsn   ='database-1.xxx.ap-northeast-1.rds.amazonaws.com:1521/ORCL'
loop_cnt =20000
out_interval =5000
sql= 'select systimestamp  from dual'

con=cx_Oracle.connect(user=db_user, password=db_pass, dsn=db_dsn) 
curs = con.cursor()

print("開始時刻:"+datetime.datetime.now().strftime('%H:%M:%S'))

#SQL連続実行
for i in range(1,loop_cnt):
  result = curs.execute(sql)
  if 0 == i % out_interval:
    print('中間時刻:' + datetime.datetime.now().strftime('%H:%M:%S') + '('+ str(i) + ')' )
#  querySet = curs.fetchall()

print('終了時刻:'+datetime.datetime.now().strftime('%H:%M:%S'))

実行ログ

[centos@ip-172-31-32-220 20211221_rds]$ python3 dbTest.py
開始時刻:08:02:55
中間時刻:08:03:03(5000)
中間時刻:08:03:11(10000)
中間時刻:08:03:20(15000)
終了時刻:08:03:28

SQL統計

select executions  ,elapsed_time
from v$sql 
where  module like 'python3%';

EXECUTIONS ELAPSED_TIME
---------- ------------
     19999       340947

結論と考察

2万回SQL実行で32秒かかっていることから1SQL実行当たりの処理時間は1.6msとなりました。

V$SQL上のSQL処理時間(elapsed_time)は340ms程度であるため RDS内部ではほとんど時間はかかっておらず処理時間の大半はNW転送時間+クライアント側の処理時間となります。 また、本ページには記載していませんがクライアント側のtopを確認してもCPUはほとんど使っていなかったことから ほぼネットワーク通信で時間を要していると推測できます。

オンプレミス環境では経験上0.15~0.3ms程度が多い為 このケースではクラウド移行するとSQLを大量実行するようなアプリケーションは数倍性能劣化する可能性があります。

対策としてはサーバサイドで実行されるPL/SQLに移植するなどによりできるだけEC2とRDS間で通信が少なくなる対策が有効になります。

追記① OCI試した場合

OCI(Oracle Cloud Infrastructure)の無償利用できるDBとインスタンスでテストしたところ結果は0.6msでした。

無料のため遅いと予想していましたが予想外にAWS環境よりも2倍ほど速い結果でした。

ubuntu@instance-20211209-1324:~/work/20211221$ python3 dbTest.py
開始時刻:04:57:48
中間時刻:04:57:51(5000)
中間時刻:04:57:54(10000)
中間時刻:04:57:57(15000)
終了時刻:04:58:00

追記② インターネット経由でOCIのDBに接続した場合

①からクライアントをオンプレミス環境のwindow端末にして インターネット経由でDBDBに接続する構成にしたところ結果は8.05msでした。

DBは端末から距離的に近い東京リージョンとはいえ予想通りインターネットを経由すると極端に遅くなりました。

(venv) C:\Users\ftpsa\OneDrive\work\20211222_OCI_性能検証>python dbTest.py
開始時刻:14:29:02
中間時刻:14:29:43(5000)
中間時刻:14:30:22(10000)
中間時刻:14:31:02(15000)
終了時刻:14:31:43

追記③ オンプレミス環境内に閉じた構成にした場合

オンプレミス環境内のwindows端末から同じサブネットのDBに接続する構成で確認した結果は0.25msでした。

予想通りオンプレミスに閉じた環境が最も早くなりました。

(venv) C:\Users\ftpsa\OneDrive\work\20211222_OCI_性能検証>python dbTest_local.py
開始時刻:15:23:36
中間時刻:15:23:38(5000)
中間時刻:15:23:39(10000)
中間時刻:15:23:40(15000)
終了時刻:15:23:41
★ORACLE案件承ります