第07问:innodb_buffer_pool_instances 是如何影响性能的?

【mySQL】提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances 转自:https://blog.youkuaiyun.com/qing_gee/article/details/42742241(作者太罗嗦了,复制好多遍) 提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances。 首先我们先看一下,我的电脑(i3-3220,4G内存,没有配置innodb_buffer_pool_size参数的情况下,抛开程序的性能,经过1个线程-8个线程的测试结果)环境下,大家可以看到如下的图,线程并发情况下,时间. 阅读详情

 

问题:

我们都知道 innodb_buffer_pool_instances 参数,将 buffer pool 分成几个区,每个区用独立的锁保护,这样就减少了访问 buffer pool 时需要上锁的粒度,以提高性能。

那么我们如何观察它是如何影响性能呢?

 

实验:

准备一个空数据库,

在这里我们将 performance_schema_events_waits_history_long_size 调大,是为了让之后实验数据能采集的更多,在此不多做介绍。

使用 sysbench,准备一些数据,

对数据进行预热 60s,可以看到预热期间的性能会不太稳定,预热后会比较稳定,

设置 performance_schema,这次我们将仅开启观察项(生产者)hash_table_locks,并开启 waits 相关收集端(消费者)。(相关介绍参看 实验 03)

 


小贴士

为什么我们知道观察项应该选择 hash_table_locks?

在 performance_schema.setup_instruments 表中,列出了所有观察项,但我们很难从中选出我们应观察哪个观察项。

这时候,可以将所有观察项都启用,然后设计一些对比实验,比如使用几种不同的 SQL,观察这些操作影响了哪些观察项,找到共性或者区。

还有一种高效的方式是搜索别人的经验,或者阅读 MySQL 源码。

本例中 hash_table_locks 隐藏的比较深,使用了阅读 MySQL 源码和对比试验结合的方法。


由于 MySQL 有一些后台进程会使用 buffer pool,比如刷盘线程,会影响我们的观察,所以需要将 MySQL 的后台线程排除在外。

 

万事就绪,再运行一次 sysbench 压力。运行前记得将已有的观察结果清除:

运行 sysbench 压力,持续60秒,

等待压力结束后,对 performance_schema 中记录的数据进行分析。

 

确实采集了 100 万条对 hash_table_locks 的观测数据。

我们取其操作时长的平均值,90% 分位数,99% 分位数:

整理到如下表格,但我们先忽略其时间单位,放到最后讨论,

我们按照如上方法,分别再测试 innodb_buffer_pool_instances 为 2 和 4 的情况(记得多测几次,取平均值会更为准确,本实验由于偷懒,只测预热后的一次结果)。

表格更新为:

可以看到如下结:

  1. 平均值都在 99% 分位数以上,意味着有极大的数据严重影响的平均值(有几次对 buffer pool 锁的获取,等待了非常久)。

  2. 随着 innodb_buffer_pool_instances 增大,这种严重的影响会逐渐减小。

  3. 在实验的场景中,innodb_buffer_pool_instances 的增大,对 90% 和 99% 分位数影响都不大,即不会影响到大部分 SQL 对 buffer pool 锁的获取时间。


重要说明:

  1. 本实验以介绍实验手法为目的,实验的结论不可作为参考。

  2. 如果大家多做几次实验,会发现在同一个配置下,平均值的变化很大,也就是说那几次非常久的等待时间非常不稳定,受到其他因素影响。

  3. 如果更换数据压力或者更换测试环境,会看到不同的现象。


我们再来看看这些时间的单位是什么?

可以看到 wait 一族的观察项,单位是 cycle,那么 cycle 又是多少秒?

可以看到,1 cycle = 1/2387771144 秒。

我们重新看一下 innodb_buffer_pool_instances=1 时,获取 buffer pool 锁的平均时间是 6535546 cycle,大约是 2.7 ms。

2.7 ms,还是比较长的一段时间(我的虚拟机配置比较一般)。

 

结论

本次实验介绍了对 innodb_buffer_pool_instances 参数对性能影响的观测手法,大家可以在进行压力测试时,使用此方法观察 innodb_buffer_pool_instances 的取值对性能的影响,从而决定应该取值多少。

参数设置一直是个平衡问题,innodb_buffer_pool_instances 设置太小,锁冲突集中;设置太大,维护成本升高。

再次强调,本次实验仅介绍手法,结果不足取信。不同压力,不同 buffer pool 配置,不同环境会呈现效果,唯有手法是可以传承的。

按照正常实验的规则,95% 分位数以上的极值可看作是实验误差,但对于本次实验中的极大值进行进一步分析后,我们认为可以用于说明实验效果。


关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

MySQL性能调优实战:如何为你的服务器量身定制innodb_buffer_pool_size和instances配置 本文深入探讨MySQL性能调优的关键参数innodb_buffer_pool_size和innodb_buffer_pool_instances的配置策略。通过分析缓冲池的核心价值、黄金配置法则以及实例数量的并发优化,帮助数据库管理员根据服务器硬件和应用特性进行精细调整,显著提升数据库性能。文章还提供了生产环境实战案例和持续监控策略,确保调优效果最大化。 阅读详情

相关推荐

MySQL 之 InnoDB缓冲池(Buffer Pool)体系结构

缓冲池体系结构图: 缓冲池(Buffer Pool)是主缓存器的一个区域,用于缓存索引、行的数据、自适应哈希索引、插入缓存(Insert Buffer)、锁 还有其他的内部数据结构。Buffer Pool的大小是可以根据我们实际的需求进行更改,那么Buffer Pool的size取多少比较合适,在我的博客https://blog.youkuaiyun.com/qq_36652619/article/de...

心有猛虎 细嗅蔷薇 2465

innodb_buffer_pool_instances

The number of regions that the InnoDB buffer pool is divided into. For systems with buffer pools in the multi-gigabyte range, dividing the buffer pool into separate instances can improve concurrency,by reducing contention as different threads read and w...

u013469501的博客 5620

J-Flash手动添加华大HC32F460型号全攻略

在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配

weixin_29192365的博客 349

InnoDB缓存之Buffer Pool

1. 前言 我们已经知道,对于InnoDB存储引擎而言,页是磁盘和内存交互的基本单位。哪怕你要读取一条记录,InnoDB也会将整个索引页加载到内存。哪怕你只改了1个字节的数据,该索引页就是脏页了,整个索引页都要刷新到磁盘。InnoDB是基于磁盘的存储引擎,如果每次操作都去读写磁盘,那么性能将会受到很大的影响。而且绝大多数时候,程序读写的数据在磁盘上并不是连续的,这意味着需要执行大量的随机IO读写,磁盘随机IO读写效率是非常低的,尤其是传统的机械硬盘。 在解决这个问题之前,大家可以先想一想,为什么我们只想读取

程序员小潘 3286

基于远程服务器 Tip_Adapter源码从零开始复现

从零一步步实现源代码的运行

zcyzcyjava的博客 1602

PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理

在“PDF Document”栏中,依次选中除REF-TOP和REF-BOT之外的文件,单击图标,将其余PDF Document文件进行删除,如图所示。然后单击【生成PDF】按钮,即可创建一份PDF格式的位号图。

tianpu2320959696的博客 1023

MySQL优化:innodb_buffer_pool_instances与innodb_buffer_pool_size参数分析

首先了解三个参数三个参数: innodb_buffer_pool_size(缓冲池大小) innodb_buffer_pool_chunk_size(定义InnoDB缓冲池大小调整操作的块大小) innodb_buffer_pool_instances(InnoDB缓冲池划分为的区域数) 关于两个参数的关系,在MySQL8.0的官方文档中: Buffer pool size must ...

SunZLong的博客 1万+

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1623

【mysql参数调优】:innodb_buffer_pool_size和innodb_buffer_pool_instances (三)

InnoDB缓冲池参数对数据库性能至关重要。innodb_buffer_pool_size决定缓存总量,建议设为物理内存的50%-70%(专用服务器),直接影响读写性能;innodb_buffer_pool_instances控制缓冲池分区数量,建议每个实例≥1GB且数量4-8个(与CPU核心数匹配),缓解高并发锁竞争。两者需协同配置:总大小提升缓存命中率,实例数优化并发效率。监控缓存命中率(应>99%)和锁等待情况,针对读多或写多场景动态调整,实现性能最优。

ray的博客 1332

NOC总线架构拓扑介绍

在开篇里,我们对芯片PPA有了初步的认识。下面,让我们从访存这个简单的问题开始展开介绍芯片基础概念。CPU是怎样访问内存的?简单的答案是,CPU执行一条访存指令,把读写请求发往内存管理单元。内存管理单元进行虚实转换,把命令发往总线。总线把命令传递给内存控制器,内存控制器再次翻译地址,对相应内存颗粒进行存取。之后,读取的数据或者写入确认按照原路返回。再复杂些,当中插入多级缓存,在每一层缓存都未命中的情况下,访问才会最终达到内存颗粒。

元直的博客 5293

Vue+OpenLayers7入门到实战目录,OpenLayers7中文文档,OpenLayers7中文手册,OpenLayers7中文教程,OpenLayers7文档pdf

本篇作为《Vue+OpenLayers7入门到实战》所有文章的二合一汇总目录,方便查找。本专栏源码是由OpenLayers7.x版本结合Vue框架编写。本专栏从Vue搭建脚手架到如何引入OpenLayers7依赖的每一步详细新手教程,再到通过各种入门案例和综合性的实战案例,带领大家快速上手Vue+OpenLayers7开发。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 3971

mysql原理--InnoDB的Buffer Pool

Buffer Pool,用户态高速缓存

x13262608581的博客 2285

AUTOSAR模式管理-EcuM多核处理及其他概念

因此,EcuM不请求状态。因此,BswM必须确保,例如,在调用EcuM_GoHalt或EcuM_GoPoll之前,必须将关机目标从其默认值更改为ECUM_STATE_SLEEP。对于ECU的关闭,BswM(位于主EcuM的同一个分区中)最终调用主核上的GoOff,该GoOff将请求分发给所有的从核。在ECU Manager模块的早期版本中,睡眠目标被特殊处理,因为在ECU中实现的睡眠模式取决于ECU的功能。在使用了外部的SBC控制相关的MCU的下电的时候,在OFF阶段最后调用SBC进入到Sleep的指令。

m0_49148264的博客 1340

mysql5.7 性能优化配置 innodb_buffer_pool_size

mysql5.7 性能优化配置 innodb_buffer_pool_size

1万+

【PSINS工具箱】159联邦滤波器代码优化与注释、运行结果、文字性解释。15维状态量、9维观测量,联邦滤波与集中式滤波对比。完整代码可订阅后查看

基于工具箱的联邦滤波代码,15维状态量、9为观测量

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 485

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

mysql优化---第7篇:参数 innodb_buffer_pool_instances设置

摘要:1 innodb_buffer_pool_instances可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。 2 innodb_buffer_pool_instances 参数显著的影响测试结果,特别是非常高的 I/O 负载时。 3 实验环境下, innodb_buffer_pool_instances=8 在很小的 buffer_pool

crazyhacking的专栏 4万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

InnoDB Buffer Pool巧配置全解

作者:M哥 知数堂MySQL第8期学员、知数堂藏经阁项目-星耀队队长 一、简介 InnoDB维护了一个缓存数据和索引信息到内存的存储区叫做Buffer Pool,它会将最近访问的数据缓存到缓冲区。我们通过配置各个Buffer Pool的参数,可以显著提高MySQL的性能。  InnoDB的Buffer Pool是基于LRU算法来实现的,下面我们可以简单了解一下LRU算法: lea

老叶茶馆 1866

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【MySQL】MySQL优化-innodb_buffer_pool_size

首先需要有MySQL的root权限账号,也就是information_schema数据库访问权限;可以通过语句查看Innodb的系统变量参数;可以通过语句查看innodb的运行状态变量;指代的一个内存区域,用来缓存InnoDB存储引擎的表中的数据和索引数据,用来提高对InnoDB存储引擎表中的数据查询和访问速度;该参数以字节(byte)为单位,我自己笔记本的MySQL中的默认是8388608byte,也就是8MB。

Ankie_的博客 2214

技术译文 | MySQL 8 需要多大的 innodb_buffer_pool_instances 值(上)

作者:Vadim Tkachenko 翻译:管长龙 本文来源:https://www.percona.com/blog/2020/08/13/how-many-innodb_buffer_pool_instances-do-you-need-in-mysql-8/ 我曾经在文章《MySQL 5.7 安装后的性能调优》(文末链接)和《MySQL 101:调整 MySQL 性能的参数》(文末链接)中谈到过 innodb_buffer_pool_instances 这个参数 ,建议使用值为“8”,但我不能.

ActionTech的博客 1026

mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置

摘要:1innodb_buffer_pool_instances可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。2 innodb_buffer_pool_instances参数显著的影响测试结果,特别是非常高的I/O负载时。3 实验环境下,innodb_buffer_pool_instances=8在很小的 buffer_pool 大小时有很大的不同...

weixin_28848833的博客 1311

mysql性能基准测试_MySQL基准测试innodb_buffer_pool_instances对性能影响

测试环境:MySQL 5.7.26测试数据:10张表,每张表500万行数据,共12G的数据。innodb_buffer_pool_size=24576M不变,修改innodb_buffer_pool_instances大小测试对性能的影响,分别为1,2,4,8,16,24,32。测试脚本如下:/usr/local/bin/sysbench/tmp/sysbench-master/src/lua/...

weixin_33522643的博客 305

MySQL基准测试innodb_buffer_pool_instances对性能影响

测试环境 :MySQL 5.7.26 测试数据:10张表,每张表500万行数据,共12G的数据。 innodb_buffer_pool_size=24576M不变,修改innodb_buffer_poo...

aa5181的专栏 282

高并发MySQL优化:为什么innodb_buffer_pool_instances比size更重要?

本文深入探讨了在高并发MySQL优化中,`innodb_buffer_pool_instances`比`innodb_buffer_pool_size`更关键的原因。通过分析缓冲池的并发瓶颈本质、实例数与性能的量化关系,以及生产环境调优实战,揭示了如何通过合理配置实例数显著提升数据库性能。文章还提供了配置黄金法则和特殊场景的精细化配置建议,帮助开发者在电商大促、秒杀系统等高并发场景中优化MySQL性能。

lg888的博客 669

Mysql 参数 innodb_buffer_pool_size

以下考虑主要为 Innodb 引擎, key_buffer_size 不考虑。对于实例级别或线程级别参数设置,暂不考虑。 【 innodb_buffer_pool_size 】 用于缓存 索引 和 数据的内存大小, 这个当然是越多越好, 数据读写在内存中非常快, 减少了对磁盘的读写。 当数据提交或满足检查点条件后才一次性将内存数据刷新到磁盘中。然而内存还有操作系统或数据库其他进程使用, 一般...

Data & Analysis 698

MySQL - InnoDB 的 Buffer Pool

本文深入解析InnoDB的Buffer Pool机制,从缓存需求、组织结构到淘汰策略和优化方案。主要内容包括:Buffer Pool作为内存缓存区解决磁盘IO瓶颈;由控制块、缓存页和碎片组成;通过free链表、哈希表和flush链表管理缓存页;改进的LRU算法将链表分为young和old区域,避免预读和全表扫描干扰;脏页通过三种方式刷盘;针对大内存高并发场景,采用多实例和chunk机制提升性能。最后介绍了通过SHOW ENGINE INNODB STATUS监控缓存状态的关键指标。全文系统性地揭示了Buff

记录后端技术的深水区:MySQL、并发、JVM、分布式。原理为主,实战为辅,能少踩一个坑是一个。 455
上一篇: 图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅
下一篇: 分布式 | DBLE 是如何实现视图的?
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值