InnoDB引擎底層解析(二)之InnoDB的Buffer Pool(三)

Buffer Pool 實例

我們上邊說過,Buffer Pool 本質是 InnoDB 向操作系統申請的一塊連續的內存空間,在多線程環境下,訪問 Buffer Pool 中的各種鏈表都需要加鎖處理,在Buffer Pool特別大而且多線程并發訪問特別高的情況下,單一的 Buffer Pool 可能會影響請求的處理速度。所以在 Buffer Pool 特別大的時候,我們可以把它們拆分成若干個小的 Buffer Pool ,每個 Buffer Pool 都稱為一個實例,它們都是獨立的,獨立地去申請內存空間,獨立的管理各種鏈表,所以在多線程并發訪問時并不會相互影響,從而提高并發處理能力。

我們可以在服務器啟動的時候,通過設置innodb_buffer_pool_instances的值來修改Buffer Pool實例的個數,那每個Buffer Pool實例實際占多少內存空間呢?其實使用這個公式算出來的:

innodb_buffer_pool_size/innodb_buffer_pool_instances

也就是每個 Buffer Pool 實例占用的大小等于 buffer pool 緩沖池總共的大小除以實例的個數。

innodb_buffer_pool_chunk_size

在MySQL 5.7.5之前,Buffer Pool 的大小只能在服務器啟動時通過配置innodb_buffer_pool_size啟動參數來調整大小,在服務器運行過程中是不允許調整該值的。不過 MySQL 在5.7.5以及之后的版本中支持了在服務器運行過程中調整 Buffer Pool 大小的功能,但是有一個問題,就是每次當我們要重新調整 Buffer Pool 大小時,都需要重新向操作系統申請一塊連續的內存空間,然后將舊的 Buffer Pool 中的內容復制到這一塊新空間,這是極其耗時的。所以 MySQL 決定不再一次性為某 Buffer Pool 實例向操作系統申請一大片連續的內存空間,而是以一個所謂的 chunk 為單位向操作系統申請空間。也就是說一個 Buffer Pool 實例其實是由若干個 chunk 組成的,一個 chunk 就代表一片連續的內存空間,里邊兒包含了若干緩存頁與其對應的控制塊:
在這里插入圖片描述
正是因為發明了這個 chunk 的概念,我們在服務器運行期間調整 Buffer Pool 的大小時就是以chunk為單位增加或者刪除內存空間,而不需要重新向操作系統申請一片大的內存,然后進行緩存頁的復制。這個所謂的 chunk 的大小是我們在啟動操作MySQL服務器時通過innodb_buffer_pool_chunk_size啟動參數指定的,它的默認值是134217728,也就是128M。不過需要注意的是,innodb_buffer_pool_chunk_size的值只能在服務器啟動時指定,在服務器運行過程中是不可以修改的。

show variables like 'innodb_buffer_pool_chunk_size';

在這里插入圖片描述
Buffer Pool 的緩存頁除了用來緩存磁盤上的頁面以外,還可以存儲鎖信息、自適應哈希索引等信息。

查看Buffer Pool的狀態信息

MySQL 給我們提供了 SHOW ENGINE INNODB STATUS 語句來查看關于 InnoDB 存儲引擎運行過程中的一些狀態信息,其中就包括 Buffer Pool 的一些信息,我們看一下(為了突出重點,我們只把輸出中關于 Buffer Pool 的部分提取了出來):

show engine innodb status\G

這里邊的每個值都代表什么意思如下,知道即可:
在這里插入圖片描述

  • Total large memory allocated: 代表 Buffer Pool 向操作系統申請的連續內存空間大小,包括全部控制塊、緩存頁、以及碎片的大小。
  • Dictionary memory allocated: 為數據字典信息分配的內存空間大小,注意這個內存空間和Buffer Pool沒啥關系,不包括在Total memory allocated中。
  • Buffer pool size: 代表該Buffer Pool可以容納多少緩存頁,注意,單位是頁
  • Free buffers: 代表當前Buffer Pool還有多少空閑緩存頁,也就是free鏈表中還有多少個節點。
  • Database pages: 代表LRU鏈表中的頁的數量,包含young和old兩個區域的節點數量。
  • Old database pages: 代表LRU鏈表old區域的節點數量。
  • Modified db pages:代表臟頁數量,也就是flush鏈表中節點的數量。
  • Pending reads:正在等待從磁盤上加載到Buffer Pool中的頁面數量。
  • Pending writes
    • LRU:即將從LRU鏈表中刷新到磁盤中的頁面數量。
    • flush list:即將從flush鏈表中刷新到磁盤中的頁面數量。
    • single page:即將以單個頁面的形式刷新到磁盤中的頁面數量。
  • Pages made young:代表LRU鏈表中曾經從old區域移動到young區域頭部的節點數量
  • Page made not young :在將innodb_old_blocks_time設置的值大于0時,首次訪問或者后續訪問某個處在old區域的節點時由于不符合時間間隔的限制而不能將其移動到young區域頭部時,Page made not young的值會加1。
  • **youngs/s:**代表每秒從old區域被移動到young區域頭部的節點數量。
  • **non-youngs/s:**代表每秒由于不滿足時間限制而不能從old區域移動到young區域頭部的節點數量。
  • Pages read、created、written:代表讀取,創建,寫入了多少頁。后邊跟著讀取、創建、寫入的速率。
  • **Buffer pool hit rate:**表示在過去某段時間,平均訪問1000次頁面,有多少次該頁面已經被緩存到Buffer Pool了。
  • young-making rate:表示在過去某段時間,平均訪問1000次頁面,有多少次訪問使頁面移動到young區域的頭部了。
  • not(young-making rate):表示在過去某段時間,平均訪問1000次頁面,有多少次訪問沒有使頁面移動到young區域的頭部。
  • LRU len:代表LRU鏈表中節點的數量。
  • unzip_LRU:代表unzip_LRU鏈表中節點的數量。
  • I/O sum:最近50s讀取磁盤頁的總數。
  • I/O cur:現在正在讀取的磁盤頁數量。
  • I/O unzip sum:最近50s解壓的頁面數量。
  • I/O unzip cur:正在解壓的頁面數量。

InnoDB的內存結構總結

InnoDB的內存結構和磁盤存儲結構圖總結如下:
在這里插入圖片描述
其中的 Insert/Change Buffer 主要是用于對二級索引的寫入優化,Undo空間則是undo日志一般放在系統表空間,但是通過參數配置后,也可以用獨立表空間存放,所以用虛線表示。

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

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

相關文章

Netty學習專欄(三):Netty重要組件詳解(Future、ByteBuf、Bootstrap)

文章目錄 前言一、Future & Promise:異步編程的救星1.1 傳統NIO的問題1.2 Netty的解決方案1.3 代碼示例:鏈式異步操作 二、ByteBuf:重新定義數據緩沖區2.1 傳統NIO ByteBuffer的缺陷2.2 Netty ByteBuf的解決方案2.3 代碼示例:…

Vue3逐步拋棄虛擬Dom,React如何抉擇

虛擬DOM:前端界的替死鬼 這玩意兒就是個前端開發的充氣娃娃! 你以為它很牛逼?無非是給真DOM當替死鬼! 每次數據變,虛擬DOM先擱內存里自嗨一頓,diff算法跟便秘似的算半天,最后才敢碰真DOM。 說白…

分布式鎖總結

文章目錄 分布式鎖什么是分布式鎖?分布式鎖的實現方式基于數據庫(mysql)實現基于緩存(redis)多實例并發訪問問題演示項目代碼(使用redis)配置nginx.confjmeter壓測復現問題并發是1,即不產生并發問題并發30測試,產生并發問題(雖然單實例是synchronized&am…

解決自簽名證書HTTPS告警:強制使用SHA-256算法生成證書

解決自簽名證書HTTPS告警:強制使用SHA-256算法生成證書 一、問題場景 在使用OpenSSL生成和配置自簽名證書時,常遇到以下現象: 瀏覽器已正確導入根證書(.pem文件),但訪問HTTPS站點時仍提示不安全連接或證…

線上 Linux 環境 MySQL 磁盤 IO 高負載深度排查與性能優化實戰

目錄 一、線上告警 二、問題診斷 1. 系統層面排查 2. 數據庫層面分析 三、參數調優 1. sync_binlog 參數優化 2. innodb_flush_log_at_trx_commit 參數調整 四、其他優化建議 1. 日志文件位置調整 2. 生產環境核心參數配置模板 3. 突發 IO 高負載應急響應方案 五、…

window 顯示驅動開發-初始化和 DMA 緩沖區創建

若要指示 GPU 支持 GDI 硬件加速,顯示微型端口驅動程序的 DriverEntry 函數實現必須使用指向驅動程序實現的 DxgkDdiRenderKm 函數的指針填充 DRIVER_INITIALIZATION_DATA 結構的 DxgkDdiRenderKm 成員。 DirectX 圖形內核子系統調用 DxgkDdiRenderKm 函數&#xf…

Go語言實戰:使用 excelize 實現多層復雜Excel表頭導出教程

Go 實現支持多層復雜表頭的 Excel 導出工具 目錄 項目介紹依賴說明核心結構設計如何支持多層表頭完整使用示例總結與擴展 項目介紹 在實際業務系統中,Excel 文件導出是一項常見功能,尤其是報表類需求中常見的復雜多級表頭,常規表格組件往…

機器視覺6-halcon高級教程

機器視覺6-halcon高級教程 雙目立體視覺原理視差外極線幾何雙目標定 雙目立體視覺之Halcon標定一.標定結果二.Halcon標定過程1.獲取左右相機圖像中標定板的區域;2.提取左右相機圖像中標定板的MARK點坐標和攝像機外部參數;3.執行雙目標定;4.獲取非標準外極線幾何到標…

板凳-------Mysql cookbook學習 (六)

2025年Pytorch-gpu版本安裝(各種情況適用自己的安裝需求,親測絕對有效,示例安裝torch2.6.0,過程詳細面向小白)_torch gpu版本-CSDN博客 https://blog.csdn.net/OpenSeek/article/details/145795127 2.2 查錯 import s…

Spring boot和SSM項目對比

目錄對比 springboot目錄 project├─src│ ├─main│ │ ├─java│ │ │ ├─com.example.demo│ │ │ │ ├─config // 存放SpringBoot的配置類│ │ │ │ ├─controller // 存放控制器類│ │ │ │ ├─entity // 存…

《關于潯川社團退出DevPress社區及內容撤回的聲明》

《關于潯川社團退出DevPress社區及內容撤回的聲明》 尊敬的DevPress社區及讀者: 經潯川社團內部決議,我社決定自**2025年5月26日**起正式退出DevPress社區,并撤回所有由我社成員在該平臺發布的原創文章。相關事項聲明如下: …

Python性能優化利器:__slots__的深度解析與避坑指南

核心場景:當需要創建數百萬個屬性固定的對象時,默認的__dict__字典存儲會造成巨大內存浪費。此時__slots__能通過元組結構取代字典,顯著提升內存效率(實測節省58%內存)! 底層原理:為何能節省內…

Go 語言中的 Struct Tag 的用法詳解

在 Go 語言中,結構體字段標簽(Struct Tag) 是一種用于給字段添加元信息(metadata)的機制,常用于序列化(如 JSON、XML)、ORM 映射、驗證等場景。你在開發 Web 應用或處理數據交互時&a…

微軟正式發布 SQL Server 2025 公開預覽版,深度集成AI功能

微軟在今年的 Build 2025 大會上正式發布了 SQL Server 2025 公開預覽版,標志著這一經典數據庫產品在 AI 集成、安全性、性能及開發者工具方面的全面升級。 AI 深度集成與創新 原生向量搜索:SQL Server 2025 首次將 AI 功能直接嵌入數據庫引擎&#xff…

React從基礎入門到高級實戰:React 基礎入門 - React 的工作原理:虛擬 DOM 與 Diff 算法

React 的工作原理:虛擬 DOM 與 Diff 算法 引言 React 是現代前端開發的明星框架,它的出現徹底改變了我們構建用戶界面的方式。無論是動態的 Web 應用還是復雜的單頁應用(SPA),React 都能以高效的渲染機制和簡潔的組件…

解釋一下NGINX的反向代理和正向代理的區別?

大家好,我是鋒哥。今天分享關于【解釋一下NGINX的反向代理和正向代理的區別?】面試題。希望對大家有幫助; 解釋一下NGINX的反向代理和正向代理的區別? NGINX的反向代理和正向代理的區別主要體現在它們的功能和使用場景上。下面我會詳細解釋它們的定義…

Python學習——執行python時,鍵盤按下ctrl+c,退出程序

在 Python 中,當用戶按下 CtrlC 時,程序默認會觸發 KeyboardInterrupt 異常并終止。 1. 捕獲 KeyboardInterrupt 異常(推薦) 使用 try-except 塊直接捕獲 KeyboardInterrupt 異常,適用于簡單場景。 示例代碼&#xff…

C++ 反向迭代器(Reverse Iterator)實現詳解

目錄 1. 反向迭代器概述 2. 代碼實現分析 3. 關鍵點解析 3.1 模板參數設計 3.2 核心操作實現 4. 使用示例 1. 反向迭代器概述 反向迭代器是STL中一種重要的適配器,它允許我們以相反的順序遍歷容器。本文將詳細講解如何實現一個自定義的反向迭代器模板類。 2.…

動態DNS管理:【etcd+CoreDNS】 vs【BIND9】便捷性對比

對比 BIND9 集群和 etcdCoreDNS 集群在便捷性方面,通常情況下,對于需要動態、頻繁變更 DNS 記錄以及追求云原生和自動化集成的場景,etcdCoreDNS 方案更加便捷。 然而,“便捷性”也取決于具體的應用場景、團隊的技術棧和運維習慣。…

基于大模型的短暫性腦缺血發作預測與干預全流程系統技術方案大綱

目錄 一、系統概述二、系統架構(一)數據采集層(二)大模型核心層(三)應用服務層(四)數據存儲與管理層三、全流程技術方案(一)術前階段(二)術中階段(三)術后階段(四)并發癥風險預測(五)手術方案制定(六)麻醉方案制定(七)術后護理(八)統計分析(九)技術驗…