MySQL の CPU 負荷が高い問題のトラブルシューティング

MySQL の CPU 負荷が高い問題のトラブルシューティング

MySQL による CPU 負荷の上昇

今日の午後、MySQL によってサーバーの負荷が高くなる問題を発見しました。この問題の背景は次のとおりです。

新しいサーバーに、新しい MySQL インスタンスが作成されました。サーバー上の MySQL プロセスは 1 つしかありませんでしたが、CPU 負荷は高いままでした。top コマンド クエリの結果は次のようになりました。

[dba_mysql@dba-mysql ~]$ トップ 
トップ - 17:12:44 104 日、20 分、2 ユーザー、負荷平均: 1.06、1.02、1.00
タスク: 合計 218、実行中 1、スリープ中 217、停止中 0、ゾンビ 0
CPU0: 0.3%us、0.0%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU1: 0.3%us、0.0%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU2: 0.0%us、0.0%sy、0.0%ni、100.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU3: 0.3%us、0.0%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU4: 0.3%us、0.0%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU5: 0.0%us、0.0%sy、0.0%ni、100.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU6: 100.0%us、0.0%sy、0.0%ni、0.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU7: 0.0%us、0.0%sy、0.0%ni、100.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
メモリ: 合計 16318504k、使用済み 7863412k、空き 8455092k、バッファ 322048k
スワップ: 合計 5242876k、使用済み 0k、空き 5242876k、キャッシュ済み 6226588k

  PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド                                     
 75373 mysql 20 0 845分 699分 29分 S 100.0 4.4 112256:10 mysqld                                     
 43285 ルート 20 0 174m 40m 19m S 0.7 0.3 750:40.75 領事                                      
116553 ルート 20 0 518分 13分 4200 S 0.3 0.1 0:05.78 ファルコンエージェント                                   
116596 誰もいない 20 0 143分 6216 2784 S 0.3 0.0 0:00.81 パイソン                                      
124304 dba_mysq 20 0 15144 1420 1000 R 0.3 0.0 0:02.09 トップ                                       
   1 ルート 20 0 21452 1560 1248 S 0.0 0.0 0:02.43 初期化

上記の結果から、8 コア CPU のうち、負荷が 100% になっているのは 1 つのコアのみで、他のコアはすべて 0% であることがわかります。CPU 使用率によるソートの結果からも、mysqld プロセスがより多くの CPU を占有していることが分かります。

この問題に遭遇したことは一度もありませんでした。最初に思ったのは、CPU リソースを常に占有している遅いクエリなど、ビジネス レベルの問題があるのではないかということでした。そこで、MySQL にログインし、show processlist を使用して現在のプロセスを表示しました。いくつかの更新操作を除いて、他の SQL ステートメントは実行されていないことがわかりました。そこで、スロー ログをもう一度確認してみたところ、スロー ログ内の SQL 文の実行時間が非常に短いことがわかりました。そのほとんどは、インデックスを使用していないことが原因でした。ただし、スキャンされたレコード数は非常に少なく、数百行しかありませんでした。ビジネス レベルでは問題がないように見えました。

ビジネス レベルの問題を排除したので、データベース レベルの問題を見てみましょう。バッファー プールを確認すると、値は次のようになります。

[email protected]:(なし) 17:20:35>>'%pool%' のような変数を表示します。
+-------------------------------------+----------------+
| 変数名 | 値 |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 5242880 |
| innodb_buffer_pool_dump_at_shutdown | オン |
| innodb_buffer_pool_dump_now | オフ |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | オフ |
| innodb_buffer_pool_load_at_startup | オン |
| innodb_buffer_pool_load_now | オフ |
| innodb_buffer_pool_size | 5242880 |
| thread_pool_high_prio_mode | トランザクション |
| スレッドプールの高優先度チケット | 4294967295 |
| スレッドプールアイドルタイムアウト | 60 |
| スレッドプールの最大スレッド数 | 100000 |
| スレッドプールオーバーサブスクライブ | 3 |
| スレッドプールサイズ | 8 |
| スレッドプールのストール制限 | 500 |
+-------------------------------------+----------------+
セット内の行数は 17 です (0.01 秒)

この結果から、バッファプールのサイズが 5M しかないことがわかります。これは間違いなく問題です。通常、オンライン環境のバッファプールは 1G 以上です。そこで、my.cnf 構成ファイルを確認したところ、このインスタンスが起動されたときに、innodb_buffer_pool_size 設定が 0M になっていることがわかりました。はい、その通りです。0M でした。ここで、別のパラメータについて言及する必要があります。innodb_buffer_pool_size のサイズは、innodb_buffer_pool_chunk_size のサイズと同じであることがわかります。チャンクの概念はメモリ ブロックです。つまり、バッファ プールが適用されるたびに、「メモリ ブロック」単位で適用されます。バッファ プールには複数のメモリ ブロックが含まれているため、バッファ プールのサイズはチャンク サイズの整数倍である必要があります。

innodb_buffer_pool_chunk_size の値自体は 5M なので、これを 0M に設定すると、サイズは自動的に 5M の倍数に設定され、innodb_buffer_pool_size の値は 5M になります。

バッファ プールの値は比較的小さいため、これを 1G に変更して、この問題が引き続き発生するかどうかを確認します。

[email protected]:(なし) 17:20:41>>グローバルinnodb_buffer_pool_size=1073741824を設定します。
クエリは正常、影響を受けた行は 0 行、警告は 1 件 (0.00 秒)
[email protected]:(なし) 17:23:34>>'%pool%' のような変数を表示します。         
+-------------------------------------+----------------+
| 変数名 | 値 |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 5242880 |
| innodb_buffer_pool_dump_at_shutdown | オン |
| innodb_buffer_pool_dump_now | オフ |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | オフ |
| innodb_buffer_pool_load_at_startup | オン |
| innodb_buffer_pool_load_now | オフ |
| innodb_buffer_pool_size | 1074790400 |
| thread_pool_high_prio_mode | トランザクション |
| スレッドプールの高優先度チケット | 4294967295 |
| スレッドプールアイドルタイムアウト | 60 |
| スレッドプールの最大スレッド数 | 100000 |
| スレッドプールオーバーサブスクライブ | 3 |
| スレッドプールサイズ | 8 |
| スレッドプールのストール制限 | 500 |
+-------------------------------------+----------------+
セット内の行数は 17 です (0.00 秒)

操作は上記の通りです。このようにして、バッファプールの値を 1G に変更します。設定した値は 1073741824 ですが、実際の値は 1074790400 になります。この理由は、上で述べたように、チャンクサイズ値の影響です。

この時点で、top コマンドを使用して CPU 使用率を観察します。

[dba_mysql@dba-mysql ~]$ トップ
トップ - 22:19:09 104 日、5:26、ユーザー 2 人、負荷平均: 0.45、0.84、0.86
タスク: 合計 218、実行中 1、スリープ中 217、停止中 0、ゾンビ 0
CPU0: 0.3%us、0.3%sy、0.0%ni、99.3%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU1: 0.3%us、0.0%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU2: 1.0%us、0.0%sy、0.0%ni、99.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU3: 1.0%us、0.0%sy、0.0%ni、99.0%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU4: 0.3%us、0.3%sy、0.0%ni、99.3%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU5: 0.3%us、0.0%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU6: 0.0%us、0.3%sy、0.0%ni、99.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
CPU7: 0.7%us、0.0%sy、0.0%ni、99.3%id、0.0%wa、0.0%hi、0.0%si、0.0%st
メモリ: 合計 16318504k、使用済み 8008140k、空き 8310364k、バッファ 322048k
スワップ: 合計 5242876k、使用済み 0k、空き 5242876k、キャッシュ済み 6230600k

  PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド                                     
 43285 ルート 20 0 174m 40m 19m S 1.0 0.3 753:07.38 領事                                      
116842 ルート 20 0 202分 17分 5160 S 1.0 0.1 0:21.30 パイソン                                      
 75373 mysql 20 0 1966分 834分 29分 S 0.7 5.2 112313:36 mysqld                                      
116553 ルート 20 0 670分 14分 4244 S 0.7 0.1 0:44.31 ファルコンエージェント                                   
116584 ルート 20 0 331分 11分 3544 S 0.7 0.1 0:37.92 python2.6                                    
   1 ルート 20 0 21452 1560 1248 S 0.0 0.0 0:02.43 初期化

CPU 使用率が下がっていることがわかります。偶発的な現象を防ぐために、バッファ プールのサイズを元の 5M の値に戻しましたが、以前の問題が再現しました。つまり、大きなバッファ プールを設定することは確かに解決策です。

この時点で問題は解決しましたが、この問題の背後にあるいくつかの事柄については考える価値があります。なぜバッファ プールが小さいと、CPU の 1 つの使用率が 100% になるのでしょうか。

ここで、考えられる原因の 1 つは、5M のバッファ プールが小さすぎるため、業務 SQL がデータを読み取るときにディスクと頻繁にやり取りすることになります。ディスク速度が比較的遅いため、IO 負荷が増加し、CPU 負荷が高くなりすぎます。1 つの CPU だけが比較的高い負荷を持ち、他の CPU はほぼ 0 である理由については、この問題を確認する必要がある可能性があります。知っている方がいらっしゃいましたら、お知らせください。

上記は、MySQL CPU 高負荷問題のトラブルシューティングの詳細な内容です。MySQL CPU 高負荷の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLデュアルマシンホットスタンバイと負荷分散の実装手順の詳細説明
  • パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法
  • MySQLで負荷分散を実装する方法
  • MySQL のロードバランサーとして nginx を使用する方法
  • OneProxy に基づいて MySQL の読み取り/書き込み分離と負荷分散を実装する
  • mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。
  • PythonはMySQLの読み書き分離と負荷分散を実装します
  • MySQLの高可用性負荷分散構成を実装するためのKeepalived+HAProxy
  • MySQLのインデックスによって引き起こされるCPU負荷の急増を分析する
  • MYSQLデータベース接続の負荷容量を迅速に増やす方法
  • 負荷分散機能を備えたMySQLサーバクラスタの導入と実装

<<:  js を使用して USB スキャナー データを取得する方法

>>:  Vueでフォーム検証を実装する方法

推薦する

vitrualBox+ubuntu16.04 python3.6 最新チュートリアルと詳細な手順のインストール

最近ディープラーニングを学ぶためにUbuntu+Python 3.6バージョンを使う必要があるため、...

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

JavaScriptはイベントリスナーをイベント委任にバッチで追加します。詳細なプロセス

1. イベント委任とは何ですか?イベント委譲: イベントバブリングの特性を利用して、子要素に登録すべ...

React Native JSIはRNとネイティブ通信のサンプルコードを実装します

目次JSIとはJSIの違いiOS で JSI を使用するiOS 設定RN側の構成jsはパラメータ付き...

Vue ルーターにパラメータを渡すときにページを更新するとパラメータが失われる問題に対処する方法

目次概要方法1: params経由でパラメータを渡す方法2: クエリを通じてパラメータを渡す方法3:...

曇り空のアイコン効果を実現する純粋な CSS

効果効果は以下のとおりです​実装のアイデアbox-shadow プロパティを使用して、複数の灰色の円...

Tomcat での jar のロードに関する異常な問題の分析と解決

現象の説明:プロジェクトでは、Springboot を使用して Web プロジェクトを開始します。起...

3Dカルーセル効果を実現するjs

この記事では、3Dカルーセル効果をjsで実装するための具体的なコードを参考までに共有します。具体的な...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

require/import キーワードを使用して v-for ループでローカル画像をインポートするいくつかの方法

目次問題の説明方法 1 (バックエンドが画像 URL を返す)方法 2 (フロントエンドで requ...

Dockerイメージを構築する2つの方法

目次既存のイメージからイメージを更新します。イメージを最初から構築する: Docker イメージ リ...

TypeScript での関数オーバーロード

目次1. 関数シグネチャ2. 関数のオーバーロード2.1 オーバーロードされたシグネチャは呼び出し可...

CSS3 変換遷移ジッター問題の解決

transform: scale(); スケーリングするとIEブラウザでジッターが発生します変換スケ...

クールな充電アニメーションを実現する純粋なCSS

CSS のみを使用してどのような充電アニメーション効果を作成できるかを見てみましょう。バッテリーを...

jQueryはマウスドラッグ画像機能を実装します

この例では、jQuery を使用してマウス ドラッグ イメージ機能を実装します。まず、ラッパーを設定...