質問: レンタルサーバの負荷テストのため、800 PV/秒のアクセスでシミュレーションを行ったのですが、毎回ある程度秒数(30秒程度)が経ったところで、MySQL接続エラーが発生してしまいます。 ※負荷テストの実行時間を15秒程度にした場合は問題は発生せず。 アクセスしているファイルはPHPで、処理としてはPDOを使ってMySQLに接続するのみとなります。 ※SELECT文の実行はなし 接続エラーとなる原因としては、どのようなことが想定されますでしょうか? サーバは落ちておらず(ロードアベレージも20%程度)、MySQLのみがダウンするのですが、 この場合、改善の見込みはありますでしょうか? (my.cnfの設定値の見直しが必要でしょうか?) なお、試しにDBのみAWSのRDSに接続する設定にして、 同じ処理を試したのですが、同じく30秒くらいでダウンしてしまいました。 インスタンスはdb.m6g.4xlargeでしたので、恐らくスペック的には 申し分が無いと思うのですが、レンタルサーバ側で最大実行回数の制限などが 働いていると考えたほうが良いでしょうか?
回答: 評価観点が足りていません。 * DBアクセス実行側、DB側のプロセス実行状況 * DBアクセス実行側のリソース状況。 (CPU メモリ) * DBアクセス側のコネクションプールの利用状況 * DBリソース状況、コネクション数の情報 は最低限見ておきたいものです。シミュレーションでとおっしゃっていますが、前段にWebサーバをたててそこにHTTP投げているのなら、そこのセッション数なども見ておかないとまったくわかりません。 エスパーで恐縮ですが、私なら以下の順で疑います。 * 接続側のコネクションプール枯渇(セッションを解放していない) * 接続先のコネクション枯渇(無限にリソースないので通常上限を設けます) * 時点でリソース枯渇と前段のセッション制限 普通に考えて、コネクション数って**キャパシティプランニングの重要な要素**になるぐらいリソースインパクトでかいので、どこかで必ず制限しなければなりません。なので、アプリケーション側で適切な管理(ふつうはミドルに丸投げ)しないとすぐに溢れます。これをやっていないと、さくっと受け側でも送り側でもプロセス死にそう。。ちなみに大規模なシステム程、接続数の上限を問い合わせ側のミドルで設けて、そこで待ち合わせさせるようにします。シミュレータとのことで秒800件でダイレクト接続してません?だとすればかなーーーーーーーーり厳しいと思いますけど、システム設計としてそれで大丈夫なんですか? たとえば、PHPが動くミドルのDBのコネクションプールから接続させずにPDOに接続先直接書いている場合が該当しそうですが、そりゃあふれるよなと思うのです、そんなことはされていないでしょうが、文面だけみるとそれを想定できるので。。。