[pgsql-jp: 25792] Re: DB接続頻度の限界について

Tatsuo Ishii t-ishii @ sra.co.jp
2002年 5月 3日 (金) 09:04:35 JST


石井です.

> 前の質問の絡みなのですが、現状、DB接続(PQsetdb())を行ない、データを
> インサートしております。インサートするデータは、
> 第1テーブルにlongの変数が16個
> 第2テーブルにlongの変数が2個とchar[256]の文字列を1個
> です。
> このデータを1件とし、1秒間に4件を処理しております。
> 1件ごとに、データベース接続・切断を繰り返しております。
> すると、前回の質問にも書かせていただきましたが、以下のエラーが発生しま
> す。
> 
> connectDBStart() -- connect() failed: Connection refused
>         Is the postmaster running at 'localhost'
>         and accepting connections on Unix socket '5432'?
> 
> 継続的にDBの接続・切断を繰り返した場合、どれぐらいの頻度(1秒間に何
> 回)
> が限界値なのでしょうか?

7.0.3の場合,私の手元の貧弱なノートパソコンでLinuxを動かして,pgbench 
で毎回接続モード(-Cオプション使用)で計測して1秒間に6 回くらいは接続で
きてます.非同期モードでバックエンドを動かす場合ならば1 秒間に33回位で
す.他の方はもっと良い数字を出していますね.

> 一応、ソースを見てみて、上記エラーが発生する箇所は見つけることが出来ま
> した(src/interfaces/libpq/fe-connect.c)が、どうしてこのエラーが発生し
> ているのかが、私の力不足で解析することができませんでした。
> このエラーの根本的な発生原因もご教示いただけると幸いです。

フロントエンドの問題ではなく,バックエンドの問題です.ですから
fe-connect.c 見ても答えは出てこないでしょう.今までの経緯からすると,
おそらくpostmasterが過負荷で,accept()待ちのキューが一杯になってしまっ
ているのでしょう.もともとSolaris はLinuxに比べるとプロセスの起動が重
いし,お使いのハードウェアも今となっては決して早いとは言えません.

まず,pgbench や簡単なテストプログラムを作って現状のシステム構成でどの
位の接続性能が出せるのか確認してはいかがでしょう.その上で,非同期モー
ドで動かすとか,毎回接続をやめるとか,チューニングをしていくことをおす
すめします.このあたりをきちんとチューニングすれば,求める性能は十分出
せると思います.

そういうノウハウがない,あるいはそんなことやっている時間はない,という
ことなら,最新型のPC+Linuxあたりに乗り換えるのが手っ取り早いです.

そうすれば,いい加減古くなった

> 動作環境:
> postgres7.0.3
> apache1.3.19
> php4.0.6

からも移行できて一挙両得:-)
# 大垣さんもおっしゃってましたが,php4.0.6は本当にまずいです.

そういえば,

> そして、1分毎にレコード行数を監視して1000行を超えていたら古いもの
> から500件をDELETE文で削除しております。

ってのも気になりますね.監視対象のテーブルの行数は分かりませんが,まず
行数を得るCOUNT(*)が重い.そして「古いものから500件をDELETE文で削
除」っていうのがどうやっているのかわかりませんが,まさかDELETEを500回
やっているのではないですよね?

また,VACUUMとかちゃんとやっているんでしょうか?もしかしてこのテーブル
はゴミがたまりにたまって巨大になっているとか:-)
--
Tatsuo Ishii



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