Oracle常駐接続プーリング
(DRCP)を導入した話
GMOメディア株式会社
北川健太郎
2016/05/10
Oracle Database Connect 2016
自己紹介
名前
北川健太郎
所属
GMOメディア株式会社
DBA歴3年目
社内
MySQL:99%
Oracle Database SEone:1%
SE2を本気でどうしようか悩み中・・
WEBアプリケーション
基本PHPが多い
コネクションプーリングがない
処理ごとに新規接続を繰り返す
→ MySQLでは良いがOracleDatabaseでは・・・
Oracle Databaseは・・・
・リスナーが原因不明で落ちる
・OSのカーネルCPUの使用率が高い
常駐接続プーリング(DRCP)とは
Oracle Database 11g以降の機能
Oracle Database SE2/SE/SEoneでも使用可能
Oracle側で専用サーバプロセスをプリフォークして、新
規接続時にプロセスを共有する仕組み
コネクションプーリングをOracle側でやるイメージ
DRCPの導入
非常に簡単に導入可能(今回は11gR2)
Oracleサーバ側
execute dbms_connection_pool.start_pool();
クライアント側
tnsnames.oraに(SERVER = pooled)を追加する
$ vim $ORACLE_HOME/network/admin/tnsnames.ora
pooltest =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = pooled)
)
)
DRCPの設定値
DBA_CPOOL_INFOビューで確認
オンラインで設定変更可能
DRCPの設定値
パラメータ名 デフォルト値 説明
POOL_NAME SYS_DEFAULT_CONNECTI
ON_POOL
構成するプール名
MINSIZE 4 プールサーバの最小数
MAXSIZE 40 プールサーバの最大数
INCRSIZE 2 プールの増大数
SESSION_CACHED_CURS
ORS
20 セッションカーソルキャッシュ
INACTIVITY_TIMEOUT 300 アイドルセッションTTL
MAX_THINK_TIME 120 アイドル最大時間
MAX_USE_SESSION 500000 プールを解放できる最大数
MAX_LIFETIME_SESSIO 86400 セッションTTL
NUM_CBROK 1 接続ブローカー数
MAXCONN_CBROK 40000 CBROKの接続最大数
事前にモニタリングや可視化して見積もる
MINSIZE
セッション数(v$session)
専用サーバ確立数(lsnrctl service)
DRCPの設定値見積もり
"DEDICATED" 確立:18 拒否:0 状態:ready
LOG ON数(v$sysstatのlogons cumulative)
MAXSIZE ・・・最大接続数まで達すると接続が待たされる
PGA_SIZE
初期化パラメータのprocesses
NUM_CBROK ・・・最大同時接続200
Minsizeと同等な確認
DRCP導入後・・
・リスナーが落ちなくなった
・カーネルCPUの使用率が1/3になった
・ログオン数も少し増えた
DRCP監視と対策
1.接続ブローカーの拒否数の増加
→接続ブローカ数を増やす (NUM_CBROK)
V$CPOOL_STATSのNUM_WAITSが増加する
→プールサーバの最小値(MINSIZE)を増やして待機を減らす
$ lsnrctl service
・
・
"DEDICATED" 確立:513 拒否:0 状態:ready
LOCAL SERVER
"N000" 確立:17364 拒否:1023 現行:0 最大:40000 状態:ready
CMON <machine: oracle-db01, pid: 24817>
・
2.サーバプールの待機の増加
その他
共有プールが肥大化
SGA
select pool, name, bytes/1024/1024 MB from v$sgastat
where pool =‘shared pool' order by 3;
・
・
shared pool SQLA 1,089.1
shared pool kpplmcchtge:kpplmcc 9,677.5
1ヶ月で10Gも増えた
共有プールが肥大化
V$CPOOL_CC_INFO・・プールと接続のクラス・マッピングに関する情報
CCLASS_NAMEがランダムに生成され全て新規接続毎にキャッシュされていた様子
クライアント側に環境変数ORA_CONNECTION_CLASS=XXXXを設定すること
でCCLASS_NAMEが再利用されるため解決
select * from V$CPOOL_CC_INFO ;
POOL_NAME CCLASS_NAME
________________________________________________________________
SYS_DEFAULT_CONNECTION_POOL ORCL.OCI:SP:HqzTc6WwNWngU0fGqMAhCA
select * from V$CPOOL_CC_INFO ;
POOL_NAME CCLASS_NAME
_______________________________________________________________
SYS_DEFAULT_CONNECTION_POOL ORCL.OCI:SP:XXXX
POOLED接続切断時の挙動
DRCP導入後TCP Connection Resetsの値が増加
コネクション切断時にクライアントがRSTパケットを送ってる模様
・専用サーバ切断時(3ウェイハンドシェイク)
POOLED接続切断時の挙動
DRCP切断時
理由は不明なんで放置してます。。
まとめ
WEBアプリケーション(PHP)+OracleDatabaseを使用してい
る場合は、簡単に導入できるDRCP使用したほうが良いかも。
12cからはサーバプロセスをスレッド化することが可能らしいの
でそちらが気になる。 (Thread_execution)
・ 初期化パラメータ変更
alter system set THREADED_EXECUTION=true scope=spfile;
alter system set USE_DEDICATED_BROKER=true;
・ listener.ora
DEDICATED_THROUGH_BROKER_lister=on
ご清聴ありがとうございました

Oracle常駐接続プーリング(DRCP)を導入した話