INNODBバッファープールの統計情報を理解する


20

mysqlドキュメンテーションのこのページを読んだ後、現在のInnoDBの使用法を理解しようとしました。現在、バッファプールに6GBのRAMを割り当てています。データベースのサイズはほぼ同じです。次に、show engine innodb status\Gv5.5の実行結果を示します。

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

バッファキャッシュをどの程度活用しているか知りたいと思いました。最初に出力をちらっと見た後、我々が実際のオフに基づいて、それを使用しているように見えたPages made youngし、not youngその中の数字と持っているBuffer pool hit rate is 1000 / 10000(私はこの手段それはかなり頻繁に使われていることをウェブ上のどこかに見ました。本当?)

ループを介して私を投げているのは、なぜyoung-making rateand notが両方とも0/1000で、young/sand non-young/sアクセスが両方とも0である理由です。これらはすべて、まったく使用されていないことを示しています。

誰でもこれを理解するのを助けることができますか?

回答:


18
 Buffer pool hit rate is 1000 / 1000

これは、あなたがいる状況で唯一の本当に意味のある値です...そして、その状況は、完全に100%のヒット率のバッファプールを持つのに十分幸運であるということです。サーバーOSのメモリが不足してスワッピングが発生しない限り、変更する必要はないため、残りの部分を過剰分析しないでください。

young / not youngの値は、バッファープールにゼロの圧力がかかっている場合には重要ではありません。InnoDBはそれを使用していますが、それなしでは何もしません。プールが小さすぎる場合、ページが追い出され、新しいページが読み込まれ、他の統計がそれを理解するのに役立ちます...しかし、それはあなたが持っていないように見える問題です。

プール内の空き「未使用」スペースは決してありません何らかの理由で必要になった場合にInnoDBによって無視されたりアイドル状態になったりん。データセットが大きくなります。

もちろん、最近サーバーを再起動した場合を除き、それがすべてではないことを意味します。その場合、サーバーは完全ではありません。 ... 1時間、1日、1週間、1か月、1年のいずれであるかは、アプリケーションによって異なります。


28

The Buffer pool size 393215 これはバイト単位ではなくページ単位です。

GB単位のバッファプールサイズを確認するには、次を実行します。

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 これは、バッファープール内にデータがあるページの数です。

GB単位のバッファプールサイズのデータ​​量を確認するには、次を実行します。

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

使用中のバッファプールの割合を確認するには、次を実行します。

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300これは、データベースに書き戻す必要があるバッファプール内のページ数です。これらはダーティページとも呼ばれます。

ダーティページが占めるスペースを確認するには、次を実行します。

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

ダーティページの割合を確認するには、次を実行します。

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

ディスプレイ内の他のものに関しては、これを実行します:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

バッファプールのすべてのステータス変数が表示されます。ouは、調査する必要があるものすべてに対して同じクエリを適用できます。


ありがとうございました!このことから、バッファキャッシュが実際に使用されていることを収集しますが、知りたいのは、それを効果的に使用しているかどうかです。若いページと古いページの概念を理解している場合、バッファキャッシュが最大限に使用されていることを示す良い指標は、若いページと若いページへのアクセスの数にあると思いますか?mysqldumpを使用して3時間ごとにバックアップを行います。これにより、なぜいっぱいになったのかがわかります。しかし、young-making rate 0 / 1000とを使用すると0.00 youngs/s、実際に使用していないことがわかります。私はこれを読んでいますか?
サファド14年

2
ヤング率0/1000は、実行しているクエリのデータページがすべてキャッシュに収まるだけでなく、小さい(3/8)サイズのヤングキャッシュに収まることを示しています。つまり、クエリは、ページの一部を大きな若いキャッシュにエージングするのに十分なデータを使用していません。
トーマス・ジョーンズ-ロー14年

残りのinnodb_buffer_poolステータス変数に関する簡単な説明は非常に役立ちます。回答に追加してください
vidyadhar 14年

5

「完全にヒット率が100%のバッファプールを用意できたのは幸運だ」という評価には同意しません。

出力の上部(切り取られている)には、次のような行があります。

Per second averages calculated from the last 16 seconds

これにより、過去16秒間に読み取りが行われなかったため、(人工的に)完全な '1000/1000'スコアが得られることがわかりました。

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

一方、いくつかの書き込みがありました。これらは、「ダーティ」ページをフラッシュするか、「バッファを変更」からインデックスをクリーンアップするための遅延書き込みである可能性があります。

おそらく、最近の16秒間にも若い/暑い地域で活動はなかったでしょう。


まあ、我々は6K-10K SELECT文の間の秒を平均化して、私はこのケースではないと思いますので、同時に私は、ほとんど0ディスクは、サーバー上のアクティビティを読む見ることができます
Safado

「クエリキャッシュ」はほとんどのクエリを満たしていますか? SHOW VARIABLES LIKE 'query%';そしてSHOW GLOBAL STATUS LIKE 'Qc%';そしてSHOW GLOBAL VARIABLES LIKE 'Com_SELECT';
リックジェームズ

0

バッファプールは、若いリストと非若いリストの2つの部分に分かれています。作成率は、2つのリスト間でシャッフルされているバッファープールのページ数を示します。

若いページは、作成されている若いページです(つまり、キャッシュから読み取られています。若いページは、古すぎるか、若いリストがいっぱいであるため、若いリストから移動されます。

2つの間でページが移動する速度は、現在使用されているバッファプールの量と若いプールのサイズに依存します。ゼロに設定すると、アクティブセット(使用しているページ)が若いプールよりも小さくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.