1. CPU の問題を特定する
CPU 使用率が 100% まで上昇した場合は、まず OS の top コマンドを使用して mysqld の占有が原因かどうかを確認し、そうでない場合は占有率が高いプロセスを見つけて対処します。
2. スロークエリログを確認する
mysqlコマンドラインを入力してください
mysql -h主机地址 -u用户名 -p用户密码
スロークエリ SQL が有効かどうかを確認します。ON は有効、OFF は無効です。
「log_slow_queries」のような変数を表示します。
スロー クエリ ログを開くには、
global log_slow_queries = on を設定します。
3. show processlist を使用して実行中のスレッドを表示します
mysqld が原因の場合、show processlist はユーザーの実行中のスレッドを表示し、その中の実行中のセッションをチェックして、リソースを消費する SQL が実行されているかどうかを確認します ([時間] 列の最大値を確認します)。消費量の多い SQL を見つけて、実行計画が正確かどうか、インデックスが欠落していないか、データ量が多すぎるかどうかを確認します。
show processlist
状態フィールドに大量の送信データ、テーブルの待機、またはさまざまなロックが含まれている場合、SQL がデータベースの輻輳を引き起こす可能性が高いことに注意してください。対応する SQL を最適化し、低速クエリ ログを有効にし、最適化のために SQL ステートメントを分析します。
一般に、(CPU 使用率が低下するかどうかを観察しながら) これらのスレッドを強制終了し、対応する調整 (インデックスの追加、SQL の変更、メモリ パラメーターの変更など) を行った後、これらの SQL を再度実行する必要があります。
また、各 SQL はそれほどリソースを消費していないのに、突然大量のセッションが接続され CPU が急増する可能性もあります。この場合、アプリケーションの接続数がなぜ急増するのかを分析する必要があります。接続数を制限するなど、対応する調整を行ってください。
リソースを悪用するプログラムのブロック: Web サイトが攻撃を受けると、短期間に異常に多くの接続が確立される可能性があります。MySQL の PROCESSLIST を使用すると、上位ユーザーを検出し、不正な接続へのアクセスをブロックできます。
4. 多数のスリープスレッドにより CPU の負荷が高くなりすぎる
完全なプロセスリストを表示するを実行します
[1] コマンド欄を見ると大量のSleepが見つかった
[2] [時間] 列に従って、現在のスリープ スレッドの SQL に費やされた時間を確認します。
[3] SQLスリープスレッドの所要時間に合わせてmsyqlを設定する
[4] mysql設定ファイルmy.cnfファイルを開く
構成は次のとおりです。
vim /etc/my.cnf
[mysqld]
wait_timeout=20 ## 20 秒以上自動的に切断し (実際の状況に応じて設定)
、設定完了後に Mysql を再起動します。再起動しない場合は、グローバル待機タイムアウト時間を設定できます
mysql> set global wait_timeout=20;
mysql> show global variables like '%timeout';
5. 構成項目の合理的な最適化
MySQL 設定を確認すると、メモリ使用量を特定し、適切な値を MySQL に割り当てることができます。キャッシュは、InnoDB に保存されているバッファー プールで行われます。バッファ プールのサイズはシステム パフォーマンスにおいて重要な役割を果たし、利用可能な RAM の 50% ~ 70% の値として指定されます。プールが十分に大きい場合はページの過剰なフラッシュが発生し、大きすぎる場合はメモリ競合によるスワップが発生します。
innodb_buffer_pool_size
max_connections いつでも MySQL にできるだけ多くの接続を割り当て、単一のユーザーによるサーバーの過負荷を回避するには、max_connections を使用する必要があります。各スレッドはバッファ割り当てに RAM の一部を使用するため、RAM のサイズに基づいて最大接続数が制限されます。
max_connections = (使用可能な RAM - グローバル バッファー) / スレッド バッファー 最大接続数 = (使用可能な RAM - グローバル バッファー) / スレッド バッファー クエリ キャッシュは、頻繁に変更されず、
Web サーバーが多数の同一のクエリを受信する場合に役立ちます。クエリ キャッシュには、クライアントに送信された対応する結果とともに SELECT ステートメントのテキストが保存されます。
したがって、 query_cache_size
このパラメータはそのようなアプリケーション サーバーにのみ使用され、それ以外の場合は無効になり、他のサーバーではゼロに設定されます。
リソースの競合を回避するには、この機能が有効になっているにもかかわらず、この値を最小値約 10MB に設定する必要があります。