私は簡潔にしようとしますが、それでも完全です。貴重な時間を費やして可能な解決策を教えてくれた人たちに、事前に感謝します。
Ubuntu 環境の PHP/Mysql アプリケーション。
元の問題:
Keep getting error 'to_many_connections'.
私がチェックするとき:
show processlist;
多くの睡眠プロセスがあります。したがって、それらが新しい着信接続をブロックするため、それらが to_many_connections エラーの原因であると考えました。
mysql 設定の変更:
Raise max_connections from 250 to 400;
lower wait_timeout from 60 to 15;
接続は機能しているように見えましたが、現在、Apache がメモリを大量に消費しています。この 2 つの設定を変更するだけで、11G から 25G 以上になりました。150 個の追加の mysql_connections が 14G の余分なメモリを消費するとは想像できませんか? また、Apacheのメモリ使用量を増やすためにwait_timeout設定を低くするとは思わないでしょう。より少ないメモリを使用するため、メモリ内の接続を少なくする必要がありますか? プロセスの使用率が上がると予想していましたが、メモリはそうではありませんでした。そして確かに、それらの膨大な量ではありません。
mysql設定を再試行しました:
keep max_connections at 400
raise wait_timeout to 30 sec
メモリ使用量は約 5 分間低下しましたが、その後再び上昇しました。
その他の注意事項:
特定のテーブルに対してロックされたプロセスがたくさんあることに気付きました。(mysql: show processlist;) 更新:テーブルは MyISSAM テーブルです。
また、いくつかのデータベースの実装を変更しましたが、これは理想的ではありません。コードのリファクタリングの段階にあるため、一部のページではデータベースへの 2 つの接続を使用しています。mysql_query 機能から PDO 機能への切り替え
アップデート:
新しい pdo 機能には、永続的な接続が明示的に false に設定されています (デフォルトは false ですが)。古い mysql 機能も永続的な接続を使用しません。
public function __construct($dbname, $username, $password) { parent::__construct('mysql:hostname=localhost;dbname=' . $dbname . ';', $username, $password, array( PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;" )); }
データベースに複数の接続を確立することがベスト プラクティスとはほど遠いことは承知していますが、現在のアプリケーションには多くのデザイン パターンが欠けており、すべてがまだ手続き型であり、mvc も OOP もありません。私の雇用主は結果を望んでおり、現時点では、アプリケーションを完全に書き直して、かなり前に実装されるべきであった設計/コーディング標準を使用するつもりはないため、私はこの種の慣行を行う義務があります. いずれにせよ、このコードが実際の原因であるとしたら、私は驚くでしょう。なぜなら、このコードは 1 週間以上完璧に動作しており、バーゲン期間 (1 か月の巨大なバーゲン/取引当店で)。
この問題についての洞察は大歓迎です。この時点で、これを解決するための次のステップが何であるかはわかりません。
update2 は問題が見つかったためクローズされましたが、元の投稿とは何の関係もありませんでした。