私はlinodeサーバーでアプリケーションPHPlistを実行しています。同時に12個のPHPスクリプトを実行しています。それぞれがMySQL接続を開きます。PHPlistにアクセスすると、このエラーが頻繁に表示されます。
致命的なエラー:サーバーは現在ビジー状態です。しばらくしてからもう一度お試しください。
PhpMyAdminにアクセスしようとすると、#1040エラーが表示されます。 my PHP cron
ジョブを実行するスクリプトの出力は次のとおりです。
PHP警告:mysqli_connect():(HY000/1040):接続が多すぎます
私はサーバーのLAMPスタックをphpMyAdminで使用しています。端末のtop
出力は、100-130%のCPUを使用しているmysqld
を示しています。この問題をトラブルシューティングしようとしたときに、いくつかの手掛かりが得られました。
設定する変数はたくさんありますが、特定の変数を特定することはできません。以下から参照を取得しています: too many connections および http://dev.mysql.com/doc /refman/5.5/en/table-cache.html
しかし、私の使用法によると、メモリを増やす方法と、私にとって難しい最大メモリは何ですか.
私のサーバーでは、約12 PHPスクリプト、メール送信用のPHPlistアプリケーション、およびユーザー登録用の主要なデータベースを使用しています。
この問題の解決を手伝ってください。
まず、次のクエリを実行する必要があります。
SELECT user,Host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',Host) <> 'root@localhost';
SUPER特権 を持つすべてのユーザーがリストされます。アプリケーション関連のDB処理を行うほとんどのユーザーには、この特権は必要ありません。 MySQL Documentation によると、SUPER権限を持つユーザーは次のことができます。
mysqladmin kill
他のアカウントに属するスレッドを強制終了しますRoot @ localhostとしてログインし、次のようにSUPER権限を取り消す必要があります。
UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',Host) <> 'root@localhost';
FLUSH PRIVILEGES;
これを行うと、すべてのユーザーがmysql接続をフラッディングするときは常に、root@localhost
はログインできます。結局のところ、みんなと彼の祖母がSUPER特権を持っていれば、これはroot@localhost
誰よりも先に接続することから。 max_connectionsが200であり、mysqldを再起動せずに300に上げる必要がある場合は、動的に max_connections を増やすことができます。このコマンドで:
mysql> SET GLOBAL max_connections = 300;
これにより、より多くの接続がすぐに有効になりますが、気まぐれに任意に数を増やすだけではありません。 mysqlが増加に対応するのに十分なRAM=であることを確認する必要があります。
警告:max_connectionsを動的に300に変更する場合は、/ etc/my.cnfに配置してください
[mysqld]
max_connections=300
MySQL DBサーバーでmysqltuner.plを実行できます。それがない場合は、次を実行します。
cd
wget mysqltuner.pl
Perl mysqltuner.pl
パフォーマンスメトリックの下の3行目には
-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)
スレッドあたり5.4Mを参照してください。これはmax_connectionsで乗算されます。この例では、最大で約10.8GのRAMになります。したがって、max_connectionsを増やすたびに、mysqltuner.plを実行して、OSにメモリを押しすぎていないかどうかを確認する必要があります。
いずれの場合も、SUPER権限を持つユーザーを制限することで、mysqldのDB接続によるフラッディングを軽減する機会がそのようなユーザーに与えられます。
max_connections
は、MySQLへの同時接続の最大数を決定します。この変数の値が高いことを確認してください。この値を300または400に増やし、この設定の後でMySQLを再起動してみてください。また、MySQlサーバーでFlush status;
コマンドを実行して、この値を減らします。
これらの提案がお役に立てば幸いです。
ディスクがいっぱいかどうかを確認します。これにより、同じエラーが発生する可能性があります。
df -h
各パーティションの残りのスペースが表示されます。おそらくルートパーティションを確認する必要があります/
(または、これに追加のパーティションがある場合は/ var /):
df -h /