閉じられていないMySQL接続を開くPHPコードを判断する方法
-
10-07-2019 - |
質問
いくつかの市販のPHPアプリケーション(ExpressionEngineおよびXCart)と独自のカスタムコードで構成されるアプリケーションがあります。
実際の分析を行っていないため、どのように決定されたか正確にはわかりませんが、閉じられていないMySQL接続が多すぎることを聞いても驚くことではありません開発サーバーでは、最初の起動時に100 MBから開始して1日または2日かけて、RAMのギグ全体が消費され、キャッシュされることはほとんどありません。
では、どのPHPコードが犯人であるかを正確に判断するにはどうすればよいでしょうか? XDebugの以前の経験があり、独立したステージング環境が適度に安定したら、devにXDebugを改造し、それを使用して分析を行うことを提案しました。これは合理的ですか、および/または他の誰かがより具体的および/または追加の提案を持っていますか?
解決
使用できます
SHOW PROCESSLIST
実行中のプロセスを確認するSQLコマンド。これにより、各プロセスで使用されているユーザー名、ホスト、データベースなどがわかります。これにより、特にアクセスしているデータベースが多数ある場合に、何が起こっているのかがわかります。
詳細: http://codeinthehole.com/archives/2- Monitoring-MySQL-processes.html
他のヒント
mysql接続は自動的に閉じられるはずなので、これはphpコードが原因ではありません。
cf: http://www.php.net/manual/function .mysql-connect.php :
サーバーへのリンクは閉じられます スクリプトの実行と同時に で閉じられない限り、終了します mysql_close()を明示的に呼び出します。
いくつかの提案:
- 開発者は、技術的に実稼働mysqlサーバーに直接アクセスできますか?はいの場合は、MySQLマネージャーを開いたままにしている可能性があります:)
- 毎日のバッチ処理がありますか?はいの場合、メモリ内にゾンビプロセスがある可能性があります
PHPは、ページが終了するとmysql接続を自動的に閉じます。 PHP Webアプリケーションに閉じられていないmysql接続が多すぎる唯一の理由は、1)接続プーリングを使用している、または2)mysqlサーバーまたはコネクタにバグがあることです。
ただし、コードを見て接続先を確認する場合は、 http:// xdebugを参照してください。 org / docs / profiler
他の人が言ったように、PHPは mysql_connect
または同等のmsqli / PDOで作成されたMySQL接続を終了します。
ただし、 mysql_pconnect
を使用して永続的な接続を作成できます。開いている既存の接続を探して使用します。見つからない場合は、新しいものを開きます。一度に多くのリクエストがあった場合、接続の負荷が開き、開いたままになる可能性がありました。
接続の最大数を減らすか、永続的な接続のタイムアウトを下げることができます。詳細については、 manページの下部にあるコメントを参照してください。詳細。
以前は、スレッド数についてSHOW STATUSをポーリングするスクリプトを実行していましたが、mysql_pconnectを使用すると常にスレッド数が多くなることがわかりました。接続速度が実際に低下しているのがいつかわからなかったので、私は非常に当惑しました。そのため、mysql_connect()が呼び出されたすべての場所を一元化し、mysql_pconnect()を削除するようにしました。
次に行ったのは、接続タイムアウトを調べて、30秒程度に調整したことです。そこで、my.cnfを
で調整しましたconnect-timeout = 30
そのため、実際に接続数が減少するのを見ることができました。開く必要がある接続の数を決定することは、実行しているapacheワーカーの数と、それぞれが開くデータベース接続の数に依存します。
私が始めたもう1つのことは、クエリをSHOW PROCESSLISTまたはmytopで見つけるためにクエリにメモを追加することでした。次のようなメモ列を結果に追加します。
$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";
mytopを見ると、クエリを発行するファイルが表示され、MySQLクエリキャッシュを使用するように失敗しませんでした
/* __FILE__.'.'.__LINE__ */
クエリの開始時に。
一般的なメモリの問題に関して、特にMySQLとは対照的に、特にカスタムコードのコンテキスト内でできることは、コードを1つまたは複数の呼び出しでラップすることです次のPHP組み込み関数のその他:
特に、現在いくつかのカスタムコードからのロギングに取り組んでいるので、作業中にメモリ使用量を記録できます