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プロジェクトでXSS攻撃に遭遇した実体験

目次序文原因を発見するカスタムフィルタリングルール要約する序文インターネットの急速な発展に伴い、情報...

MySQLは文字列関数のSQL文をインターセプトします

1. left(name,4)は左の4文字をインターセプトしますリスト: SELECT LEFT(2...

JavaScript フロー制御 (ループ)

目次1. forループ2. 二重の for ループ3. whileループ4. dowhileループ5...

Docker は固定コンテナ IP アドレスを実現するためにカスタム ネットワークを作成します。

デフォルトのブリッジ ネットワークのため、コンテナーを再起動すると IP アドレスが変更されます。シ...

一般的な JavaScript 文字列メソッド 28 個と使用方法のヒントのまとめ

目次序文1. 文字列の長さを取得する2. 文字列の指定された位置の値を取得する(1) charAt(...

process.env.NODE_ENV 本番環境モードを設定する方法

始める前に、process.env.NODE_ENV にはデフォルトで開発と本番の 2 つの状態しか...

CSS3 を使用した SVG パス ストロークのアニメーション化入門チュートリアル

JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...

Node.jsがES6モジュールを処理する方法の詳細な説明

目次1. 2つのモジュールの違い2. Node.jsとの違い3. CommonJSモジュールの読み込...

HTMLテーブルの詳細な説明

機能: データ表示、テーブルアプリケーションシナリオ。 <table> テーブル<...

doctype のマークアップ検証

しかし最近、この方法を使用すると問題が発生することがわかりました。コードを参照してください。コードを...

MySQL 8.0 アップグレード体験

目次序文1. まず、既存のバージョンの MySQL を完全にアンインストールします。 2. deb ...

vue keep-alive の簡単な概要

1. 機能主にコンポーネントの状態を保持したり、再レンダリングを回避したりするために使用されます。 ...

CSS3は赤い封筒を振る効果を実現します

赤い封筒の揺れ効果を実現するには要件があります。これまでやったことがないので、記録しておきます。ヘヘ...

Tomcat のセッションと Cookie の詳細な説明

序文HTTP はステートレスな通信プロトコルです。各リクエストは互いに独立しており、サーバーは以前の...

Mysql の mysql.user ユーザー テーブルの詳細な説明

MySQL は、異なるユーザーに異なる権限を割り当てることができるマルチユーザー管理データベースであ...