ホームページ  >  記事  >  データベース  >  チャット MySQL メモリ管理、メモリ アロケータ、およびオペレーティング システム

チャット MySQL メモリ管理、メモリ アロケータ、およびオペレーティング システム

coldplay.xixi
coldplay.xixi転載
2021-01-08 09:35:411890ブラウズ

チャット MySQL メモリ管理、メモリ アロケータ、およびオペレーティング システム

推奨 (無料): mysql ビデオ チュートリアル

ユーザーが何らかのソフトウェア (MySQL を含む) を使用しているときにメモリの問題が発生した場合、最初に反応はメモリリークです。この記事が示すように、常にそうとは限りません。

この記事では、メモリに関するバグについて説明します。

Percona サポートのすべての顧客はバグ修正を受ける資格がありますが、オプションは異なります。たとえば、上級 顧客には、パッチを適用したソフトウェアの公開リリースに先立って HotFix ビルドが提供されます。プレミアム顧客は Percona ソフトウェアを使用する必要さえありません。当社のパッチをアップストリームに移植する場合があります。ただし、Percona 製品の場合、すべてのサポート レベルが修正を行う権利を持っています。

すべての Percona サポート顧客 すべては、バグ修正の対象となりますが、異なるオプションもあります。たとえば、VIP 顧客はソフトウェア パッチが正式にリリースされる前にホットフィックス バージョンを入手できます。プレミアム顧客は Percona のソフトウェアを使用する必要さえありません。また、彼らのためにパッチをアップストリームにプッシュすることもできます。ただし、Percona 製品の場合、すべてのサポート レベルでバグ修正を受けることができます。

たとえそうであっても、これは、たとえその動作が正当なバグであると認めたとしても、すべての予期せぬ動作を修正するという意味ではありません。そのような決定を下す理由の 1 つは、その動作が明らかに間違っているにもかかわらず、 Percona 製品の皆様、これはまだ機能リクエストです。

たとえ、この状況を正当なバグとして受け入れたとしても、予期せぬ状況をすべて修正するという意味ではありません。このような決定を下す理由の 1 つは、この予期せぬ状況は明らかに間違っているものの、実際には Percona 製品自体の製品要件であるためです。

バグとして

# 最近の良い例このようなケースの例は PS-5312 です。このバグはアップストリームで再現可能で、bugs.mysql.com/95065

で報告されています。このようなケースの最近の良い例は PS-5312 です。バグは上流で再現でき、bugs.mysql.com/95065 で文書化できます。

これは、InnoDB フルテキスト インデックスへのアクセスによってメモリ使用量が増加する状況を報告します。この問題は、誰かがフルテキスト インデックスにクエリを実行したときに始まり、最大値まで増加し、かなり長い間解放されません。

このレポートでは、InnoDB のフルテキスト インデックスにアクセスするときにメモリ使用量が増加する状況について説明します。この状況は一部のフルテキスト インデックス クエリで発生し、メモリは最大値に達するまで増加し続け、長時間解放されません。

Percona エンジニアリング チームの Yura Sorokin は、これがメモリ リークであるかどうかを調査し、メモリ リークではないことがわかりました。

Percona エンジニアリング チームの Yura Sorokin は、これがメモリ リークであるかどうかを調査し、次のことを発見しました。漏れの範囲。

InnoDB がフルテキスト クエリを解決すると、関数 fts_query_phrase_search でメモリ ヒープが作成されます。このヒープは最大 80MB まで増加する可能性があります。さらに、常に継続的に使用されるわけではない大量のブロック ( mem_block_t ) があり、

InnoDB がフルテキスト クエリを解析すると、

fts_query_phrase_search 関数内にメモリ ヒープが作成され、これは 80M にまで増加する可能性があります。さらに、このプロセスでは多数の不連続ブロック (mem_block_t) も使用されるため、メモリの断片化が発生します。

関数 exit では、メモリ ヒープが解放されます。InnoDB は、割り当てられたブロックごとにこれを実行します。関数の最後に、メモリ アロケータ ライブラリの 1 つに属する free() を呼び出します。 mysqld の観点からは、すべてが正しく行われており、メモリ リークはありません。

関数の終了時に、これらのメモリ ヒープは解放されます。 InnoDB は、割り当てたすべてのブロックに対してこれを実行します。関数の実行の最後に、

mallocjemalloc などのメモリ アロケーター ライブラリで free() オペレーションを呼び出します。 MySQL 自体の観点からは、これは問題なく、メモリ リークもありません。

ただし、free() は呼び出されたときにメモリを解放する必要がありますが、メモリをオペレーティング システムに返す必要はありません。メモリ アロケータが同じメモリ ブロックがすぐに必要になると判断した場合、メモリ アロケータは引き続きメモリ ブロックを保持することがあります。これは、ジョブが終了し、すべての割り当て解除が完了した後も、mysqld がまだ大量のメモリを使用していることがわかる理由を説明しています。

ただし、free() 関数は、実際に解放される必要があります。これはメモリと呼ばれますが、オペレーティング システムに返す必要はありません。メモリ アロケータがこれらのメモリ ブロックがすぐに必要であると判断した場合、それらは mysqld プロセス用に予約されます。これは、mysqld が作業を完了してメモリを解放した後も依然として大量のメモリを使用する理由を説明しています。

これは実際には大きな問題ではなく、害を及ぼすことはありません。しかし、メモリをより迅速にオペレーティング システムに返す必要がある場合は、jemalloc などの代替メモリ アロケータを試すことができます。後者は解決することが証明されています。 PS-5312 の問題です。

これは実際の生産では大きな問題ではなく、事故を引き起こすことはありません。ただし、オペレーティング システムにメモリをより速く返す必要がある場合は、jemallolc などの従来とは異なるメモリ アロケータを試すことができます。 PS-5312の問題を解決することが証明されています。

メモリ管理を改善するもう 1 つの要因は CPU コアの数です: テストに使用するメモリが増えるほど、メモリがオペレーティング システムに返される速度が速くなります。これはおそらく、次の事実によって説明できます。複数の CPU がある場合、メモリ アロケータはそのうちの 1 つをオペレーティング システムにメモリを解放するためだけに割り当てることができます。

メモリ管理を改善するもう 1 つの要因は CPU コアの数です。テストでは CPU コアが多いほど、メモリはより速くオペレーティング システムに返されます。複数の CPU があり、そのうちの 1 つがオペレーティング システム用のメモリを解放するためのメモリ アロケータとして排他的に使用される可能性があります。

InnoDB フルテキスト インデックスの最初の実装でこの欠陥が導入されました。エンジニアの Yura Sorokin が発見したように:

  • フルテキスト検索を導入した最初の 5.6 コミットInnoDB WL#5538 の機能: InnoDB フルテキスト検索のサポート – https://dev.mysql.com/worklog/task/?id=5538

  • 実装 WL #5538 InnoDB Full -テキスト検索サポート、マージ – https://github.com/mysql/mysql-server/commit/b6169e2d944 – にもこの問題があります。

エンジニアとして Yura Sorokin は見つかったものと同じです。次の 2 つの点は、InnoDB フルテキスト インデックスの初期の実装でこの欠陥が導入されたことを示しています:

  • MySQL の 5.6 バージョンは、 InnoDB WL 全文インデックスを初めて実装 機能紹介: #5538: InnoDB 全文検索サポート – https://dev.mysql.com/worklog/task/?id=5538

  • Implementing WL #5538 InnoDB full-text search Support and Merger - https://github.com/mysql/mysql-server/commit/b6169e2d944 - 同じ問題も存在します 問題

修正方法

##これを修正するにはいくつかのオプションがあります:

    ##InnoDB フルテキスト インデックスの実装を変更する
  1. jemalloc のようなカスタム メモリ ライブラリを使用する
  2. どちらにも長所と短所があります。
この問題を解決するには 2 つの方法があります:

1. InnoDB フルテキスト インデックスの実装を変更する

2.

jemalloc

などのカスタム メモリ ライブラリを使用する どちらの方法にも、それぞれ長所と短所があります。

オプション 1 は、アップストリームとの非互換性を導入することを意味し、将来のバージョンで奇妙なバグが発生する可能性があります。これは、顧客が使用する GA バージョンでは常に危険を伴う InnoDB フルテキスト コードの完全な書き換えも意味します。 .

方法 1 は、上流のソフトウェアとの非互換性のリスクが発生することを意味し、新しいバージョンで未知のバグが発生する可能性があります。また、これは InnoDB の全文インデックス コードの一部を完全に書き換えることを意味しますが、ユーザーが使用する GA バージョンでは危険です。

オプション 2 は、最も安全なメモリ割り当てではなくパフォーマンスを目的として設計された jemalloc ライブラリの欠陥に遭遇する可能性があることを意味します。

オプション 2 は、いくつかのバグに遭遇する可能性があることを意味します。 jemalloc ライブラリはパフォーマンスを考慮して設計されていますが、最も安全なメモリ割り当てではありません。

したがって、理想的ではないこれら 2 つのソリューションのどちらかを選択する必要があります。

オプション 1 では、Percona サーバーがアップストリームと互換性がない状況が発生する可能性があるため、オプション 2 を優先し、アップストリームに期待します。このバグを修正しました。

したがって、これら 2 つの不完全な方法のいずれかを選択する必要があります。

方法 1 では、percona サービスとアップストリームとの互換性がなくなる可能性があるという事実を考慮して、問題を解決するには方法 2 を使用することを好み、アップストリームがこのバグを修正することを期待しています。

結論

mysqld プロセスによるメモリ使用量が多い場合、それは必ずしもメモリ リークの症状であるとは限りません。パフォーマンスでメモリ インストルメンテーションを使用できます。割り当てられたメモリがどのように使用されているかを確認するには、スキーマを使用します。メモリの割り当てと解放の処理を改善するには、代替メモリ ライブラリを試してください。LD_PRELOAD のユーザー マニュアルを検索して、こことここのページで設定方法を確認してください。

mysqld プロセスが大量のメモリを使用していることがわかったとしても、それは必ずしもメモリ リークがあることを意味するわけではありません。パフォーマンス スキーマでメモリ インストルメンテーションを使用すると、プロセスが割り当てられたメモリをどのように使用するかを理解できます。メモリの割り当てと割り当て解除をより適切に処理するために、メモリ ライブラリを置き換えることもできます。 LD_RELOAD の設定方法については、MySQL ユーザー マニュアル mysqld-safe および using-system の対応するページを参照してください。

プログラミング関連の知識について詳しくは、プログラミング教育をご覧ください。 !

以上がチャット MySQL メモリ管理、メモリ アロケータ、およびオペレーティング システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。