DB2 コネクションコンセントレータを試す

注意:相変わらず適当なことを書いている可能性がありますので
   今一度テスト環境で確認等をしてからご使用するなりしてください〜


前から気になっていた「コネクションコンセントレータ」「Connection Concentrator」を
試してみました。

アプリケーションがDBに接続する際に、基本的にコネクションが張られると
db2agentが1つ立ち上がります。
(イメージとしてはapachehttpdに近いです)
ただ、db2agentもしっかりしたプログラム(9.5以降はスレッド)なので
それなりにメモリーもとりますし、OS上ではプログラム(スレッド)が
増えます。
IBMの説明では、業務アプリで、クライアントがすごい台数あり、
始業時刻になると一気にPCの電源が入りアプリが立ち上がったとたん
DBへの接続がガンガンきて不安定になる・・のを回避できるんだそうです。
自分たちであれば昨今のフレームワークだと、ブラウザからのアクセスがあったら
とりあえずDBに接続しちゃうものもあるようで、
結局処理的にはQueryを投げずに終わるパターンもあるんじゃないかと思います。

そんな「結局何もしない接続」でもDB側は律儀にdb2agentがあらがってきますので
DB側の負荷は少なからずあったりします。
アプリ側で気をつければいいのですが、もうどうにもならんw
なんて話はよくあるわけでwwww

で、1つの解決策としてConnection Concentratorを使って
接続口でdb2agentへの接続を集約させようというものです。
(connection poolingの考えですね)

たとえばクライアントが500台ほどあって
でも、同時に処理が走るのはせいぜい50くらいなら
agentの数は100で、接続数は1000くらいでいいかな?って
設計したとしたら

DB2 9.1以前では
db2agentの数はMAXAGENTSで設定しましたので

db2 update dbm cfg MAXAGENTS 100 MAX_CONNECTIONS 1000

DB2 9.5では
MAXAGENTSが無くなりMAX_COORDAGENTSがそれになりますので

db2 update dbm cfg using MAX_COORDAGENTS 100 MAX_CONNECTIONS 1000

という設定をします。

これでいくら接続があってもdb2agentは100(くらい)しか上がってこないので
サーバもある程度楽になってくれると思います。


では、実際に試してみました。
phpdb2_connectを一気に200ほど張るコードを書いて

・接続とエージェントが同数=Connection Concentratorが無効の状態

db2 update dbm cfg using MAX_COORDAGENTS 1000 MAX_CONNECTIONS 1000


・接続1000まででエージェントが100=Connection Concentratorが有効の状態

db2 update dbm cfg using MAX_COORDAGENTS 100 MAX_CONNECTIONS 1000

の2パターンを試してみました。

まずは
Connection Concentratorが無効の状態の状態でコードを走らせると
一気にagentがあがりました。

$ db2pd -edus |grep db2ag

229       2558520208     3843           db2agent (TESTDB)                      0.000000     0.000000
228       2559568784     3842           db2agent (TESTDB)                      0.000000     0.000000
227       2528111504     3841           db2agent (TESTDB)                      0.000000     0.000000
226       2575297424     3840           db2agent (TESTDB)                      0.000000     0.000000
225       2576346000     3839           db2agent (TESTDB)                      0.000000     0.000000
224       2577394576     3838           db2agent (TESTDB)                      0.000000     0.000000
223       2578443152     3837           db2agent (TESTDB)                      0.000000     0.000000
222       2579491728     3836           db2agent (TESTDB)                      0.000000     0.000000
221       2580540304     3835           db2agent (TESTDB)                      0.000000     0.000000
220       2581588880     3834           db2agent (TESTDB)                      0.000000     0.000000
219       2582637456     3833           db2agent (TESTDB)                      0.000000     0.000000
218       2583686032     3832           db2agent (TESTDB)                      0.000000     0.000000
217       2584734608     3831           db2agent (TESTDB)                      0.000000     0.000000
216       2585783184     3830           db2agent (TESTDB)                      0.000000     0.000000
215       2586831760     3829           db2agent (TESTDB)                      0.000000     0.000000
 ・
 ・
 ・
まだまだ続く・・

で、Connection Concentratorを有効にすると、200の接続があったにもかかわらず
agentが3個しか上がってこず、これは期待できそう〜

$ db2pd -edus |grep db2ag

56        3068128144     3455           db2agntdp (TESTDB  )                   0.350000     0.140000
55        3067079568     3454           db2agntdp (TESTDB  )                   0.060000     0.020000
17        3079662480     31755          db2agntdp (TESTDB  )                   1.690000     0.950000


ちなみにDB2 9.5はスレッドモデルに移行したためpsコマンドではdb2agentが確認できないので

db2pd -edus

ってやるとdb2関連のスレッドがわかります。


Connection Concentratorもすべてもアプリケーションに適応できるわけではないので
その点はご注意を・・


参考記事:
http://www.ibm.com/developerworks/jp/db2/library/dataserver/sakura/hiken/06.html