Mysqlサーバーに接続するWebアプリにストレステストを挿入し、mysqlのshowprocesslistを監視しています。
負荷が高い場合(スワップI/Oが高い場合)、次のような多くのプロセスが発生します。
| 97535 | db| localhost | userA | Sleep | 515 | | NULL
| 97536 | db| localhost | userA | Sleep | 516 | | NULL
| 97786 | db| localhost | userA | Sleep | 343 | | NULL
| 97889 | db| localhost | userA | Sleep | 310 | | NULL
しかし、なぜ彼らはまだそこにいて殺されていないのか理解できませんか?これにより、最終的にすべてのmax_connectionsを使用するアプリが作成され、着信リクエストの処理が停止します...
それらのプロセスは何であり、そこで何をしているのか、何か考えはありますか:)?
これらは、クライアントによって保持されているアイドル接続です。使用しているクライアントライブラリ(JDBC、...)が、未使用の接続を長時間開いたままにしないように構成されていること、またはクライアント数*接続数が大きすぎないことを確認する必要があります。
私の推測では、持続的接続を使用していると思います。 pconnect PHPで:
[..]接続するとき、関数は最初に、同じホスト、ユーザー名、およびパスワードですでに開いている(永続的な)リンクを見つけようとします。見つかった場合、新しい接続を開く代わりに、その識別子が返されます
そして
[..]スクリプトの実行が終了しても、SQLサーバーへの接続は閉じられません。代わりに、リンクは将来の使用のために開いたままになります
私も同様の状況にあり、pconnectをオンにしてCodeigniterを使用していました。それをオフにした後( 方法を参照 )、使用後にすべての接続が適切に閉じられ、MySQLプロセスリストが空になりました。
パフォーマンス:上記はパフォーマンスについては議論していませんが、MySQLで多くのスリープ接続が表示される理由を説明しようとしています。接続をアクティブなままにしておくことは、パフォーマンスに関してはマイナスではないかもしれません。詳細情報: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/