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

mysqldump 導致 Buffer Pool 污染深度分析與優化

     編輯:MySQL 資料庫相關知識

背景:InnoDB LRU 列表與 midpoint insertion

Buffer Pool (BP) 採用 Young/Old 兩段式 LRU:

  • Young 區(默認 63%):熱數據,靠近頭部
  • Old 區(默認 37%,由 innodb_old_blocks_pct 控制):新讀入頁面插入點
  • Midpoint:兩區交界,新頁面首次讀入即插入此處

頁面被訪問時會提升至 Young 區頭部。全表掃描(如 mysqldump)會大量讀入冷頁面並立即訪問,若 innodb_old_blocks_time = 0,這些頁面瞬間衝到 Young 區頭部,擠出真正熱數據 → Buffer Pool 污染。

關鍵參數:innodb_old_blocks_time

  • 0(舊默認):頁面首次訪問即可提升
  • 1000(新默認,單位 ms):頁面在 Old 區停留 ≥1s 且再次被訪問才能提升
  • 作用:防止一次性大掃描污染 BP

實測數據(sysbench OLTP,mysqldump 並發備份)

Concurrency無備份 QPStime=0 QPStime=1000 QPS提升幅度
117,3941,8362,14116.6%
583,5518,67615,88583%
10150,36539,03448,92525%
15174,26870,96590,63328%
19175,11493,303120,62529%

結論:time=1000 並非銀彈,最佳提升集中在中等併發(Old 區邊緣熱度數據)。高併發熱數據搶佔優勢大,低併發冷數據本就靠尾,均受益有限。

innodb_old_blocks_pct 聯動效應

  • 調大 pct(如 60%),性能提升波峰右移至 60% 併發位置
  • 兩參數需配合調優:pct 決定「什麼樣的數據受保護」,time 決定「保護力度」

生產環境建議配置

[mysqld]
innodb_old_blocks_time = 1000
innodb_old_blocks_pct  = 37   # 默認通常足夠,觀察 BP 命中率再調

配合 innodb_buffer_pool_dump_at_shutdown/load_at_startup 實現熱數據預熱,進一步減少啟動期抖動。

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