Oracle常駐接続プーリング(DRCP)を導入して苦労したメモ(1)
うちのシステムでPHPを使用していて専用サーバ接続で結構な頻度で接続切断を繰り返しているので、サーバリプレースのタイミングでDRCPを導入することになり、いろいろと嵌ったのでメモ。
環境は11.2.0.4 SEone。
- インストール方法と設定値確認方法
- 初期プールサーバ数ではまったこと
- 高負荷時のエラーではまったこと
- DRCPの監視と調整方法
1.インストール方法と設定値確認方法
簡単に導入可能です。
execute dbms_connection_pool.start_pool();
これで完了。
プールされたサーバプロセスの確認
ora_lxxxがプールされたサーバプロセスとなっている。
$ ps -ef |grep ora_l0 | grep -v grep oracle 30780 1 0 May17 ? 00:00:00 ora_l000_ptdb oracle 47535 1 0 May17 ? 00:00:00 ora_l001_ptdb
クライアントの設定
tnsnames.oraに(SERVER=POOLED)と追記してあげるだけでOK。
これまた簡単。ただしクライアントのOracleのVersionは11g以降でなければならない。
簡易接続ネーミングで接続できるか確認。
sqlplus user/password@localhost:1521/SID:pooled
実際に接続されているか確認する
前にブログで記載したoracle-showprocesslistを使用して確認。
SID SERIAL# STATUS ・・ EVENT WAITTIME SERVER BLOCKING_SESSION PROGRAM LOGON_TIME
---------- ---------- -------- ・・ -------------------- ---------- --------- ---------------- ---------------------------------------- -------------------
386 3251 INACTIVE ・・ SQL*Net message from 8 POOLED sqlplus@test-db (TNS V1-V3) 2015-07-30 20:01:45
SERVER列がPOOLEDになっていればOK。
DRCP設定値の確認
DBA_CPOOL_INFOビューでの確認
| パラメータ名 | デフォルト値 | 説明 |
|---|---|---|
| pool_name | 構成するプール名。現在は、デフォルトのプール名'SYS_DEFAULT_CONNECTION_POOL' のみがサポート | |
| minsize | 4 | プール内にプールされるサーバーの最小数 |
| maxsize | 40 | プール内にプールできるサーバーの最大数 |
| incrsize | 2 | プールされたサーバーがbusyのとき、プールを増大させる数 |
| session_cached_cursors | 20 | プールのすべての接続でSESSION_CACHED_CURSORS数 |
| inactivity_timeout | 300 | この期間中プール接続がアイドル状態のまま続くと、接続は切断しプールが縮小する(秒) |
| max_think_time | 120 | プールからセッションを取得した後、クライアントが何かしらしないと解放される最大時間(秒) |
| max_use_session | 500000 | 接続を取得し、プールに解放できる最大回数 |
| max_lifetime_session | 86400 | プールされたセッションのTTL(有効期間)(秒)。 |
| num_cbrok | 1 | クライアント要求を処理するために作成される接続ブローカーの数 |
| maxconn_cbrok | 40000 | 各接続ブローカーで処理できる接続最大数 |
minsizeとnum_cbrok がのちのち結構重要になってきます。
DRCP統計の確認
V$CPOOL_STATSビューで確認、内容についてはマニュアル参照
と、ここで何度か接続しているとV$CPOOL_STATSに気になる値が。。。
接続した要求分NUM_REQUESTSが増えるのはわかるがNUM_HITSが0でNUM_MISSESが要求数と同じだけ増えている。。。
SQL> select NUM_REQUESTS,NUM_HITS,NUM_MISSES from V$CPOOL_STATS;
NUM_REQUESTS NUM_HITS NUM_MISSES
------------ ---------- ----------
5 0 5
プールされたサーバをうまく使えていないのかといろいろ調べてみると。
- セッション純粋度が(NEW)の場合、プールサーバプロセスは共有するがセッションは共有しないのでNUM_HITSは基本的に0となる。
- セッション純粋度が(SELF)の場合、プールサーバプロセスも共有するしそのセッションも共有するためNUM_HITSがカウントアップする。
ということみたい。sqlplusで普通に接続するとセッション純粋度はNEWになる。
ということは、セッション純粋度が(NEW)の場合はsession_cached_cursorsをうまく使えないのかなと思ったりもする。
次回ははまったときのメモを書く予定。