kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

Oracle常駐接続プーリング(DRCP)を導入して苦労したメモ(1)

うちのシステムでPHPを使用していて専用サーバ接続で結構な頻度で接続切断を繰り返しているので、サーバリプレースのタイミングでDRCPを導入することになり、いろいろと嵌ったのでメモ。
環境は11.2.0.4 SEone。

  1. インストール方法と設定値確認方法
  2. 初期プールサーバ数ではまったこと
  3. 高負荷時のエラーではまったこと
  4. 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を使用して確認。

kenken0807.hatenablog.com

       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 各接続ブローカーで処理できる接続最大数

minsizenum_cbrok がのちのち結構重要になってきます。

DRCP統計の確認

V$CPOOL_STATSビューで確認、内容についてはマニュアル参照

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

プールされたサーバをうまく使えていないのかといろいろ調べてみると。

OCIプログラミングの高度なトピック

  • セッション純粋度が(NEW)の場合、プールサーバプロセスは共有するがセッションは共有しないのでNUM_HITSは基本的に0となる。
  • セッション純粋度が(SELF)の場合、プールサーバプロセスも共有するしそのセッションも共有するためNUM_HITSがカウントアップする。
    ということみたい。sqlplusで普通に接続するとセッション純粋度はNEWになる。

ということは、セッション純粋度が(NEW)の場合はsession_cached_cursorsをうまく使えないのかなと思ったりもする。

次回ははまったときのメモを書く予定。