MySQL データベースの CPU が 100% のソリューションに急上昇

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 に設定する必要があります。

おすすめ

転載: blog.csdn.net/t707584896/article/details/129971047