現在、スリープ状態の接続が 100 を超えています。
一部の接続は永続的な接続であるため、スリープ状態を維持する必要があります(閉じないでください)が、他の一部(別のユーザー名を持つ)は一部のphpスクリプトからのものであり、非常に高速にタイムアウトする必要があります。
ユーザーごとに wait_timeout を設定することは可能ですか? はいの場合、どのように?
ユーザーごとのタイムアウト設定はありませんが、wait_timeout
値を動的に設定できます。つまり、特定のユーザーとして接続を確立した後、ステートメントを発行して、タイムアウト値をそのユーザーのセッションに必要な値に変更できます。
mysqlコマンドラインクライアントで次の実験を試してください。
mysql> SHOW VARIABLES LIKE 'wait_timeout';
...デフォルトの28800(つまり、8時間)を表示しますwait_timout
。
mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';
...60を示しています。
その後、セッションを終了して再接続すると、デフォルトwait_timeout
は28800になります。したがって、現在のセッションのスコープに制限されます。
wait_timeout
2番目のウィンドウを開いて別のmysqlクライアントセッションを開始し、1つのセッションでの変更が他の同時セッションに影響を与えないことを証明することもできます。
次の変数を設定する必要がありますmy.conf
:
[mysqld]
interactive_timeout=180
wait_timeout=180
wait_timeout
自動接続のタイムアウトです(私の意見では、Webサーバーで30を超えると多すぎます)。アイドルセッション
interactive_timeout
のコンソールインタラクションタイムアウトです。
wait_timeout
別の可能性: MySQL は、非対話型クライアント用と対話型クライアント用の2 つの異なるタイムアウト変数をサポートしてinteractive_timeout
います。
対話型クライアントと非対話型クライアントの違いはCLIENT_INTERACTIVE
、接続時にオプションを指定したかどうかだけのようです。
mysql_real_connect()
何らかの方法でそのオプションをclient_flag
パラメーターに渡す必要があるため、これが役立つかどうかはわかりません。使用している言語またはインターフェイスがわからないため、この接続フラグを指定できるかどうかはわかりません。
とにかく、そのクライアントフラグを渡すことができ、2つの異なるタイプのユーザーのみが必要な場合は、MySQLサーバー構成wait_timeout
でinteractive_timeout
異なる方法で構成し、特定のセッションをすぐにタイムアウトさせたいときに短い値を持つ方を使用できます.
http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html
pt-kill を使用して、ユーザーごとに接続を強制終了することができます。これをスケジュールするか、これを処理するバックグラウンド ジョブを設定できます。
テーブルを確認しましたmysql.user
が、そこに設定があるようには見えません:
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | | |
| x509_issuer | blob | NO | | | |
| x509_subject | blob | NO | | | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.00 sec)
MySQLi を使用しているか PDO を使用しているかに応じて、PHP MySQL 接続は、要求が発生したときにハングアップするか、Apache プロセスのプールで共有される必要があります。
たとえば、PDO で永続的な接続をオフにするには (これがデフォルトだと思います)、DB に次のように接続します。
$pdo = new PDO($dsn, $user, $pass, Array(PDO::ATTR_PERSISTENT => false));
スクリプトで永続的な接続を使用したいが、スリープ モードでデータベースに対して開かれている接続が多すぎる場合は、Apache のMaxServers
、MaxSpareServers
、MinSpareServers
および を構成してStartServers
、不要なときに多くの接続が滞らないようにすることを検討する必要があります。