[pgpool-general-jp: 1261] Re: pgpoolから発行されるSQLの挙動について

Tatsuo Ishii ishii @ sraoss.co.jp
2014年 1月 30日 (木) 08:49:22 JST


貞永様

石井です。

まだ理由は分からないのですが、どうもPostgreSQLのログファイル上では実行
が終わっているのに、pg_stat_activiy上では実行中と認識されているような気
がします。

以下のように、PostgreSQLのログでは、pid 1487 が"SELECT count(*) FROM
pg_catalog.pg_class AS c WHERE c.oid =
pgpool_regclass('pgbench_accounts') AND c.relpersistence = 'u'"の実行を
8:25:42に終了しているのですが、pg_stat_activity上では、2014-01-30
08:25:42.87457+09時点でまだ実行中となっています。しかし、現在の時刻は
"select * from pg_stat_activiy"を実行した時刻から分かるように、8:26:13
です。

なので、貞永様の仰るように、この現象は無害のようですね。

なぜこうしたことが起こるのか、また対応方法は、といったことについては
PostgreSQLの関連ソースを読まないとわからないので、ちょっと時間をいただ
くことになります。

PostgreSQLのログ:
1487 2014-01-30 08:25:42 JST LOG:  execute pgpool1440/pgpool1440: SELECT count(*) FROM pg_catalog.pg_class AS c WHERE c.oid = pgpool_regclass('pgbench_accounts') AND c.relpersistence = 'u'

pg_stat_activityの表示:
-[ RECORD 2 ]----+---------------------------------------------------------------------------------------------------------------------------
datid            | 16392
datname          | test
pid              | 1487
usesysid         | 10
usename          | t-ishii
application_name | pgbench
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2014-01-30 08:25:42.867096+09
xact_start       | 2014-01-30 08:25:42.869271+09
query_start      | 2014-01-30 08:25:42.874569+09
state_change     | 2014-01-30 08:25:42.87457+09
waiting          | f
state            | active
query            | SELECT count(*) FROM pg_catalog.pg_class AS c WHERE c.oid = pgpool_regclass('pgbench_accounts') AND c.relpersistence = 'u'
-[ RECORD 3 ]----+---------------------------------------------------------------------------------------------------------------------------
datid            | 16392
datname          | test
pid              | 1497
usesysid         | 10
usename          | t-ishii
application_name | psql
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2014-01-30 08:25:47.063494+09
xact_start       | 2014-01-30 08:26:13.639638+09
query_start      | 2014-01-30 08:26:13.639638+09
state_change     | 2014-01-30 08:26:13.639641+09
waiting          | f
state            | active
query            | select * from pg_stat_activity;

> 石井様
> 
> お世話になります、貞永です。
> 
> -M extendedなし場合は発生しません。
> pg_stat_activityではstateがidleになっています。
> 実際に負荷がけした時のログを添付します。
> 
> よろしくお願いします。
> 
> 
> 
> 2014年1月29日 17:57 Tatsuo Ishii <ishii @ sraoss.co.jp>:
> 
>> 石井です。
>>
>> この現象は、-M extended なしでも発生しますか?
>> --
>> Tatsuo Ishii
>> SRA OSS, Inc. Japan
>> English: http://www.sraoss.co.jp/index_en.php
>> Japanese: http://www.sraoss.co.jp
>>
>> > お世話になります、貞永です。
>> >
>> > 昨年末から問い合わせさせていただているpgpoolから発行される
>> > SELECT count(*) FROM pg_catalog.pg_class AS c WHERE c.oid =
>> > pgpool_regclass('ユーザーテーブル') AND c.relpersistence = 'u'
>> > についてですが、いろいろ検証している中で気になる挙動が有りましたので、ご報告させていただきます。
>> >
>> > 構成は、
>> > pgpool-ii:: 3.3.1、マスタースレーブモード、ロードバランスモード、コネクションプールモードを使用
>> > PostgreSQL:9.3.0、ストリーミングレプリケーションでマスタ1台、スレーブ1台
>> > それぞれ別サーバーで、OSはCentOS6.4(64bit)
>> >
>> > pgbenchを使った負荷がけ(-S、-M extended)を行って確認しました。
>> >
>> > DB1号機(マスター)側で負荷がけ中のpg_stat_activityを見ると
>> > SELECT count(*) FROM pg_catalog.pg_class AS c WHERE c.oid =
>> > pgpool_regclass('pgbench_accounts') AND c.relpersistence = 'u'
>> > がずーっとactiveのままで残っていました。
>> > pgbenchが終了すると上記にSQLもきれいに消えています。
>> >
>> > psqlで\dxでpgpool_regclassが入っていることも確認しています。
>> >
>> > また、1号機をマスターからスレーブに切替を行った場合でも、スレーブの1号機にのみ同様の現象が発生します。
>> >
>> >
>> 以前、石井様からはこのSQLがアプリケーションのSQL発行前に実行され、それが終わらないとアプリのSQLが実行されないとおしえていただいたのですが、今回の現象において、これが起因してアプリケーションが遅くなっているようには見えませんでした。
>> > もともと、実際にシステム上に常に上記のSQLがLogTransactionとなってしまっているため、別途検証環境で検証を行い再現ができました。
>> > 参考までに、検証環境での負荷がけ時のログを添付します。
>> >
>> > この挙動は、実害がないよう見えていますが、不具合ではないでしょうか?
>> > もし不具合であれば解消の検討もしていただけるとありがたいです。
>> >
>> > 調査、確認の程よろしくお願いします。
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > --
>>
> 
> 
> 
> -- 
> ┌───────────────────────┐
>   株式会社アイティフォー
>     事業本部  技術企画部     貞永 佳市
>         Mail: ksadanaga @ itfor.co.jp
>         Tel: 03-5275-7903 (内線: 61466)
> └───────────────────────┘


pgpool-general-jp メーリングリストの案内