MySQL 8.0 のメモリ消費の詳細な分析

MySQL 8.0 のメモリ消費の詳細な分析

MySQL 8.0 を起動すると、データベースのパフォーマンスを向上させるためにさまざまなバッファとキャッシュが構成されます。サーバー上で MySQL 8.0 サービスを構成すると、このサーバーのメモリは、オペレーティング システム、MySQL 8.0 サービス、およびその他のアプリケーションによって同時に共有されます。

実稼働環境では、メモリ アラームが頻繁に発生します。これらのアラームを処理する前に、MySQL 自体が最も多くのメモリを消費している場所を把握する必要があります。これにより、MySQL サービスが占有するメモリの量をより直感的に判断し、MySQL 自体のメモリ消費量を削減する方法を判断できます。

MySQL 構成ファイルで最もよく使用される 2 つのメモリ関連のパラメータは、innodb_buffer_pool_size と innodb_log_buffer_size です。これら 2 つのパラメータについて見てみましょう。

1. innodb_buffer_pool_size

このパラメータは、皆さんもよくご存知のバッファプールのサイズを定義します。バッファプールの内容には、InnoDB テーブル、インデックス、その他の補助バッファが含まれます。バッファプールのサイズは、MySQL システムのパフォーマンスに大きな影響を与えます。デフォルトでは、MySQL 8.0 で設定されているバッファプールのサイズは 128 MB です。通常、他の用途のない単一のマシンと単一のインスタンスである場合、MySQL の公式推奨事項では、システムメモリの 50% から 75% の間でサイズを設定します。もちろん、サーバーに他のアプリケーションを展開している場合は、メモリを解放するためにこの比率を適切に減らす必要があります。

オペレーティング システムに十分なメモリがある場合は、複数の InnoDB バッファ プール インスタンスを設定できます。次のパラメータを使用してインスタンスの数を調整できます。

mysql> '%innodb_buffer_pool_instances%' のような変数を表示します。
+------------------------------+-------+
| 変数名 | 値 |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1 |
+------------------------------+-------+
セット内の 1 行 (0.00 秒)

2. innodb_log_buffer_size

このパラメータは、InnoDB ストレージ エンジンが REDO ログをディスクに書き込む前にメモリにキャッシュされるデータの最大サイズを定義します。デフォルトは 16 MB です。この値を増やすと、大規模なトランザクションでは、トランザクションがコミットされる前に REDO ログをディスクに書き込む必要がなくなります。更新、削除、挿入操作が多数の行に影響する場合は、この値を増やすことを検討する必要があります。

ここでポイントは次のようになります:

オペレーティングシステムでは、MySQL が占有するメモリは、上記の 2 つのメモリ構成パラメータだけに関連するわけではありません。通常、MySQL が占有するメモリを計算するときは、次の 4 つの値を合計します。

1. innodb_buffer_pool_size

2. key_buffer_size (このパラメータは通常、myisam テーブルが占有するメモリのキーパラメータです)

3. max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) (これら 3 つは接続レベルのバッファです)

4. 最大接続数*2MB

したがって、top コマンドを使用して、MySQL が占有するメモリが innodb_buffer_pool_size をはるかに超えていることを確認する場合、考慮する必要があるもう 1 つの重要な要素は、接続数が制限を超えているかどうかです。接続数が多すぎると、上記の 2 つの部分 3 と 4 によって消費されるメモリが非常に大きくなります。

もちろん、上記は MySQL メモリを占有する主な要因です。また、その他のメモリ消費については、公式ドキュメントで確認できます。

メモリ使用率

上記のドキュメントでは、performance_schema を使用して MySQL のメモリ使用量を監視する方法も紹介しています。ここではプロセス全体について説明します。詳細な内容とパラメータの紹介については、公式ドキュメントを参照してください。

1. 表示

パフォーマンススキーマ.セットアップ_インストルメンツ

この表で、関心のあるメモリ変数の名前を見つけます (直接検索すると、490 件を超える結果がいくつかの主要カテゴリに分かれて表示されます。関心のあるパラメータを必ずフィルタリングしてください)。たとえば、InnoDB ストレージ エンジンによって占有されているメモリを表すメモリ/InnoDB 関連のパラメータを検索します。結果は次のようになります。

mysql> SELECT * FROM performance_schema.setup_instruments WHERE NAME LIKE '%memory/innodb%';
+------------------------------------------+---------+-------+-------------------+------------+---------------+
| 名前 | 有効 | 時間指定 | プロパティ | 揮発性 | ドキュメント |
+------------------------------------------+---------+-------+-------------------+------------+---------------+
| メモリ/InnoDB/アダプティブハッシュインデックス | はい | NULL | | 0 | NULL |
| メモリ/innodb/ログおよびページ アーカイバ | はい | NULL | | 0 | NULL |
| メモリ/innodb/buf_buf_pool | はい | NULL | グローバル統計 | 0 | NULL |
| メモリ/innodb/buf_stat_per_index_t | はい | NULL | | 0 | NULL |
| メモリ/innodb/クローン | はい | NULL | | 0 | NULL |
| メモリ/innodb/dict_stats_bg_recalc_pool_t | はい | NULL | | 0 | NULL |
| メモリ/innodb/dict_stats_index_map_t | はい | NULL | | 0 | NULL |
| メモリ/innodb/dict_stats_n_diff_on_level | はい | NULL | | 0 | NULL |
| メモリ/InnoDB/その他 | はい | NULL | | 0 | NULL |
| メモリ/innodb/パーティショニング | はい | NULL | | 0 | NULL |
| メモリ/innodb/row_log_buf | はい | NULL | | 0 | NULL |
| メモリ/innodb/行マージソート | はい | NULL | | 0 | NULL |
| メモリ/innodb/std | はい | NULL | | 0 | NULL |
| メモリ/innodb/trx_sys_t::rw_trx_ids | はい | NULL | | 0 | NULL |
| メモリ/innodb/undo::テーブルスペース | はい | NULL | | 0 | NULL |
| メモリ/innodb/ut_lock_free_hash_t | はい | NULL | | 0 | NULL |
| メモリ/innodb/api0api | はい | NULL | | 0 | NULL |
| メモリ/innodb/api0misc | はい | NULL | | 0 | NULL |
| メモリ/innodb/btr0btr | はい | NULL | | 0 | NULL |

2. 構成ファイルに関連するパラメータを記述し、統計を有効にします。memory/innodb/row_log_buf を例にとると、構成ファイルは次のように変更されます。

パフォーマンス スキーマ インストルメント = 'memory/innodb/row_log_buf=COUNTED'

3. インスタンスを起動し、performance_schema データベースの memory_summary_global_by_event_name テーブルでメモリ統計を表示します。

SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/innodb/row_log_buf'\G

もちろん、次のように sys テーブルの結果に基づいて各カテゴリの集計結果を表示することもできます。

mysql> SELECT SUBSTRING_INDEX(イベント名,'/',2) AS
  コード領域、FORMAT_BYTES(SUM(current_alloc))
  AS 現在の割り当て
  sys.x$memory_global_by_current_bytes から
  GROUP BY SUBSTRING_INDEX(イベント名,'/',2)
  ORDER BY SUM(current_alloc) DESC;
+---------------------------+---------------+
| コード領域 | 現在の割り当て |
+---------------------------+---------------+
| メモリ/innodb | 843.24 MiB |
| メモリ/パフォーマンス スキーマ | 81.29 MiB |
| メモリ/mysys | 8.20 MiB |
| メモリ/sql | 2.47 MiB |
| メモリ/メモリ | 174.01 KiB |
| メモリ/myisam | 46.53 KiB |
| メモリ/ブラックホール | 512 バイト |
| メモリ/フェデレーション | 512 バイト |
| メモリ/csv | 512 バイト |
| メモリ/vio | 496 バイト |
+---------------------------+---------------+

詳しい情報については、公式ドキュメントを参照してください。

上記はMySQL 8.0のメモリ消費の詳細な分析です。MySQL 8.0のメモリ消費の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明
  • MySQL メモリテーブルと一時テーブルの使用方法の詳細な説明
  • MySQL OOM (メモリオーバーフロー) の解決策
  • MySQLのメモリ使用量を表示する方法の詳細な説明
  • MySQLの一般的なメモリ不足による起動失敗に対する完璧な解決策
  • MySQL のメモリ使用量と CPU 使用率が高い場合のテストと解決策
  • MySQL 5.6 の起動時にメモリ使用量が高くなる問題の解決方法
  • MySQL本番データベースの異常なメモリ増加のトラブルシューティングのプロセスを共有する

<<:  Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

>>:  Webデザイン: タイトルが完全に表示できない場合

推薦する

Vueタイマーの詳細な使い方

この記事では、参考までにタイマーを実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

Windows 10 の Docker で countly-server を展開して実行するプロセス

私は最近countlyに触れて、慣れてきました。私は、必要に応じてcountlyのクラッシュプラグイ...

Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策

目次シナリオ解決してみる解決するシナリオ今日、コンポーネントの双方向データバインディングにv-mod...

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

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

要素 DateTimePicker+vue ポップアップボックスに時間のみが表示される問題を解決する

3つの知識ポイント: 1. CSS子孫セレクターhttps://www.w3school.com.c...

Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする

サーバーにはNginx、データベースサポートにはMongo、Python言語のWebフレームワークに...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

Vue カスタム オプション時間カレンダー コンポーネント

この記事の例では、参考のためにvueカスタムオプションタイムカレンダーコンポーネントの具体的なコード...

MySQL無料インストール版のパスワード設定に関する詳細なチュートリアル

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

Vueモバイル端末は左スライド編集と削除の全プロセスを実現します

序文プロジェクトのニーズに応じて、Vue-touch を使用して、vue モバイル端末の左スワイプ編...

HTMLタグと基本要素の学習のまとめ

1. HTML の要素とタグ<br />要素は、1 つのタグまたは 1 組のタグによって...

MybatisはSQLクエリのインターセプションと変更の詳細を実装します

序文インターセプターの機能の 1 つは、特定のメソッドの呼び出しをインターセプトできることです。イン...

MySQLクエリのパフォーマンスに影響を与える大きなオフセットの理由と最適化の詳細な説明

序文MySQL クエリは select コマンドを使用し、limit および offset パラメー...

MySQLがbinlogファイルを手動で登録し、マスタースレーブ異常を引き起こす理由

1. 問題の原因友人の @水米田 から、POSITION に基づくマスタースレーブについて質問があり...