mysqlドキュメントのこのページ を読んだ後、現在のInnoDBの使用法を理解しようとしました。現在、RAMの6GBをバッファプールに割り当てています。データベースサイズはほぼ同じです。ここにshow engine innodb status\G
からの出力があります(v5.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
(Webの他の場所で見たように、かなり頻繁に使用されていることを意味します。本当ですか?)
young-making rate
とnot
が両方とも0/1000で、young/s
とnon-young/s
のアクセスが両方とも0である理由は、ループを介して私をスローしていることです。これらはすべて、まったく使用されていないことを示しています。
誰かがこれを理解するのを手伝ってくれる?
Buffer pool hit rate is 1000 / 1000
これはあなたがいる状況でonly本当に意味のある値です...そしてその状況はあなたが幸運にもバッファプールを持っているということです完璧な100%のヒット率。サーバーOSのメモリが不足してスワッピングが発生しない限り、変更する必要のあるものは何もないため、残りの部分を過度に分析しないでください。
バッファプールにプレッシャーがない場合、若さの値/若さの値は重要ではありません。 InnoDBはそれを使用しており、それなしでは何も実行しません。プールが小さすぎる場合は、ページが追い出されて新しいページが読み込まれ、他の統計がそれを理解するのに役立ちます...しかし、それはあなたが持っているようには見えない問題です。
プール内の空き「未使用」スペースは決して何らかの理由で必要になった場合、InnoDBによって無視またはアイドル状態のままになるため、無料とは、作業中のデータセットのサイズが大きくなるにつれて拡張する余地があることだけを意味します。
もちろん、最近サーバーを再起動した場合を除いて、これは完全ではありません。統計が全体を物語る前に、サーバーは「通常の」使用(フルバックアップを含む)の全期間実行する必要があります。 ...それが1時間、1日、1週間、1か月、または1年であるかどうかは、アプリケーションによって異なります。
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%';
バッファプールのすべてのステータス変数が表示されます。調べる必要があるものすべてに同じクエリを適用できます。
「あなたは幸運にも、100%のヒット率が完璧なバッファプールを手に入れることができます」という評価には同意しません。
出力の上部(切り取られています)には、次のような行があります。
Per second averages calculated from the last 16 seconds
これはnoの読み取りが最後の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秒間は、若くて暑いエリアでも活動がありませんでした。
バッファプールは、若いリストと非若いリストの2つの部分に分かれています。作成率は、2つのリスト間でバッファプール内のページ数が入れ替えられていることを示します。
若いにされたページは、作成されている若いページではありません(つまり、キャッシュから読み取られています。若いにされていないページは、古すぎるか、若いリストがいっぱいであるために、若いリストから移動されたページです。
ページでの速度が2つの間で移動する速度は、現在使用されているバッファープールの量と若いプールのサイズによって異なります。ゼロに設定すると、アクティブセット(使用しているページ)が若いプールよりも小さくなります。