推奨 (無料): 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) も使用されるため、メモリの断片化が発生します。
malloc や
jemalloc などのメモリ アロケーター ライブラリで
free() オペレーションを呼び出します。 MySQL 自体の観点からは、これは問題なく、メモリ リークもありません。
これは実際には大きな問題ではなく、害を及ぼすことはありません。しかし、メモリをより迅速にオペレーティング システムに返す必要がある場合は、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 - 同じ問題も存在します 問題
修正方法
##これを修正するにはいくつかのオプションがあります:jemalloc
などのカスタム メモリ ライブラリを使用する どちらの方法にも、それぞれ長所と短所があります。
結論
mysqld プロセスによるメモリ使用量が多い場合、それは必ずしもメモリ リークの症状であるとは限りません。パフォーマンスでメモリ インストルメンテーションを使用できます。割り当てられたメモリがどのように使用されているかを確認するには、スキーマを使用します。メモリの割り当てと解放の処理を改善するには、代替メモリ ライブラリを試してください。LD_PRELOAD のユーザー マニュアルを検索して、こことここのページで設定方法を確認してください。
mysqld プロセスが大量のメモリを使用していることがわかったとしても、それは必ずしもメモリ リークがあることを意味するわけではありません。パフォーマンス スキーマでメモリ インストルメンテーションを使用すると、プロセスが割り当てられたメモリをどのように使用するかを理解できます。メモリの割り当てと割り当て解除をより適切に処理するために、メモリ ライブラリを置き換えることもできます。 LD_RELOAD の設定方法については、MySQL ユーザー マニュアル mysqld-safe および using-system の対応するページを参照してください。プログラミング関連の知識について詳しくは、プログラミング教育をご覧ください。 !
以上がチャット MySQL メモリ管理、メモリ アロケータ、およびオペレーティング システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。