4

2つのアプリケーションサーバーと1つのデータベースサーバーでMySQLとPHPを使用しています。ユーザー数の増加に伴い(現在は約1000)、次のエラーが発生します。

SQLSTATE[08004] [1040] Too many connections

パラメータmax_connections1000inに設定され、inmy.cnfmysql.max_persistent設定さ-1php.iniます。

MaxClientsapacheパラメーターが750に等しく、2つのアプリケーションサーバーがあるため、一度に実行されるapacheプロセスは最大で1500です。

  • ここmax_connectionsに示されているように、を1500に上げる必要がありますか?
  • またはmysql.max_persistent、750に設定する必要があります(データベースサーバーはアプリケーションサーバーと同じではないため、パフォーマンス上の理由から永続的な接続でPDOを使用します)。
  • それとも私は何か他のものを試すべきですか?

前もって感謝します!

4

2 に答える 2

3

接続が十分に速く閉じられておらず、デフォルトの時間に達するまでスタックしていると思います. 私は同じ問題を抱えていましたが、wait_timeout を使用して問題を解決しました。

my.cnf でセットアップを試すことができます

set-variable = max_connections=1000 // max connection
set-variable = max_user_connections=100 // max user connection per hour
wait_timeout = 60 // wait timeout for connection in seconds

as は、60 秒が経過した後に既存の接続を終了します。

于 2010-05-24T09:02:48.220 に答える
1

永続的な接続を取り除くことができる場合は、PHP コードを確認する必要があると思います。

永続的な接続の問題は、スクリプトが終了した後でも、データがクライアントに送信され、php インスタンスが次の顧客に解放されるまで、php インスタンスがそれらを開いたままにすることです。

永続的な接続に関するもう 1 つの問題は、一部の PHP コードが、起動時とは異なる設定、異なるロケール、または一時テーブルを使用してソケットを離れる可能性があることです。

すべての接続に対して 1 つまたは少数の mysql_connects のみが存在し、データベース ハンドルがコードのさまざまな部分に渡されるか GLOBAL に保持されるようにコードを書き直すことができれば、永続的な接続が失われた場合のパフォーマンスへの影響は無視できます。

もちろん、max_connections を 2 倍にしても害はほとんどありません。いずれにせよ、PHP/Apache の子プロセスは非常に頻繁に終了し、ハンドルを閉じるため、PHP ではあまり役に立ちません。max_connections は、他の環境でより役立ちます。

于 2010-10-07T14:44:48.170 に答える