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
をうまく使えないのかなと思ったりもする。
次回ははまったときのメモを書く予定。