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デザイン: タイトルが完全に表示できない場合

推薦する

nginx + fastcgi を使用して画像認識サーバーを実装する

背景ディープラーニング モデルの推論には、特定のデバイスが使用されます。マシンは、モデルの読み込み、...

Docker の MySQL コンテナのタイムゾーン問題の修正

序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...

デザイン理論: テキストの読みやすさと可読性

<br />少し前に、ビジネス上の必要性から、ラップトップに Souba をインストール...

SQL文のパフォーマンスを分析するための標準的な要約

この記事では、explain を使用して SQL ステートメントを分析する方法を紹介します。実際、イ...

MySQL 8.0.19 では、間違ったパスワードを 3 回入力するとアカウントがロックされるようになりました (例)

MySQL 8.0.19 では、間違ったパスワードを 3 回入力するとアカウントがロックされるよう...

JavaScript でドラッグ スライダー パズルの検証機能を実装します (html5、canvas)

導入:スライダー ドラッグ検証は現在、多くの場所で使用されています。週末に 1 つ作成しようと思い、...

MySQL データベースのアップグレードにおけるいくつかの「落とし穴」

商用データベースの場合、データベースのアップグレードは優先度が高く、バージョンアップのロードマップ、...

iframeをカプセル化するvueコンポーネントを開発する

目次1. コンポーネントの紹介2. コンポーネントの内部構造とロジック1. コード組織構造2. マッ...

ページのスクロールバーを無効にするには、overflow: hiddenを使用します。

コードをコピーコードは次のとおりです。 html {オーバーフロー: 非表示; }体{オーバーフロー...

CentOS での samba フォルダ共有サーバー構成の詳細な説明

1. はじめに最近、CentOS での開発には多くの不便があることがわかりました。Windows/M...

Navicat PremiumでSQLファイルをインポートする方法

今日、最終プロジェクトに取り組み始めましたが、今年はMySQLデータベースを使用したため、Navic...

複雑なウェブサイトのナビゲーションを簡素化

<br />ナビゲーション設計は構造設計における主要なタスクの 1 つです。ソフトウェア...

js SMS認証コード入力ボックスを手動で実装する

序文この記事では、私が手動で実装したフロントエンドの一般的な SMS 認証コード入力コンポーネントと...

Vue 仮想 DOM の問題について

目次1. 仮想DOMとは何ですか? 2. 仮想 DOM が必要な理由3. 仮想DOMはどのようにして...

ユーザーエクスペリエンスの要素またはWebデザインの要素

システムとユーザー環境の設計<br />Apple システムの成功は、そのシステム アー...