首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

從 MySQL 源碼剖析 InnoDB Buffer Pool 命中率計算邏輯

     編輯:MySQL 資料庫相關知識

官方文檔建議的 Buffer Pool 命中率公式:100 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100。但 SHOW ENGINE INNODB STATUS 顯示的 Buffer pool hit rate XXX/1000 計算邏輯不同。本文從源碼層面解析兩者差異與適用場景。

官方公式(累計值)

Hit Ratio = 100 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100

來源:mysql->status->Innodb_buffer_pool_reads / read_requests 為啟動以來的累計計數器。

源碼實作邏輯(區間值)

檔案:storage/innobase/buf/buf0buf.c 函式 buf_print_io()

void buf_print_io(...) {
    if (buf_pool->n_page_gets > buf_pool->n_page_gets_old) {
        fprintf(file, "Buffer pool hit rate %lu / 1000\n",
            (ulong) (1000 - ((1000 * (buf_pool->n_pages_read - buf_pool->n_pages_read_old))
                            / (buf_pool->n_page_gets - buf_pool->n_page_gets_old))));
    }
    buf_pool->n_page_gets_old = buf_pool->n_page_gets;
    buf_pool->n_pages_read_old = buf_pool->n_pages_read;
}

對應結構體 buf_block_struct(buf0buf.h):

  • n_page_gets:頁面獲取總數(含自適應雜湊索引命中)
  • n_pages_read:實際磁碟讀取頁面數
  • _old 變數:上次列印時的快照值

真實命中率公式(區間差值)

ib_bp_hit = 1000 - ( (t2.iReads - t1.iReads) / (t2.iReadRequests - t1.iReadRequests) ) * 1000
  • t1, t2:兩個時間點(間隔 ≥ 30 秒)
  • iReads = Innodb_buffer_pool_reads
  • iReadRequests = Innodb_buffer_pool_read_requests

兩種計算方式的差異與適用場景

維度官方累計公式源碼區間公式
數據基礎啟動至今累計兩採樣點差值
反映範圍整體歷史表現當下/近期表現
敏感度低(大分母稀釋波動)高(能捕捉抖動)
適用場景容量規劃、長期趨勢故障排查、效能抖動偵測

監控實作建議

  1. 每 30-60 秒採樣一次 Innodb_buffer_pool_reads、read_requests。
  2. 計算區間命中率,低於 99.9%(或 999/1000)觸發告警。
  3. 結合 Innodb_buffer_pool_wait_free、Innodb_log_waits 綜合判斷 Buffer Pool 壓力。
  4. 關注 srv_export_innodb_status()(Srv0srv.c)輸出的其他關鍵指標。

結論:區間差值法更貼近源碼邏輯,能及時發現效能抖動;累計法適合長期趨勢報表。監控系統建議兩者並存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved