phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。Oracle Database XE編

MySQLのコネクションプーリングは約2倍の性能結果が出ました。(同時100接続で100万回リクエストのApache Benchを実行した場合)

Oracle Database XEでのコネクションプーリングはどうでしょうか?検証してみたいと思います。


まずはOracle Database XEのコネクションプーリングしない方法で検証です。

コネクションプーリングしないプログラムで100万回リクエストのApache Benchを実行

下記のスクリプトを実行
oracle_connect.php

<?php
  $link = oci_connect('system', '[パスワード]', 'xe');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_connect.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_connect.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_connect.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 1259.278234 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190000000 bytes
HTML transferred: 0 bytes
Requests per second: 794.11 [#/sec] (mean)
Time per request: 125.928 [ms] (mean)
Time per request: 1.259 [ms] (mean, across all concurrent requests)
Transfer rate: 147.34 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 18.5 0 691
Processing: 0 122 249.2 61 9350
Waiting: 0 115 238.9 61 9349
Total: 0 125 251.4 61 9350

Percentage of the requests served within a certain time (ms)
50% 61
66% 63
75% 77
80% 100
90% 208
95% 383
98% 907
99% 1378
100% 9350 (longest request)

Time taken for tests: 1259.278234 secondsなので、約21分かかりました。
かなり遅い結果ですねー…。

逆にコネクションプーリングした際とどれ位差があるのか気になります。


コネクションプーリングの検証をする前に気になった記事がありましたのでこちらも検証しました。

oci_pconnectの第4引数を指定するとパフォーマンス向上 - Do You PHP はてブロ


コネクションプーリングしないプログラムで100万回リクエストのApache Benchを実行(接続時キャラクタセットを指定)

下記のスクリプトを実行
oracle_connect2.php

<?php
  $link = oci_connect('system', '[パスワード]', 'xe', 'JA16SJIS');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_connect2.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_connect2.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_connect2.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 1176.803295 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190000000 bytes
HTML transferred: 0 bytes
Requests per second: 849.76 [#/sec] (mean)
Time per request: 117.680 [ms] (mean)
Time per request: 1.177 [ms] (mean, across all concurrent requests)
Transfer rate: 157.67 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 21.7 0 609
Processing: 0 113 227.8 54 7051
Waiting: 0 104 213.3 54 7050
Total: 0 117 231.5 54 7051

Percentage of the requests served within a certain time (ms)
50% 54
66% 57
75% 75
80% 92
90% 209
95% 376
98% 765
99% 1358
100% 7051 (longest request)

Time taken for tests: 1176.803295 secondsなので、約20分かかりました。
さほど変わらず遅いですが、id:shimookaさんの記事の通り少し早くなりましたね。


次にOracle Database XEのコネクションプーリングの検証をしたいと思います!

コネクションプーリングするプログラムで100万回リクエストのApache Benchを実行

下記のスクリプトを実行
oracle_pconnect.php

<?php
  $link = oci_pconnect('system', '[パスワード]', 'xe');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_pconnect.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_pconnect.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_pconnect.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 505.614765 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190001710 bytes
HTML transferred: 0 bytes
Requests per second: 1977.79 [#/sec] (mean)
Time per request: 50.561 [ms] (mean)
Time per request: 0.506 [ms] (mean, across all concurrent requests)
Transfer rate: 366.98 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 5 10.3 1 319
Processing: 0 44 127.2 24 8470
Waiting: 0 33 117.1 12 8460
Total: 0 49 128.9 28 8476

Percentage of the requests served within a certain time (ms)
50% 28
66% 58
75% 61
80% 63
90% 83
95% 103
98% 189
99% 455
100% 8476 (longest request)

Time taken for tests: 505.614765 secondsなので、約8分かかりました。
約2倍強処理速度が向上しました。

コネクションプーリングするプログラムで100万回リクエストのApache Benchを実行(接続時キャラクタセットを指定)

下記のスクリプトを実行
oracle_pconnect2.php

<?php
  $link = oci_pconnect('system', '[パスワード]', 'xe', 'JA16SJIS');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_pconnect2.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_pconnect2.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_pconnect2.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 380.586453 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190000190 bytes
HTML transferred: 0 bytes
Requests per second: 2627.52 [#/sec] (mean)
Time per request: 38.059 [ms] (mean)
Time per request: 0.381 [ms] (mean, across all concurrent requests)
Transfer rate: 487.53 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 8.6 0 297
Processing: 0 33 122.2 5 6322
Waiting: 0 25 114.2 3 6321
Total: 0 37 123.7 6 6325

Percentage of the requests served within a certain time (ms)
50% 6
66% 47
75% 52
80% 54
90% 65
95% 87
98% 138
99% 379
100% 6325 (longest request)

Time taken for tests: 380.586453 secondsなので、約6分かかりました。
こちらも約2倍強処理速度が向上しました。
コネクションプーリングをしないMySQL並に速度が向上した結果が出ました。

まとめ

処理速度はやはりMySQLに分がありますね。さすがです。
しかし、無償のOracle Database XEをコネクションプーリングをする事で、同時接続時の処理速度の向上が図れる事がわかりました。
これを知る事・体験する事が出来て良い検証だったなーと思いました。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/