調節磁盤和CPU的矛盾——InnoDB的Buffer Pool

緩存的重要性

  • 無論是用于存儲用戶數據的索引【聚簇索引、二級索引】還是各種系統數據,都是以頁的形式存放在表空間中【對一個/幾個實際文件的抽象,存儲在磁盤上】
  • 如果需要訪問某頁的數據,就會把完整的頁數據加載到內存中【即使只訪問頁中的一條記錄】,在讀寫訪問之后不立即釋放該頁的內存空間,將其緩存起來,下次請求訪問該頁面就可以省下磁盤I/O開銷

Buffer Pool

  • 在MySQL服務器啟動時就向操作系統申請一片連續的內存,innodb_buffer_pool_size【不包含控制塊所占的內存空間大小】
    BufferPool內部組成

  • 連續的內存被劃分為若干個頁面【緩沖頁】,頁面大小與InnoDB表空間使用的頁面大小一致【默認16KB】

  • 控制信息【所屬的表空間編號、頁號、緩沖頁在Buffer Pool中的地址、鏈表節點信息等】-方便管理

  • 控制信息占用的一塊內存稱為控制塊,與緩沖頁一一對應

  • 在這里插入圖片描述

  • 碎片-剩余空間不夠一對控制塊和緩沖頁的大小

    • 在debug模式下控制塊占緩沖頁大小的5%左右,在非debug模式下控制塊模塊會更小點

free鏈表管理

在這里插入圖片描述

  • Buffer Pool初始化過程

    • 向操作系統申請Buffer Pool的內存空間
    • 劃分為若干對控制塊和緩沖頁【沒有真實的磁盤頁被緩存到Buffer Pool中(還沒用到)】
    • 隨著程序運行,磁盤的頁不斷被緩存到Buffer Pool中
      • 當磁盤讀取一個頁到緩沖池中,該放到哪個緩沖頁【哪個緩沖頁是空閑的】
      • 需要查看緩沖頁對應的控制塊
        • 將所有空閑的緩沖頁控制塊作為一個節點放在一個鏈表中【free鏈表、空閑鏈表】
          • 為了管理好free鏈表,定義一個基節點【包含鏈表的頭節點地址、尾節點地址、當前鏈表中節點的數量等信息】
          • 基節點占用的內存空間不包含在Buffer Pool申請的內存空間內,而是單獨申請的一塊內存空間【一般40字節】
      • 每當磁盤加載一個頁到Buffer Pool中,就從空閑鏈表中取一個控制塊對應的緩沖頁(從鏈表取控制塊,通過控制塊訪問真正的頁),然后把該緩沖頁對應的free鏈表節點【對應的控制塊】從鏈表中移除,表示該緩沖頁被使用
  • 緩沖頁的哈希處理

    • 表空間號+頁號【key】來定位一個頁,緩沖頁控制塊【value】
    • 需要訪問某個頁的數據時,先從哈希表中根據表空間號+頁號看是否有對應緩沖頁
      • 有-直接使用
      • 沒有-從free鏈表中選一個空閑的緩沖頁,把磁盤中對應的頁加載到該緩沖頁的位置
  • flush鏈表的管理
    在這里插入圖片描述

    • 存儲臟頁的鏈表【Buffer Pool中修改過的,還未刷新到磁盤上的頁】
    • 某個緩沖頁對應的控制塊不可能既是free鏈表的節點,也是 flush鏈表的節點【不可能既是臟頁也是空閑頁】
  • LRU鏈表的管理

    • Buffer Pool命中率越高越好【命中次數/訪問了n頁】
    • 簡單的LRU鏈表
      • 使用到某個緩沖頁,就把該頁從磁盤加載到Buffer Pool中時,把該頁對應的控制塊作為節點塞到LRU鏈表的頭部
      • 當空閑緩沖頁使用完時,到LRU鏈表的尾部淘汰緩沖頁
    • 劃分區域的LRU鏈表
      • 簡單LRU鏈表存在情況
        • InnoDB提供了預讀服務,認為執行當前請求時,可能會在后面讀取到某些頁面就預先把這些頁面加載到Buffer Pool中,如果預讀成功可以極大提高執行效率,但如果用不到的話,前面所說的鏈表就會存在問題,Buffer Pool的命中率會大大降低【加載到Buffer Pool中的頁不一定被用到】
          • 線性預讀
            • 如果順序訪問的某個區(extent)的頁面超過了系統變量innodb_read_ahead_threshold【一般默認56,服務器啟動時通過啟動選項來調整,或者使用SET GLOBAL命令來修改該全局變量】,會觸發一次異步讀取下一個區中全部的頁面到Buffer Pool中
          • 隨機預讀
            • 如果某個區的13個連續頁面被加載到Buffer Pool中【也就是指在后面提到的整個young區域的頭1/4】,無論是否是順序讀取,都會觸發一次異步讀取本區中所有其他頁面到Buffer Pool中的請求
            • 全局變量innoddb_random_read_ahead系統變量,默認值為OFF,不會默認開啟隨機預讀功能
        • 全表掃描,全部葉子節點讀一遍,后續執行其他語句時,又要把前面被淘汰的頁面加載進Buffer Pool中【如果有很多使用頻率低的頁被同時加載到Buffer Pool中,可能會把使用頻率高的頁從Buffer Pool中淘汰掉
      • 將LRU鏈表分為兩節
        • 一部分存儲使用頻率高的緩沖頁【這部分鏈表叫熱數據young區域】

        • 另一部分存儲使用頻率低的緩沖頁【冷數據old區域】

        • 在這里插入圖片描述

        • 隨著程序的運行,某個節點所屬的區域也可能發生變化

        • old區域大小可通過innodb_old_blocks_pct修改【一般3/8】

        • 在對某個處于old區域的緩沖頁進行第一次訪問時,就在它對應的控制塊中記錄下這個訪問時間,如果后續的訪問時間與第一次訪問的時間在innodb_old_blocks_times時間間隔內,那么該頁面就不會從old區域移到young區域的頭部【可能是一次全表掃描的多次訪問】

      • 進一步優化 LRU鏈表
        • 只有被訪問頁位于young區域1/4的后面時,才回被移動到LRU鏈表頭部,可以降低調整LRU鏈表的頻率,提升性能【減少鏈表的節點移動】
        • 優化核心:盡量高效地提高Buffer Pool命中率

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

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

相關文章

springboot和springcloud的區別

1. ?目的與功能? ?1)Spring Boot?: 主要用于快速構建獨立的、生產級的 Spring 應用程序。它通過自動配置和嵌入式服務器等特性,簡化了微服務的開發、啟動和部署,使開發者能夠專注于業務邏輯而非繁瑣的配置。?Spring Boot是一個快速開發的框架,旨在簡化Java應用程序的開…

耘想WinNAS:以聊天交互重構NAS生態,開啟AI時代的存儲革命

一、傳統NAS的交互困境與范式瓶頸 在傳統NAS(網絡附加存儲)領域,用戶需通過復雜的圖形界面或命令行工具完成文件管理、權限配置、數據檢索等操作,學習成本高且效率低下。例如,用戶若需搜索特定文件,需手動…

在斷網的時候,websocket 一直在CLOSING 狀態

現象 websocket 先連接成功,然后斷網。 由于維護了一套心跳機制,前端發起心跳,如果一段時間內沒有收到服務端返回的心跳。則表示連接斷開。 用心跳的方式處理斷網的兜底情況。 然而,此時網絡是斷開的,在代碼中直接調…

基于AWS的大模型調用場景:10大成本優化實戰方案

大模型訓練與推理是AI領域的計算密集型場景,如何在AWS上實現高性能與低成本的雙重目標?本文從實例選型、彈性伸縮、存儲優化等角度,分享10個經過驗證的AWS成本優化策略,幫助企業節省30%以上成本。 一、大模型場景的成本痛點分析 計…

【網絡原理】TCP/IP協議五層模型

目錄 一. 協議的分層 二. OSI七層網絡協議 三. TCP/IP五層網絡協議 四. 網絡設備所在分層 五. 封裝 六. 分用 七. 傳輸中的封裝和分用 八. 數據單位術語 一. 協議的分層 常見的分層為兩種OSI七層模型和TCP/IP五層模型 為什么要協議分層? 在網絡通信中&…

科技快訊 | 阿里云百煉MCP服務上線;英偉達官宣:CUDA 工具鏈將全面原生支持 Python

李飛飛團隊最新AI報告:中美模型性能差距近乎持平 4月8日,斯坦福大學以人為本人工智能研究所發布《2025年人工智能指數報告》。報告顯示,2023年AI性能顯著提升,AI應用加速,投資增長,中美AI模型差距縮小。報告…

貓咪如廁檢測與分類識別系統系列【三】融合yolov11目標檢測

? 前情提要 家里養了三只貓咪,其中一只布偶貓經常出入廁所。但因為平時忙于學業,沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關,頻繁如廁可能是泌尿問題,停留過久也可能是便秘或不適。為了更科學地了解牠…

2025年燃氣證書:傳承與發展的行業紐帶

回溯歷史長河,能源的利用與人類文明的發展息息相關。從遠古時期的鉆木取火,到如今廣泛應用的燃氣能源,每一次能源的變革都推動著社會的巨大進步。而在現代燃氣行業蓬勃發展的背后,燃氣從業人員資格證書正扮演著傳承與發展的重要紐…

在Ubuntu下進行單片機開發是否需要關閉Secure Boot

1. Secure Boot的作用 功能:Secure Boot是UEFI的安全功能,旨在阻止未經驗證的驅動或操作系統啟動,防止惡意軟件篡改引導過程。 影響范圍:它主要限制的是操作系統啟動階段加載的內核級驅動(如顯卡驅動、虛擬化模塊&…

國達陶瓷重磅推出陶瓷羅馬柱外墻整裝尖端新產品“冠巖臻石”

近日,記者在佛山國達建材有限公司(以下簡稱國達陶瓷)董事長楊建平處了解到,該公司重磅推出的“冠巖臻石”新產品,是屬于陶瓷羅馬柱外墻整裝產品中的尖端產品。新產品自面市之后,深受高端用戶的青睞與認可。…

【分享】Ftrans文件擺渡系統:既保障傳輸安全,又提供強集成支持

【分享】Ftrans文件擺渡系統:既保障傳輸安全,又提供強集成支持! 在數字化浪潮中,企業對數據安全愈發重視,網絡隔離成為保護核心數據的關鍵防線,比如隔離成研發網-辦公網、生產網-測試網、內網-外網等。網絡…

實驗一 字符串匹配實驗

一、實驗目的 1.熟悉匯編語言編程環境和DEBUG調試程序的使用。 2.掌握鍵盤輸入字符串的方法和分支程序的設計。 二、實驗內容 編程實現:從鍵盤分別輸入兩個字符串,然后進行比較,若兩個字符串的長度…

添加登錄和注冊功能

先寫前端再寫后端 前提&#xff1a;ideavue3mybatisspringBoot3前后端分離實現對一張表的增刪改查&#xff08;完整代碼版&#xff09;-CSDN博客 項目地址 1.添加一個Login.vue視圖 <template><div class"login_container"><div class"login…

【Windows】系統安全移除移動存儲設備指南:告別「設備被占用」彈窗

Windows系統安全移除移動存儲設備指南&#xff1a;告別「設備被占用」彈窗 解決移動硬盤和U盤正在被占用無法彈出 一、問題背景 使用Windows系統時&#xff0c;經常遇到移動硬盤/U盤彈出失敗提示「設備正在使用中」&#xff0c;即使已關閉所有可見程序。本文將系統梳理已驗證…

Springboot下載文件, 文件名中文是亂碼, 空格變加號

默認把文件名放上去, 中文會亂碼, 文件名種有空格, 就會被截斷 public void download(HttpServletResponse response){// 文件名先進行url編碼, 避免亂碼問題// 把用%20進行替換fileName URLEncoder.encode(fileName, "UTF-8").replace("", "%20&qu…

MySQL 超詳細安裝教程與常見問題解決方案

一、MySQL 安裝教程 1. Windows 系統安裝&#xff08;以 MySQL 8.0 為例&#xff09; 步驟 1&#xff1a;下載 MySQL Installer 訪問 MySQL 官網下載頁面。 選擇 Windows (x86, 64-bit), MSI Installer&#xff08;推薦使用完整版 mysql-installer-web-community-8.0.xx.xx.…

【cuda學習日記】5.2.1 共享內存額外篇

共享內存(Shared Memory) 1.是一種低延遲、高帶寬的片上內存 2.由同一個Block內的所有線程共享 3.生命周期與Block相同 4.訪問速度比全局內存快約100倍 Block(線程塊) 1.GPU執行的基本單位&#xff0c;包含一組線程 2.多個Block組成Grid(網格) 3.Block內的線程可以通過共享內存…

[250411] Meta 發布 Llama 4 系列 AI 模型 | Rust 1.86 引入重大語言特性

目錄 Llama 4 家族登場&#xff1a;開啟原生多模態 AI 創新新紀元Rust 1.86.0 版本發布亮點主要新特性與改進其他重要信息 Llama 4 家族登場&#xff1a;開啟原生多模態 AI 創新新紀元 Meta AI 近日發布了其最新、最先進的 Llama 4 系列人工智能模型&#xff0c;標志著 AI 技術…

ArrayList 和 數組 的區別

定義與本質 數組&#xff1a;是 Java 語言內置的數據結構&#xff0c;是存儲相同類型元素的連續內存空間。它是一個基本的語言特性&#xff0c;在內存中是一塊連續的區域。ArrayList&#xff1a;是 Java 集合框架中的一個類&#xff0c;屬于動態數組。它是基于數組實現的&#…

??FireCrawl?爬蟲工具?, Craw4ai

?FireCrawl?是一款開源的AI爬蟲工具&#xff0c;專門用于Web數據提取&#xff0c;并將其轉換為Markdown格式或其他結構化數據。FireCrawl特別適合處理使用JavaScript動態生成的網站&#xff0c;能夠自動抓取網站及其所有可訪問的子頁面內容&#xff0c;并將其轉換為適合大語言…