Apacheの同時接続数とPostgresqlの同時接続数について

【この記事の所要時間 : 約 5 分

postgresql

またまた、Postgresqlのパラメータチューニングネタというか、同時接続数ネタですが、LAPPの場合、Apacheの同時接続数とPostgresqlの同時接続数という話になると思う。
よくありがちなのが、パラメータをデフォルトで使っていておかしくなってしまうパターン。
よくあるのが、Apacheの同時接続数が150で、postgresqlの同時接続数が32というもの。
PostgresSQLの同時接続数

Apache+PHP+PostgresSQLでサーバーを運用しています。アクセス数が多くなるとApacheが停止してしまいす。そのためボトルネックの調査をしているのですが、Apacheの同時リクエスト数(MaxClients)を150、
PostgreSQLの同時接続数(MAX_CONNECTIONS)を32に設定しています。
ApacheとPostgreSQLの同時接続数はどちらを多くしたほうがよいでしょうか?

という質問に対して、以下なような回答。

フロントエンドの接続数よりもバックエンドの接続数が少なければ,フロントエンドで止まってしまいますよね?
CCCCCCCCCC [client]
FFFFFFFFFF [apache]
BBB******* [postgres]
*の部分は足りないのでエラーが返る.
ひとつのスクリプトでpostgresに2connectionあれば,フロントエンド=バックエンドでは足りなくなりますよね?よって,安全を考えてF < Bって考えるべきかと思います.

とのこと。
似たような質問は、PHP についての話題一般について議論をするメーリングリストである「PHP-users」にもあった。
[PHP-users 32303] Re: 持続的接続の挙動について質問があります。

> > PostgreSQL の同時接続数 (max_connections) と
> > Apache の同時処理数 (MaxClients)
> > はどちらが大きいですか?
>
> PostgreSQLのmax_connectionsは、100
>
> ApacheのMaxClientsはないので、
> おそらく
> ThreadsPerChild 250
> MaxRequestsPerChild 0
> になろうかと思います。
>
> どちらもデフォルト値にしています。
ということは、Apache では最大 250 の処理スレッドが起動して、それぞれが PostgreSQL への接続を保持しようとするわけです。対して PostgreSQL の最大接続数は 100。どう考えても PostgreSQLの接続数不足になりますよね。
福永さんのケースでは、100しか用意していない PostgreSQL 接続に対して250 の Apache スレッドが接続しに行くので、それは数が足りてませんということです。

パラメータはデフォルトで使ってはいけません。というケースですね。
ただ同時接続数を上げればいいという問題でもないと思うねんけど、どこかのレンタルサーバでは、「Apache、DB共に256同時接続としていますので、高アクセスにも対応しています。」とうたっている。
PostgreSQLのパフォーマンスを向上する

たくさん接続できるようにpostgresql.confの中にあるmax_conenctionsの値を変更する。
— default —
#max_connections = 64
— example —
max_connections = 256
一つのマシンでPostgreSQLを動かすような場合は、たくさんの接続がある = たくさんプロセスが走り始める、ということになってしまう。その点は注意した方が良い。それからコネクションの最大値は普通は1プロセスの最大ファイルオープン数(1024)以下だ。

まあある程度、メモリに余裕があるなら同時接続数は上げておいた方がいいということはいえそう。
もちろん、apacheの同時接続数 < postgresqlの同時接続数 とするのをお忘れなく。 どれくらいが性能のピークかについては、Y-110さんが教えてくれている。 ちなみに、「PostgreSQL の中の人から直接聞いたので間違い無さそう」とのことなので、Postgresql 7系なら256で抑えておくのがよさそう。 PostgreSQL:チューニング勘所 – Y-110’s Wiki

max_connections
7系では 256 あたりが性能のピークのようです。*2
最大でも 512位にとどめておいたほうが良いのではないかと。
8系では 1000程度でもそれほど性能は落ちないようです。
特に 8.1 ではバッファマネージャの根本的な改良を行っており, 同時接続時の処理性能が大幅に向上しています。
サーバに積んでいるメモリを考慮した上で, max_connections はスワップしない程度に抑えてください。
接続時に消費する最大メモリの見積もりは, 以下の式で算出できます。

postmaster のサイズ × max_connections

以下、参考までに。
http://canalize.jp/archives/008035.php
より詳しく知りたい方はこちらへ

スポンサーリンク
レクタングル(大)広告
  • このエントリーをはてなブックマークに追加
スポンサーリンク
レクタングル(大)広告

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です