磁盘&CPU调节(1)—Buffer Pool(五十四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 磁盘&CPU调节(1)—Buffer Pool(五十四)

上篇文章说mysql5.6之后新增了系统变量optimizer_tance可以看到他的优化过程。

Optimizer trance—mysql进阶(五十三)


缓存的重要性


前面我们说过innoDB表示吧数据存在表空间,不管是用于存储表的系统数据,还是存储用户数据的索引(聚簇索引 和 二级索引),表空间实际是在磁盘上的。但我们不可能每次查询数据都从磁盘上查询,那样以磁盘的龟速,怎么能配的上快速的cpu呢。所以我们在磁盘访问数据的时候,会把整个页的数据全部都放入缓存中,即使只是访问一条,也是会把整个页都放入缓存,而且查询完之后,也不会立即释放缓存,而是缓存起来,可以省去磁盘I/O的开销。


InnoDB的Buffer Pool


什么是buffer pool,mysql服务器在启动的时候,会向操作系统申请一片连续的内存,这个名字就是buffer pool(缓冲池)。他是多大呢,默认是128m,最小是5M,你也可以设置,当设置小于5m的时候,默认就是5M。

Innodb_buffer_pool_size=268435456

这个值是字节,也就是我指定为256M。


Buffer pool内部组成


Buffer pool里的页和磁盘上的页大小都是16kb。为了管理缓存区这些缓存页,mysql为每个缓存页创建了一些控制信息,这些控制信息包括表空间编号,页号,缓存页在buffer pool中地址、链表节点信息、一些锁信息以及LSN信息(锁和LSN信息后面再讲),当然还有一些控制信息。

每个缓存也对应的控制信息大小是相同的,我们吧每个页对应的控制信息占用的内存块称为【控制块】,控制块和缓存块是一一对应的,控制块放在buffer pool最前面,缓存块放在buffer pool后面,但是中间还有个碎片区,每个控制块对应一个缓存页,那剩余空间不够分的时候怎么办呢,这就是碎片区。(需要注意的是控制块大概占缓存页大小的百分之5,而我们设置的innoDB_buffer_pool_size不包含这个内存,所以设置的内存大小实际总的要多百分之5)


Free链表管理


我们在启动mysql的时候,就会完成buffer pool的初始化过程,先想系统申请内存空间,在把他们划分成不同的控制块和缓存页。此时这些缓存页都是空闲的,后面只有随着程序的运行,数据不断从磁盘刷新到缓存页才有数据。那么从磁盘上刷到缓存页的数据放在哪个位子呢。哪些缓存页是空闲可用的呢?

这时候控制块作用就来了,我们吧空闲缓存页的控制块统一放在free 链表,所以刚开始初始化的时候,所有缓存页都在free 链表。

Free 链表有一个基节点,里面有个start和end节点,还有总的count,控制块里还有双向链表连接起来。

有了这个free链表就方便了,如果从磁盘刷新数据到buffer pool只要取个空闲页缓存页,然后把页号,表空间id,等信息填写上去,最后从free 链表移除。


缓存页的hash处理


我们知道了数据存储在缓存页,但如何访问呢,总不能一点点遍历,这时候就用到了hash表,吧空间id+页号为key,value就是缓存页,通过key找到对应的value缓存页。

所以刷新数据的时候,先通过key判断是否已经有存在的缓存页,有就直接使用,没有就从free链表申请一个新的缓存页。


Flush链表管理


加入我们修改了缓存页,这时候缓存页和磁盘上的数据就不一致了,这时候就是脏数据,这时候我们就需要吧缓存页的数据同步到磁盘上,但我们不能每次都I/O访问磁盘,这样会效率很低,会在统一的时间段同步。

但如果同步又不能吧256G的缓存页全部同步到磁盘,这样也会影响效率,于是在修改后的链表会存入和free链表一样的结构,方便查找和同步,就叫flush链表。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
353 10
|
25天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
64 7
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
819 2
|
3月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
211 5
|
2月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
72 0
|
3月前
|
编解码 算法 测试技术
CPU性能调节【ChatGPT】
CPU性能调节【ChatGPT】
|
7月前
|
存储 弹性计算 运维
|
7月前
|
存储 弹性计算 运维
|
1月前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
226 1
|
3月前
|
Prometheus Kubernetes 监控
使用kubectl快速查看各个节点的CPU和内存占用量
在Kubernetes集群中,安装metrics-server,并使用kubectl快速查看集群中各个节点的资源使用情况。
268 0