MySQL InnoDB Buffer Pool詳解:原理、配置與性能優化

1. 為什么需要 Buffer Pool?

1.1 數據庫性能瓶頸分析

在 MySQL 的運行過程中,最核心的性能瓶頸來自磁盤 IO

  • 磁盤訪問延遲:一次機械硬盤 IO 操作可能需要數毫秒,即使是 SSD,訪問延遲也在幾十微秒量級。

  • 內存訪問延遲:CPU 訪問內存的延遲僅為納秒級,比磁盤快 數萬個數量級

如果每次查詢都直接從磁盤讀取數據,那么即使硬件再強大,系統也會因為磁盤 IO 的低速而產生嚴重的性能瓶頸。

這就引出了 緩存機制 ——通過在內存中緩存常用的數據頁,減少磁盤訪問,提升整體性能。


1.2 緩存設計的核心原則:局部性原理

計算機體系結構中有個重要規律 —— 局部性原理

  • 時間局部性:最近訪問過的數據,很可能再次被訪問。

  • 空間局部性:訪問了某個數據,附近的數據也很可能會被訪問。

InnoDB Buffer Pool 正是基于局部性原理設計的緩存機制:

  • 把數據頁(默認 16KB)從磁盤加載到內存;

  • 下次訪問時,若數據已在 Buffer Pool 中,就可以直接從內存返回結果;

  • 若數據不在 Buffer Pool 中,才會觸發磁盤 IO,把數據加載進來。

這樣,大量的讀寫操作都可以在內存中完成,極大提升數據庫性能。


1.3 性能對比示例

我們通過一個實驗對比 未啟用緩存啟用緩存 的性能差異。

假設執行以下 SQL 查詢 10 萬次:

SELECT * FROM employees WHERE emp_no = 10001;
  1. 首次查詢(數據不在 Buffer Pool,觸發磁盤 IO):

    • 查詢耗時:約 5ms(取決于磁盤性能)

    • Innodb_buffer_pool_reads 增加 1

  2. 后續查詢(數據已緩存于 Buffer Pool):

    • 查詢耗時:約 50μs

    • Innodb_buffer_pool_read_requests 增加 1

我們可以通過以下命令查看緩存命中率:

SHOW STATUS LIKE 'Innodb_buffer_pool_read%';

輸出示例:

+----------------------------------+---------+
| Variable_name                    | Value   |
+----------------------------------+---------+
| Innodb_buffer_pool_read_requests | 100000  |
| Innodb_buffer_pool_reads         | 1       |
+----------------------------------+---------+

緩存命中率計算公式:

命中率 = 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)= 1 - (1 / 100000)≈ 99.999%

從數據可以看出,Buffer Pool 把磁盤訪問減少到幾乎可以忽略,大幅提升了數據庫性能。


1.4 類比理解:Buffer Pool 就像“圖書館的緩存書架”

  • 磁盤:相當于圖書館的倉庫,存放所有的書籍,但取書速度慢。

  • Buffer Pool:就像前臺的“緩存書架”,把常用的書放在這里,方便快速取閱。

  • 讀者(SQL 查詢):如果要的書在緩存書架上,就能立刻拿到;如果沒有,管理員就需要跑去倉庫把書取出來并放到緩存書架上。

這個設計保證了大部分讀者都能快速取到書(高命中率),從而避免了頻繁的倉庫往返(磁盤 IO)。


? 小結
Buffer Pool 的引入是為了解決數據庫性能瓶頸問題,它利用 內存緩存 + 局部性原理 來顯著降低磁盤 IO。緩存命中率越高,數據庫性能越好。

?

2. InnoDB Buffer Pool 的核心組成

2.1 Buffer Pool 的基本概念

Buffer Pool 是 InnoDB 存儲引擎的核心緩存區域,主要作用是:

  • 緩存數據頁(Data Pages):表的數據行存放在數據頁中。

  • 緩存索引頁(Index Pages):B+ 樹索引的節點頁。

  • 緩存臟頁(Dirty Pages):內存中已被修改但尚未寫回磁盤的頁面。

和操作系統的 Page Cache 不同,Buffer Pool 并不是簡單的“內存文件緩存”,它深度參與了 InnoDB 的事務管理、鎖機制、日志系統,屬于數據庫內部“自主管理”的緩存層。

👉 一句話理解:操作系統 Page Cache 只管“文件緩存”,而 Buffer Pool 更懂“數據庫語義”(事務一致性、頁結構、索引關系等)。


2.2 Buffer Pool 的內存布局

為了高效管理內存,InnoDB 把 Buffer Pool 分解成多個鏈表(lists)和數據結構。主要包括:

  1. 數據頁(Data Pages)

    • Buffer Pool 以頁(Page)為最小存儲單位,默認大小為 16KB

    • 每個頁對應磁盤上的一個頁,可能存儲 表數據索引數據

  2. 自由列表(Free List)

    • 存放尚未被使用的空閑頁。

    • 當 Buffer Pool 需要緩存新的磁盤頁時,就從 Free List 中取出一個空閑頁。

  3. LRU 列表(Least Recently Used List)

    • 存放已經被使用過的緩存頁,按“最近訪問時間”排序。

    • 采用 改進版 LRU 算法(Midpoint Insertion Strategy):新加載的頁插入到 LRU 的中部,而不是頭部。

    • 好處是防止“冷數據”短時間大量涌入,把真正的熱點數據擠出緩存。

  4. Flush 列表(Flush List)

    • 存放所有 臟頁

    • 臟頁最終需要通過 Checkpoint 機制寫回磁盤,以保證數據持久性。

📌 [圖1] Buffer Pool 內存布局圖(文字描述):

+-------------------------------------------------------+
|                 InnoDB Buffer Pool                    |
+-------------------------------------------------------+
| Free List |  LRU List (冷熱數據區分)  |  Flush List   |
|           |  [熱區] [冷區]            |  [臟頁隊列]   |
+-------------------------------------------------------+
  • Free List:可用頁。

  • LRU List:冷熱數據混合,采用中點插入策略管理。

  • Flush List:專門跟蹤哪些頁需要刷盤。


2.3 哈希表(Hash Table)的作用

為了快速判斷某個數據頁是否在 Buffer Pool 中,InnoDB 引入了 哈希表(Hash Table)

  • 作用

    • 輸入:表空間號 + 頁號(Tablespace ID + Page Number)

    • 輸出:是否命中緩存,若命中則返回對應的內存頁指針。

    • 時間復雜度:O(1),極大提升查詢效率。

  • 沖突解決

    • 采用鏈表解決哈希沖突。

    • 為減少鎖競爭,InnoDB 對哈希表進行分區管理(shard)。

  • 性能優化點

    • 高并發讀寫場景下,哈希表分區可以顯著降低 latch 沖突。

    • Adaptive Hash Index (AHI) 會在熱點索引頁上自動創建“二級哈希索引”,進一步提升查詢性能。

我們可以通過以下命令查看 InnoDB 的哈希表統計:

SHOW ENGINE INNODB STATUS\G

部分輸出示例(截取):

BUFFER POOL AND MEMORY
----------------------
Hash table size 4425293, node heap has 132 buffer(s)
Hash table usage 87.65%, used cells 3880123, node heap has 250 buffer(s)

說明:

  • Hash table size:哈希表大小。

  • Hash table usage:當前使用率。

  • 使用率過高(>90%)可能導致哈希沖突增加,影響查找性能。


? 小結

  • Buffer Pool 的核心組成包括 數據頁、Free List、LRU List、Flush List

  • 哈希表保證了緩存頁的快速定位。

  • 這些結構共同組成了一個高效的內存管理系統,既能保證性能(緩存命中),又能保障數據持久性(臟頁刷盤)。

3. Buffer Pool 的內存管理機制

3.1 Free 鏈表管理

Free List 用來管理 Buffer Pool 中的空閑頁。

  • 工作原理

    • 當 MySQL 啟動時,InnoDB 會先把 Buffer Pool 按頁切分。

    • 所有未被使用的頁最初都掛在 Free List 上。

    • 當需要加載新的磁盤頁時,InnoDB 就會從 Free List 中取出一個空閑頁。

    • 如果 Free List 耗盡,則需要從 LRU List 中淘汰舊頁來補充。

  • 查看 Free List 使用情況

    SHOW ENGINE INNODB STATUS\G

    輸出片段示例:

    BUFFER POOL AND MEMORY
    ----------------------
    Total memory allocated  34359738368; Free buffers  2048; Database pages  2101234
    
    • Free buffers:表示當前 Free List 中空閑頁的數量。

👉 小結:Free List 相當于“空房間列表”,當需要住新客人(加載數據頁)時,先看是否有空房間,沒有的話就得“趕人”(淘汰 LRU 頁)。


3.2 LRU 鏈表管理

LRU(Least Recently Used)鏈表 是 Buffer Pool 的核心,負責管理已加載的緩存頁。

(1) 標準 LRU 算法的問題

傳統 LRU:新加載的數據直接放在頭部,最久未訪問的淘汰。
👉 問題:大批“冷數據”掃描(例如全表掃描)可能會把熱點數據全部擠掉。

(2) InnoDB 的改進 —— Midpoint Insertion Strategy

InnoDB 并不是把新頁插入 LRU 頭部,而是插入 中點

  • LRU 被分為 熱區(前 5/8) 和 冷區(后 3/8)。

  • 新頁進入冷區,必須被再次訪問才會“升格”到熱區。

  • 淘汰頁優先從冷區選擇,這樣能防止熱點數據被短期冷數據刷掉。

📌 [圖2] InnoDB LRU 列表結構(文字描述):

LRU List
+---------------------------------------------------+
| 熱區 (5/8, 最近頻繁訪問) | 冷區 (3/8, 新頁與少用頁) |
+---------------------------------------------------+↑                           ↑|                           |熱點數據                      淘汰候選
(3) 監控 LRU 狀態

可以用以下命令查看:

SHOW STATUS LIKE 'Innodb_buffer_pool_pages%';

輸出示例:

+----------------------------------+---------+
| Variable_name                    | Value   |
+----------------------------------+---------+
| Innodb_buffer_pool_pages_total   | 1310720 |
| Innodb_buffer_pool_pages_data    | 1048576 |
| Innodb_buffer_pool_pages_free    | 2048    |
| Innodb_buffer_pool_pages_dirty   | 50000   |
+----------------------------------+---------+

👉 解讀:

  • pages_total:總頁數

  • pages_data:已使用的頁數

  • pages_free:空閑頁數

  • pages_dirty:臟頁數


3.3 Flush 鏈表管理

Flush List 用來管理所有 臟頁(Dirty Pages)

  • 臟頁的來源

    • 當事務修改數據時,數據會先修改 Buffer Pool 中的頁。

    • 此時,這個頁與磁盤數據不同步,就成為臟頁。

    • 臟頁必須在合適的時機寫回磁盤,以確保數據持久性。

  • 刷盤時機

    • 達到臟頁比例閾值innodb_max_dirty_pages_pct

    • 后臺線程定期刷新(根據 innodb_io_capacity 調整)

    • 事務提交時(可能強制刷盤,取決于 innodb_flush_log_at_trx_commit 配置)

  • 監控臟頁情況

    SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct';
    

    輸出示例:

    +---------------------------+-------+
    | Variable_name             | Value |
    +---------------------------+-------+
    | innodb_max_dirty_pages_pct| 75    |
    +---------------------------+-------+
    

    👉 表示當臟頁比例超過 75% 時,會觸發主動刷新。

📌 [圖3] Flush List 流程(文字描述):

事務修改頁 → 頁進入 Flush List → 后臺刷新線程挑選臟頁 → 寫入磁盤

? 小結

  • Free List:管理空閑頁,像“備用房間”。

  • LRU List:管理已使用頁,冷熱數據分離,防止熱點被沖刷。

  • Flush List:管理臟頁,確保數據最終落盤。

這三大鏈表共同保證了 Buffer Pool 的 高性能 + 數據一致性

4. 臟頁刷新與持久化策略

4.1 臟頁刷新的觸發條件

在 InnoDB 中,寫操作并不會立即寫磁盤,而是先寫到 Buffer PoolRedo Log
這樣做可以避免頻繁磁盤 IO,但也帶來一個問題:內存數據和磁盤數據不一致

為了保證最終一致性,InnoDB 會在特定條件下把臟頁寫回磁盤,觸發條件主要有三類:

  1. 基于臟頁比例的刷新

    • 由參數 innodb_max_dirty_pages_pct 控制(默認 75)。

    • 當 Buffer Pool 中臟頁比例超過閾值時,會觸發刷盤。

      SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct';
      

    示例輸出:

    +---------------------------+-------+
    | Variable_name             | Value |
    +---------------------------+-------+
    | innodb_max_dirty_pages_pct| 75    |
    +---------------------------+-------+
    
  2. 基于 IO 能力的刷新

    • 由參數 innodb_io_capacity 控制(表示每秒可承受的 IO 數量)。

    • InnoDB 會根據該值動態決定刷新速率,避免 IO 突發過大。

  3. 特殊事件觸發的刷新

    • 事務提交時:如果 innodb_flush_log_at_trx_commit 配置為 1,Redo Log 會在每次提交時刷盤,從而保證事務持久性。

    • Buffer Pool 空間不足:當 Free List 沒有空閑頁時,InnoDB 會強制淘汰 LRU 中的頁并觸發刷盤。

    • Checkpoint 機制:后臺線程會定期觸發 Checkpoint,強制部分臟頁落盤。


4.2 臟頁刷新的算法實現

InnoDB 的臟頁刷新主要依賴 Checkpoint 機制,它的目標是保證崩潰恢復時,Redo Log 能覆蓋內存和磁盤的差異。

(1) Checkpoint 的兩種形式
  1. Sharp Checkpoint(尖銳檢查點)

    • 在數據庫關閉時,InnoDB 會把所有臟頁一次性刷到磁盤。

    • 這樣保證了數據庫關閉后的數據完全一致。

  2. Fuzzy Checkpoint(模糊檢查點)

    • 在數據庫運行時,后臺線程會定期刷新部分臟頁,而不是一次性全刷。

    • 優點是 避免 IO 高峰,減少對業務的影響。

    • 刷新的位置通過 日志序列號 LSN(Log Sequence Number) 控制。

📌 [圖4] Checkpoint 機制流程(文字描述):

事務更新數據頁 → 頁變為臟頁 → 寫入 Redo Log → 
后臺線程根據 LSN 和臟頁比例選擇頁 → 刷盤到磁盤 → Checkpoint 推進
(2) 查看 Checkpoint 信息

我們可以通過以下命令查看:

SHOW ENGINE INNODB STATUS\G

部分輸出(LOG 段):

Log sequence number  45291123
Log flushed up to    45290000
Last checkpoint at   45280000

解釋:

  • Log sequence number:最新的 LSN。

  • Last checkpoint:最近一次 Checkpoint 的 LSN。

  • 差值越大,表示有越多的臟頁尚未落盤。


4.3 持久化策略對性能的影響

InnoDB 提供多個參數來平衡 性能數據安全

(1) innodb_flush_method

控制數據刷盤的方式,常見取值:

  • fsync(默認):調用操作系統的 fsync() 保證數據落盤。

  • O_DIRECT:繞過 OS Page Cache,直接寫磁盤,避免雙緩存。

  • O_DSYNC:寫入時同步到磁盤(比 fsync 更頻繁)。

👉 調優建議:

  • Linux + SSD 環境下,推薦 O_DIRECT,避免操作系統緩存與 Buffer Pool 的重復。

(2) innodb_flush_log_at_trx_commit

控制事務提交時 Redo Log 的刷盤策略:

  • 1(默認,最安全):每次事務提交時,Redo Log 都會刷盤。崩潰不會丟失事務。

  • 2:事務提交時寫入操作系統緩存,但不立刻刷盤。崩潰可能丟失 1 秒數據。

  • 0:每秒刷盤一次,崩潰可能丟失 1 秒數據。

👉 調優建議:

  • 金融、支付類系統:必須設置為 1,保證事務持久性。

  • 日志、統計類系統:可以設置為 20,換取性能。


? 小結

  • 臟頁刷新由 比例閾值、IO 能力、事務提交、Checkpoint 等條件觸發。

  • Checkpoint 機制保證崩潰恢復時的數據一致性。

  • 不同 刷盤策略 在性能與安全之間需要權衡。

第5章:多實例配置與性能優化

在現代高并發場景中,單一 Buffer Pool 實例可能會遇到 鎖競爭NUMA 架構下的內存訪問延遲 問題。為此,InnoDB 從 MySQL 5.5 開始引入了 InnoDB Buffer Pool 多實例(Buffer Pool Instances) 的機制,用于將 Buffer Pool 拆分成多個獨立的子池,以提升并發訪問性能。


5.1 多實例配置的背景與原理

  1. 單實例問題

    • 單一 Buffer Pool 下,所有的頁目錄(page hash)、LRU 鏈表、Flush 鏈表等數據結構都需要全局互斥鎖保護。

    • 在高并發下,線程頻繁爭奪同一把大鎖,導致嚴重的性能瓶頸。

  2. 多實例機制

    • InnoDB 將 Buffer Pool 拆分為多個 獨立的 Buffer Pool Instance

    • 每個實例擁有獨立的內存空間、LRU 鏈表、Flush 鏈表和 page hash。

    • 數據頁會根據 頁號(Page Number)取模 分配到某一個 Buffer Pool 實例。

    • 這樣可以讓不同線程并發訪問不同實例,從而降低鎖競爭。


5.2 配置參數

  1. innodb_buffer_pool_instances

    • 用于設置 Buffer Pool 的實例數量。

    • 默認值:8(MySQL 5.7+,在內存足夠大的情況下)。

    • 如果 innodb_buffer_pool_size < 1GB,即使設置了多個實例,也會退化為 1 個實例。

  2. innodb_buffer_pool_size

    • Buffer Pool 總大小,所有實例的內存之和。

    • 實際每個實例的大小 = innodb_buffer_pool_size / innodb_buffer_pool_instances


5.3 內存劃分策略

  • Buffer Pool 的分片方式:

    • 總大小均分:每個實例分配到的內存大小完全相同。

    • 頁粒度分配:數據頁通過哈希分配到某個實例中。

  • 示例

    • innodb_buffer_pool_size = 16GBinnodb_buffer_pool_instances = 8,則每個實例大小 = 2GB。

    • 邏輯上相當于擁有 8 個互不干擾的小型 Buffer Pool。


5.4 多實例的優勢

  1. 減少全局鎖競爭

    • 每個 Buffer Pool 實例維護獨立的 LRU、Flush、Hash 表,減少線程爭用。

  2. NUMA 架構友好

    • 在多 CPU NUMA 系統上,多個實例可分布到不同的 NUMA 節點,提高局部性和訪問速度。

  3. 提升并發查詢性能

    • 在高并發讀寫負載下,能夠顯著降低 mutex 的等待時間。


5.5 性能優化建議

  1. 實例數量選擇

    • 一般經驗值:每 1GB Buffer Pool 分配 1 個實例。

    • 建議范圍:[1, 8],超過 8 通常提升有限。

    • 小于 1GB 的 Buffer Pool 不需要開啟多實例。

  2. 避免碎片化

    • 過多的實例會導致單實例過小,減少頁緩存命中率。

    • 推薦保持單實例不少于 1GB

  3. 結合工作負載調優

    • OLTP 高并發系統:適當增加實例數量(如 8~16GB Buffer Pool 配置 8 個實例)。

    • OLAP 批量查詢系統:實例數量不必過多,因大查詢通常掃描集中數據,實例拆分效果有限。


5.6 典型場景分析

  • 場景1:高并發事務處理

    • 大量小事務頻繁更新,單實例鎖爭用嚴重。

    • 解決方案:增加 Buffer Pool 實例,減少 mutex 競爭。

  • 場景2:大表全表掃描

    • 查詢集中訪問同一批數據頁,實例數過多反而不利。

    • 解決方案:適當減少實例,保持頁緩存集中,提高命中率。


? 小結
Buffer Pool 多實例機制通過 分而治之,有效緩解了大規模并發訪問下的鎖競爭問題。但其效果與 Buffer Pool 總大小負載類型NUMA 架構密切相關。最佳策略是根據實際業務場景進行合理配置,而不是盲目追求實例數量。

6. 配置參數詳解與調優建議

本章聚焦 InnoDB Buffer Pool 相關的核心參數,給出含義—影響—推薦—示例四段式說明,并在末尾提供一份落地調優清單常見誤區對照。

6.1 核心參數解析

6.1.1 innodb_buffer_pool_size

含義:Buffer Pool 的總大小。決定可緩存的數據/索引頁數量,是 InnoDB 最重要的參數之一。
影響:直接決定緩存命中率、磁盤 IO 壓力與查詢延遲。
推薦

  • 專用數據庫主機:物理內存的 60%~80%(取決于是否同機還有其他服務)。

  • 有并發連接較多/臨時表/復雜排序的場景,應預留更多內存給 MySQL 其他組件(連接/排序/執行計劃)。

  • 經驗起點:

    • 32GB 內存機器:innodb_buffer_pool_size = 20G ~ 24G

    • 64GB 內存機器:innodb_buffer_pool_size = 40G ~ 50G

    • 128GB+:按 70% 左右上限起步,再結合命中率與 OS cache 占用動態微調。

動態調整(8.0 支持在線調整):

-- 在線放大/縮小(注意可能觸發后臺重劃分和頁遷移,建議業務低峰)
SET GLOBAL innodb_buffer_pool_size = 32*1024*1024*1024; -- 32G

my.cnf 示例

[mysqld]
innodb_buffer_pool_size = 32G

6.1.2 innodb_buffer_pool_instances

含義:Buffer Pool 實例數量(多實例)。
影響:降低 LRU/Flush/Hash 等內部結構的鎖競爭,提高并發。
規則與推薦

  • innodb_buffer_pool_size < 1G 時,通常即便設置多個實例也實際只有 1 個

  • 實踐建議(起點值):每 1~4GB 分 1 個實例,但單實例不小于 1GB。常見總大小與實例數參考:

    • 8G:4~8 個

    • 16G:8 個

    • 32G:8 個

    • 64G:8~16 個(>8 提升有限,需壓測驗證)

查看/設置

SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';
SET GLOBAL innodb_buffer_pool_instances = 8;  -- 需重啟生效(版本依賴)

my.cnf 示例

[mysqld]
innodb_buffer_pool_size      = 32G
innodb_buffer_pool_instances = 8

6.1.3 innodb_buffer_pool_chunk_size

含義:Buffer Pool 最小分配單元(chunk)大小。
影響:影響在線調整時的內存擴展步長和內部分配效率。
建議:通常使用默認值即可;在超大內存(>256G)環境中做在線擴容時,可結合 chunk size 規劃擴容粒度,減少碎片。
查詢

SHOW VARIABLES LIKE 'innodb_buffer_pool_chunk_size';

6.1.4 innodb_max_dirty_pages_pctinnodb_max_dirty_pages_pct_lwm

含義:控制臟頁比例閾值與低水位,觸發后臺刷盤速度調整。
影響:臟頁比例過高會導致突發寫放大、檢查點推進吃力、崩潰恢復時間變長。
推薦

  • innodb_max_dirty_pages_pct:常見 70%~80%,對寫入密集場景可適當下調到 60%~70%。

  • innodb_max_dirty_pages_pct_lwm(低水位):可設 10%~20%,用于提前溫和觸發刷盤。
    查看/設置

    SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct';
    SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct_lwm';
    SET GLOBAL innodb_max_dirty_pages_pct = 75;
    SET GLOBAL innodb_max_dirty_pages_pct_lwm = 10;
    


6.1.5 innodb_io_capacityinnodb_io_capacity_max

含義:預估存儲能承受的每秒 IO 次數,后臺基于此速率安排頁刷新與合并。
影響:設置過小 → 刷盤跟不上、臟頁堆積;過大 → IO 隊列擁擠、干擾前臺查詢。
推薦(需壓測):

  • SATA SSD:innodb_io_capacity = 2000innodb_io_capacity_max = 4000

  • NVMe SSD:4000~8000 / 8000~20000

  • 云盤需參考 IOPS 限額(按 60%~70% 設定起點)。
    設置

    SET GLOBAL innodb_io_capacity = 4000;
    SET GLOBAL innodb_io_capacity_max = 10000;
    


6.1.6 innodb_flush_method

含義:數據/日志文件的刷盤方式。
常用取值O_DIRECT(推薦,避免與 OS cache 雙緩存)、fsyncO_DSYNC
建議:Linux + SSD → O_DIRECT
my.cnf

[mysqld]
innodb_flush_method = O_DIRECT

6.1.7 innodb_flush_log_at_trx_commit

含義:事務提交時 Redo Log 刷盤策略。
取值與影響

  • 1:每次提交都寫盤(最安全,常用)。

  • 2:寫 OS cache,不強制落盤(可能丟失 1s 數據)。

  • 0:每秒刷一次盤(最高性能,風險最大)。
    建議:核心金融/訂單 → 1;非關鍵日志/統計 → 可評估 2
    my.cnf

    innodb_flush_log_at_trx_commit = 1
    


6.1.8 innodb_adaptive_hash_index(AHI)

含義:自適應哈希索引,基于熱點頁構建哈希以加速查找。
影響:可提升范圍訪問與等值查找性能;高并發下也可能帶來 latch 競爭。
建議:默認開啟,有明顯 latch 競爭或掃描型負載多時可關閉或分區限制(新版本支持更細粒度開關)。
查看/設置

SHOW VARIABLES LIKE 'innodb_adaptive_hash_index';
SET GLOBAL innodb_adaptive_hash_index = OFF;

6.1.9 壓縮相關:innodb_page_size、Compressed Buffer Pool

含義:頁大小(通常 16KB),以及壓縮頁緩存機制。
影響:壓縮可提高緩存有效容量,但 CPU 開銷和解壓/重壓縮成本可能提高延遲。
建議:對冷熱數據或只讀歷史分區表可評估壓縮,核心熱點寫多表慎用或分層存儲。


6.2 配置調優的黃金法則

  1. 內存占比 60%~80% 原則
    在專用主機上,innodb_buffer_pool_size 以 70% 為上限起步,關注 OS file cache(大表全掃/備份還會用到)與其他內存消耗(連接、排序、臨時表)。

  2. 多實例分配策略
    保證單實例 ≥ 1GB,總大小 16G/32G/64G 分別配 8 實例是穩妥起點。

  3. IO 能力與臟頁閾值匹配
    innodb_io_capacity 設置為設備可承受 IOPS 的 60%~70% 起步,同時配置合理的 innodb_max_dirty_pages_pct(60%~80%),避免刷盤抖動。

  4. 日志持久化優先級
    innodb_flush_log_at_trx_commit = 1 為基線;非關鍵數據可在壓測后評估降級到 2(配合監控與告警)。

  5. O_DIRECT 減少雙緩存
    推薦 innodb_flush_method=O_DIRECT,更可控地把內存讓給 Buffer Pool。

示例:在線調整大小

-- 低峰期進行,避免頻繁 resize
SET GLOBAL innodb_buffer_pool_size = 48*1024*1024*1024; -- 48G

示例:my.cnf 基線模板

[mysqld]
innodb_buffer_pool_size        = 32G
innodb_buffer_pool_instances   = 8
innodb_buffer_pool_chunk_size  = 128M
innodb_flush_method            = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity             = 4000
innodb_io_capacity_max         = 10000
innodb_max_dirty_pages_pct     = 75
innodb_max_dirty_pages_pct_lwm = 10
innodb_adaptive_hash_index     = ON

6.3 常見配置誤區(以及修正建議)

  1. 誤區:Buffer Pool 設得越大越好

    • 問題:系統開始頻繁 swap 或壓制 OS cache,反而總體性能下降。

    • 修正:從 60%~80% 內存起步,結合命中率、swap/kswapd 指標與文件緩存使用動態微調。

  2. 誤區:多實例越多越快

    • 問題:單實例太小 → 頁局部性變差、命中率下降;實例超過 8 提升有限。

    • 修正:保證單實例≥1GB,8 為常用上限;用等待事件/互斥量指標驗證是否有明顯收益。

  3. 誤區:IO 能力設很大就能快速刷掉臟頁

    • 問題:后臺刷盤過猛擠占 IO,前臺延遲上升。

    • 修正:以設備 IOPS 的 60%~70% 為起點,觀察磁盤隊列/延遲,逐步放大。

  4. 誤區:把事務持久化策略一概降級

    • 問題:降低了風險控制,業務不可接受的數據丟失。

    • 修正:按業務安全級別分類表/庫或實例,核心庫堅持 1,非關鍵再評估。


7. 狀態監控與性能分析

本章給出從全局到細粒度的觀察點—診斷法—計算口徑,幫助你建立穩定的 Buffer Pool 運行“觀測面”。

7.1 核心監控指標(必看三件套)

下列指標可通過 SHOW STATUS LIKE 'Innodb_buffer_pool_%';SHOW ENGINE INNODB STATUS\GINFORMATION_SCHEMA / performance_schema / sys schema 獲取。

  1. Innodb_buffer_pool_pages_free

    • 含義:空閑頁數量。

    • 解讀:長期接近 0,說明 Free List 緊張,可能觸發頻繁淘汰;需要評估 buffer_pool_size 是否不足或是否有大查詢沖刷緩存。

  2. Innodb_buffer_pool_pages_data

    • 含義:數據頁數量(已使用頁)。

    • 解讀:結合 pages_totalpages_free 評估負載穩定度和緩存占用結構。

  3. Innodb_buffer_pool_pages_dirty

    • 含義:臟頁數量。

    • 解讀:與 pages_data 做比例,若長期高位(> max_dirty_pages_pct),說明后臺刷盤跟不上,需檢查 innodb_io_capacity、日志寫入、熱點更新等。

示例查詢

SHOW STATUS LIKE 'Innodb_buffer_pool_pages%';

計算:緩存命中率(粗口徑)

命中率 ≈ 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)
-- 趨近 99%+ 為理想;OLAP/冷熱數據混布時會偏低

7.2 實用的觀測與分析指令

7.2.1 快速體檢(變量/狀態/引擎報告)

-- 變量(配置)
SHOW VARIABLES LIKE 'innodb_buffer_pool%';
SHOW VARIABLES LIKE 'innodb_%io_capacity%';
SHOW VARIABLES LIKE 'innodb_flush%';-- 運行狀態
SHOW STATUS LIKE 'Innodb_buffer_pool%';-- 引擎細節(含 LRU/Flush/Hash/LOG/Checkpoint 等)
SHOW ENGINE INNODB STATUS\G

7.2.2 細粒度統計(INFORMATION_SCHEMA / SYS)

-- Buffer Pool 全局統計
SELECT * FROM information_schema.INNODB_BUFFER_POOL_STATS\G-- 實例級別(多實例時觀察冷熱分布是否均衡)
SELECT POOL_ID, POOL_SIZE, DATABASE_PAGES, FREE_BUFFERS, DIRTY_PAGES
FROM information_schema.INNODB_BUFFER_POOL_STATS
ORDER BY POOL_ID;-- SYS schema 常用視圖(部分版本差異)
SELECT * FROM sys.innodb_buffer_stats_by_schema ORDER BY pages DESC LIMIT 10;
SELECT * FROM sys.innodb_buffer_stats_by_table  ORDER BY pages DESC LIMIT 10;

7.2.3 命中率、讀放大、寫壓力

-- 命中率
SHOW STATUS LIKE 'Innodb_buffer_pool_read%';-- 隨時間的趨勢(建議結合監控系統做時序圖)
-- 冷熱數據結構分析(哪些表/索引吃掉了緩存)
SELECT object_schema, object_name, index_name, pages
FROM sys.innodb_buffer_stats_by_index
ORDER BY pages DESC
LIMIT 20;

7.3 觀測圖表(文字描述)

  • [圖5] Buffer Pool 占用結構堆疊圖(文字描述):橫軸為時間,縱軸為頁數,分層展示 free/data/dirty。能直觀看到臟頁積壓與空閑波動。

  • [圖6] 命中率與磁盤讀 IOPS 對比圖(文字描述):兩條折線,命中率下降伴隨磁盤讀 IOPS 上升,幫助定位緩存失效窗口。

  • [圖7] 多實例負載均衡柱狀圖(文字描述):按 POOL_ID 顯示 DATABASE_PAGES/DIRTY_PAGES/READS,用于判斷實例分配是否均衡。


7.4 日常維護建議(Checklist)

  1. 每周/版本變更后:檢查命中率是否 ≥ 99%(OLTP 目標);若低,評估熱點表/索引是否過大、是否需要分區/冷熱分離。

  2. 關注臟頁比例:超過 innodb_max_dirty_pages_pct 的 80%,考慮提升 innodb_io_capacity 或下調閾值并觀察寫抖動。

  3. 定期輸出 Top 占用sys.innodb_buffer_stats_by_table/index 找出“吃緩存大戶”,核對是否應被常駐緩存。

  4. 大查詢窗口控制:為全表掃描/報表跑批設置低峰、限制 READ_BUFFER_SIZE 與并發,避免沖刷熱點。

  5. 多實例均衡性:實例間 DATABASE_PAGESREADS 明顯失衡時,檢查對象分布與自增熱點(可能集中到特定頁號模)。

  6. 變更前壓測innodb_flush_methodinnodb_flush_log_at_trx_commitio_capacity 變更前務必壓測,記錄延遲與抖動。


8. 實戰案例:從故障排查到性能提升

下面給出 3+ 個典型案例,覆蓋緩存不足臟頁積壓多實例失衡大查詢沖刷等常見問題。每個案例按“現象→數據→根因→解決→驗證”展開。


8.1 案例一:高延遲查詢,Innodb_buffer_pool_reads 持續上升

現象

  • 峰值時段 API 延遲抬升,P95 從 25ms 飆到 120ms。

  • 監控顯示磁盤讀 IOPS 增加,Buffer Pool 命中率下降。

  • Innodb_buffer_pool_reads(磁盤物理讀次數)持續攀升。

數據收集

-- 命中率相關
SHOW STATUS LIKE 'Innodb_buffer_pool_read%';-- 熱點對象
SELECT object_schema, object_name, index_name, pages
FROM sys.innodb_buffer_stats_by_index
ORDER BY pages DESC LIMIT 20;-- Buffer Pool 規模與空閑
SHOW STATUS LIKE 'Innodb_buffer_pool_pages%';

根因分析

  • 新增了一個 50GB 的熱點明細表,Buffer Pool 僅 16GB,熱點索引+數據頁無法被充分容納。

  • 大量等值查詢命中分散頁,導致頻繁物理讀

解決步驟

  1. 增大 Buffer Pool:從 16G 提升到 32G(低峰在線擴容)。

    SET GLOBAL innodb_buffer_pool_size = 32*1024*1024*1024;
    

  2. 索引收斂:確認查詢條件(user_id, created_at)是否命中合適復合索引。

  3. 冷熱分層:將歷史分區轉移至較慢存儲或獨立實例,減輕熱點與冷數據混布。

驗證

  • 一周觀察:Innodb_buffer_pool_reads 與磁盤讀 IOPS 回落 40%+;命中率回到 99.6%。

  • API P95 恢復到 30ms 以下。


8.2 案例二:頻繁的磁盤 IO,Innodb_buffer_pool_pages_dirty 長期高位

現象

  • 寫多負載下,磁盤寫 IOPS 飽和,事務提交抖動,偶發超時。

  • Innodb_buffer_pool_pages_dirty 接近 pages_data 的 75% 閾值長期不下。

數據收集

SHOW STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct';
SHOW VARIABLES LIKE 'innodb_io_capacity%';
SHOW ENGINE INNODB STATUS\G  -- 查看 LOG/Checkpoint 推進

根因分析

  • innodb_io_capacity 設得過小(1000),與 NVMe 實際能力不匹配 → 后臺刷盤速率偏低

  • 應用持續寫入,臟頁堆積,CheckPoint 推進緩慢,崩潰恢復窗口被拉長。

解決步驟

  1. 提升 IO 能力參數(按設備 IOPS 的 60% 起步):

    SET GLOBAL innodb_io_capacity = 6000;
    SET GLOBAL innodb_io_capacity_max = 15000;
    
  2. 優化臟頁閾值

    SET GLOBAL innodb_max_dirty_pages_pct = 70;
    SET GLOBAL innodb_max_dirty_pages_pct_lwm = 15;
    

  3. 校驗寫放大:檢查二級索引是否冗余、是否存在熱點自增頁頻繁分裂(可通過合適的主鍵/自增策略緩解)。

驗證

  • 24 小時內 pages_dirty 比例回落到 30%~40%,檢查點推進加快,寫延遲顯著收斂。


8.3 案例三:多實例配置不合理,實例間負載不均

現象

  • INNODB_BUFFER_POOL_STATS 中不同 POOL_IDDATABASE_PAGES 差異巨大(比如一個實例占 50% 頁)。

  • 該實例的 DIRTY_PAGES/READS 也明顯偏高。

數據收集

SELECT POOL_ID, POOL_SIZE, DATABASE_PAGES, FREE_BUFFERS, DIRTY_PAGES
FROM information_schema.INNODB_BUFFER_POOL_STATS
ORDER BY DATABASE_PAGES DESC;-- 頁到實例的映射與熱點對象
SELECT * FROM sys.innodb_buffer_stats_by_table ORDER BY pages DESC LIMIT 20;

根因分析

  • 表/索引的頁號分布與 InnoDB 頁到實例的取模算法疊加,出現偶然不均衡

  • 或同一熱點表的自增寫集中在相近頁號,導致映射到特定實例。

解決步驟

  1. 微調實例數量:從 8 → 6 或 10,改變取模映射分布(需重啟)。

  2. 表重建/分區:通過 OPTIMIZE TABLE / 重新導入 / 分區重建,打散頁號分布。

  3. 熱點切分:對大表按業務維度做邏輯分庫分表或歷史分區歸檔。

驗證

  • 實例間 DATABASE_PAGES 差異收斂到 ±10% 以內;整體互斥等待下降。


8.4 案例四:跑批/全表掃描沖刷熱點,白天延遲抬升

現象

  • 夜間離線報表任務跨到工作時段,導致白天 API 延遲上升。

  • 監控顯示 LRU 冷區翻滾加劇,命中率驟降。

數據收集

SHOW STATUS LIKE 'Innodb_buffer_pool_read%';
SHOW STATUS LIKE 'Innodb_buffer_pool_pages%';
SHOW ENGINE INNODB STATUS\G -- 觀察 LRU 置換情況

根因分析

  • 大查詢/全表掃描把冷數據大量灌入 Buffer Pool,雖有中點插入策略,但仍可能在高吞吐掃描下沖刷熱點。

解決步驟

  1. 作業窗錯峰:嚴格限制跑批在業務低峰。

  2. 會話級降權:將報表連接的 read_rnd_buffer_sizeread_buffer_size 設置更小,控制并發與 fetch 大小。

  3. 冷熱分層:把報表指向只讀從庫或單獨實例;或對歷史表/分區使用壓縮+較小 Buffer Pool。

  4. 索引覆蓋:盡量用覆蓋索引減少回表頁訪問。

驗證

  • 白天命中率穩定在 99%+,磁盤讀 IOPS 平穩。


8.5 案例五:調大 innodb_buffer_pool_size 后性能沒有明顯提升

現象

  • Buffer Pool 從 32G 提升到 48G,但延遲和磁盤 IO 改善有限。

數據收集 & 根因

  • SQL 模式問題:查詢沒有命中合適索引,CPU/回表成為主要瓶頸。

  • 存儲瓶頸:寫放大/校驗/陣列緩存策略限制了寫入效率。

  • 鎖沖突:熱點行/間隙鎖/自增鎖導致響應時間主要耗在鎖等待,而非 IO。

  • 網絡/中間件:連接池/代理層限制。

解決步驟

  1. 先 SQL 再緩存:用 EXPLAIN ANALYZE 審核 Top 慢 SQL,優先索引與執行計劃優化。

  2. 觀察等待事件:鎖等待/行鎖/元數據鎖是否突出(performance_schema.events_waits_summary_by_instance)。

  3. 存儲壓測:fio 評估設備真實 IOPS/吞吐,匹配 io_capacity

  4. 端到端排查:代理/網絡超時/RT 限流等。

驗證

  • 一旦 SQL 命中索引且鎖等待下降,Buffer Pool 擴容的收益才能充分體現。


8.6 故障排查到優化的標準流程(Runbook)

  1. 癥狀確認:RT 抬升?抖動?錯誤?影響面與時間窗口。

  2. 快速面板

    • 命中率:Innodb_buffer_pool_read%

    • 頁結構:Innodb_buffer_pool_pages_%

    • 臟頁與檢查點:SHOW ENGINE INNODB STATUS\G(LOG/Checkpoint)

    • 實例分布:INNODB_BUFFER_POOL_STATS

  3. 定位類型:讀多/寫多/混合;大查詢/短事務;熱點表/索引。

  4. 采取動作(一次只改一件事,觀察 1~2 小時):

    • 增/減 buffer_pool_size(低峰在線)

    • 調整 io_capacitymax_dirty_pages_pct

    • 優化索引、拆分查詢、限制全掃并發

    • 多實例均衡/重建散列

  5. 驗證與回滾點:記錄前后關鍵指標與業務 RT,確保可回退。

  6. 固化與自動化:把閾值、報警、變更劇本寫入 SRE Runbook。


8.7 常見問答(FAQ)

Q1:如何判斷 Buffer Pool 是否配置合理?

  • 觀察命中率(OLTP 目標 ≥ 99%)、磁盤讀 IOPS 是否在合理區間;

  • Innodb_buffer_pool_pages_free 不應長期為 0;

  • 臟頁比例不應長期高于 innodb_max_dirty_pages_pct

  • 多實例間 DATABASE_PAGES/READS 差異不大(±10%);

  • 壓測對比:把 buffer_pool_size 增減 20% 驗證收益是否邊際遞減。

Q2:為什么把 innodb_buffer_pool_size 調大了,性能還是沒提升?

  • 常見是索引與鎖問題,而非 IO。請優先用 EXPLAIN ANALYZE 與等待事件分析。

  • 也可能是寫路徑飽和(Redo/Checkpoint/FS/陣列),需要 io_capacity 與刷盤參數聯動優化。

Q3:多實例配置下如何平衡負載?

  • 優先保證單實例≥1GB,實例總數 8 左右;

  • 如仍失衡:微調實例數改變取模分布、重建熱點表打散頁號、分區或分庫分表。

Q4:AHI(Adaptive Hash Index)會不會拖慢性能?

  • 高并發寫/掃描場景下可能引發 latch 競爭,可關閉或限制;以壓測為準。

  • 在等值查找熱點集中時,AHI 能提供顯著收益。

Q5:是否建議開啟壓縮頁來“擴大”緩沖池有效容量?

  • 對歷史/冷數據或報表類只讀表合適;

  • 對實時寫多的熱點表不建議啟用,避免 CPU 壓力與重壓縮開銷。


8.8 配置與查詢代碼小抄(便于貼到工單/腳本)

-- 1) 命中率
SHOW STATUS LIKE 'Innodb_buffer_pool_read%';-- 2) 頁結構
SHOW STATUS LIKE 'Innodb_buffer_pool_pages%';-- 3) 引擎細節(含 LOG/Checkpoint)
SHOW ENGINE INNODB STATUS\G-- 4) 多實例與占用
SELECT POOL_ID, POOL_SIZE, DATABASE_PAGES, FREE_BUFFERS, DIRTY_PAGES
FROM information_schema.INNODB_BUFFER_POOL_STATS
ORDER BY POOL_ID;-- 5) 誰在吃緩存
SELECT * FROM sys.innodb_buffer_stats_by_table ORDER BY pages DESC LIMIT 20;
SELECT * FROM sys.innodb_buffer_stats_by_index ORDER BY pages DESC LIMIT 20;-- 6) 在線調整(低峰)
SET GLOBAL innodb_buffer_pool_size = 32*1024*1024*1024;
SET GLOBAL innodb_io_capacity = 6000;
SET GLOBAL innodb_io_capacity_max = 15000;
SET GLOBAL innodb_max_dirty_pages_pct = 70;

my.cnf 參考片段(最終以壓測為準)

[mysqld]
innodb_buffer_pool_size        = 32G
innodb_buffer_pool_instances   = 8
innodb_flush_method            = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity             = 4000
innodb_io_capacity_max         = 10000
innodb_max_dirty_pages_pct     = 75
innodb_max_dirty_pages_pct_lwm = 10
innodb_adaptive_hash_index     = ON

8.9 小結(帶記憶鉤子)

  • 大小先于一切buffer_pool_size 決定命中率的天花板;

  • 穩住寫路io_capacitymax_dirty_pages_pct 搭配,避免臟頁雪崩;

  • 分而治之:多實例緩解互斥,但別把實例做小;

  • 先 SQL 再緩存:索引/鎖/執行計劃是第一生產力;

  • 觀測閉環:以命中率、臟頁、檢查點、實例均衡四指標為日常看板。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94421.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS Pro 安裝路徑避坑指南:從崩潰根源到規范實操(附問題修復方案)

作為 GIS 從業者&#xff0c;你是否遇到過這些糟心場景&#xff1a;ArcGIS Pro 雙擊啟動無響應、運行中突然彈出 “Runtime Error” 崩潰、加載矢量數據時提示 “找不到指定文件”&#xff1f;排查半天后發現&#xff0c;這些問題的 “元兇” 竟藏在安裝路徑里 —— 中文路徑或…

Python 實戰:內網滲透中的信息收集自動化腳本(2)

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

批量轉雙層PDF軟件:高效轉換,提升文檔管理效率

在文檔管理和信息檢索中&#xff0c;雙層PDF文件因其獨特的結構而備受青睞。雙層PDF文件不僅保留了原始文檔的外觀&#xff0c;還增加了對文檔內容進行搜索和選擇的功能&#xff0c;極大地提高了文檔管理和信息檢索的效率。批量轉雙層PDF軟件正是為了解決這一需求而設計的&…

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(七) 鼠標在控件上懸浮時的提示

文本提示on_hover_text ui.label("標簽").on_hover_text("這是一個標簽"); ui.text_edit_singleline(&mut edittext).on_hover_text("這是輸入框"); if ui.button("提交").on_hover_text("這是一個按鈕").clicked(){}提…

【NVIDIA-B200】生產報錯 Test CUDA failure common.cu:1035 ‘system not yet initialized‘

目錄 1. 檢查 NVIDIA 驅動狀態 2. 驗證 CUDA 安裝情況 3. 檢查相關服務運行狀態(多 GPU 場景關鍵) 4. 用簡單 CUDA 程序驗證基礎功能 5. 重啟系統 6. 排查硬件相關問題 7.實際生產解決步驟 報錯日志: # Collective test starting: all_reduce_perf # nThread 1 nGpu…

ansible playbook 實戰案例roles | 實現基于nfs的日志歸檔

文章目錄一、核心功能描述二、roles內容2.1 文件結構2.2 tasks文件內容2.3 files文件內容免費個人運維知識庫&#xff0c;歡迎您的訂閱&#xff1a;literator_ray.flowus.cn 一、核心功能描述 這個 Ansible Role 的核心功能是&#xff1a;?實現自動化日志歸檔系統&#xff0c…

RabbitMQ:技巧匯總

目錄一、基礎知識1.1、RabbitMQ&#xff1a;Windows版本安裝部署1.2、RabbitMQ&#xff1a;Linux版本安裝部署1.3、RabbitMQ&#xff1a;數據隔離1.4、RabbitMQ&#xff1a;交換機&#xff08;Exchange&#xff09;1.5、RabbitMQ&#xff1a;SpringAMQP入門案例1.6、RabbitMQ&a…

【ARM vs RISC-V:芯片架構雙雄爭霸,誰將主宰AI時代?】

2010年&#xff0c;加州大學伯克利分校的實驗室誕生了一個顛覆性的構想——RISC-V開源指令集。誰曾想&#xff0c;這個學術項目會在15年后讓芯片巨頭ARM如臨大敵&#xff1f;2025年7月&#xff0c;ARM悄悄上線riscv-basics.com質疑網站又緊急撤下的戲劇性事件&#xff0c;揭開了…

深入理解紋理與QtOpenGL的實現

引言 在現代計算機圖形學中&#xff0c;紋理&#xff08;Texture&#xff09;是增強三維模型視覺效果的重要工具。通過將二維圖像映射到三維模型表面&#xff0c;紋理可以為簡單的幾何形狀添加復雜的細節和真實感。OpenGL作為廣泛使用的圖形庫&#xff0c;提供了強大的紋理處理…

CrystalDiskInfo中文版(硬盤檢測工具) 中文版

獲取地址&#xff1a;硬盤檢測工具 Process Lasso是一款獨特的調試進程級別的系統優化工具&#xff0c;主要功能是基于其特別的算法動態調整各個進程的優先級并設為合理的優先級以實現為系統減負的目的&#xff0c;可有效避免藍屏、假死、進程停止響應、進程占用 CPU 時間過多…

K8S集群-基于Ingress資源實現域名訪問

目錄 一、準備 1、在master節點部署ingress的資源清單文件 2、在node節點部署ingress-1.11.tar鏡像&#xff08;根據部署環境選擇版本&#xff09; 二、基于NodePort模式驗證 1、在master節點進入ingress的資源清單文件 2、修改deploy.yaml文件 3、生成deploy.yaml資源 4…

iOS 數據持久化

&#x1f4f1; iOS數據持久化 ? 核心概念 數據持久化是指將內存中的數據以特定格式保存到持久存儲介質&#xff08;如硬盤&#xff09;的過程&#xff0c;使得應用重啟后數據依然可用。在iOS中&#xff0c;由于沙盒機制的限制&#xff0c;應用只能訪問自己沙盒內的文件。 沙盒…

數據結構 -- 樹

一、樹的基本概念&#xff08;一&#xff09;定義樹是由 n&#xff08;n ≥ 0&#xff09; 個結點組成的有限集合&#xff0c;是一種非線性層次結構&#xff1a;當 n 0 時&#xff0c;稱為空樹&#xff1b;當 n > 0 時&#xff0c;存在唯一的根結點&#xff08;無前驅結點&…

單片機---------WIFI模塊

1.ESP-12F模組基礎知識ESP12-F模組&#xff08;安信可&#xff08;Ai-Thinker&#xff09;ESP8266系列模組&#xff09;是一款基于樂鑫&#xff08;Espressif&#xff09;公司ESP8266芯片的Wi-Fi無線通信模塊&#xff0c;廣泛應用于物聯網&#xff08;IoT&#xff09;領域。它體…

迅為RK3562開發板Android修改uboot logo

本文檔配套資料在網盤資料“iTOP-3562 開發板\02_【iTOP-RK3562 開發板】開發資料\07_Android 系統開發配套資料\05_Android 修改 uboot logo 配套資料”路徑下。1 準備 logo系統默認 uboot logo&#xff0c;如下圖所示&#xff1a;我們如果想要替換這個 logo,首先要制作一個新…

反催收APP開發思路:用Flutter打造證據鏈管理工具

針對非法催收問題&#xff0c;熊哥分享了一款反催收APP的開發思路&#xff0c;旨在幫助“誠而不幸”的負債人收集騷擾證據&#xff0c;通過Flutter實現跨平臺部署。本文整理其核心功能與技術方案&#xff0c;助力開發者快速上手&#xff01;一、核心功能&#xff1a;證據收集與…

市政道路井蓋缺失識別誤報率↓82%!陌訊多模態融合算法實戰優化與邊緣部署

原創聲明本文為原創技術解析文章&#xff0c;核心技術參數、架構設計及實戰數據引用自 “陌訊技術白皮書”&#xff0c;文中算法實現與優化方案均基于實測驗證&#xff0c;禁止未經授權轉載或篡改內容。一、行業痛點&#xff1a;市政井蓋識別的 “三大攔路虎”市政道路井蓋作為…

navicat及SQLyog的下載和安裝

navicat安裝和使用navicat下載和安裝navicat 下載navicat 的安裝SQLyog下載和安裝SQLyog 的下載SQLyog 的安裝連接到MySQL數據庫navicat下載和安裝 navicat 下載 navicat下載地址 這兩個都是滿足我們需求的&#xff0c;均可 這樣我們就得到了一個雙擊可執行的exe文件 navic…

在TencentOS3上部署OpenTenBase:從入門到實戰的完整指南

文章目錄前言初識OpenTenBase&#xff1a;不只是又一個分布式數據庫OpenTenBase的核心特性環境準備系統環境檢查安裝必要的依賴包用戶環境配置&#xff1a;安全第一創建專用用戶配置SSH免密登錄&#xff08;單機部署也需要&#xff09;源碼編譯&#xff1a;從零開始構建獲取源碼…

flink常見問題之超出文件描述符限制

引言Apache Flink 是一個強大且流行的流處理框架&#xff0c;它支持高吞吐量和低延遲的數據處理。在處理大規模數據流時&#xff0c;Flink 用戶可能會遇到各種性能瓶頸&#xff0c;其中之一就是文件描述符的限制。文件描述符是操作系統用來表示打開文件或其他輸入/輸出資源的一…