MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数

InnoDB在设计lock-free的log system时,除了已有的参数外,还通过宏控制隐藏了一些参数,如果你使用源码编译时,打开cmake选项-DENABLE_EXPERIMENT_SYSVARS=1, 就可以看到这些参数了。本文主要简单的过一下这些隐藏的参数所代表的含义

A.
innodb_log_write_events
innodb_log_flush_events
两者的含义类似,表示用来唤醒等待log write/flush的event的个数,默认值都是2048
比如你要等待的位置在lsnA,那么计算的slot为:
slot = (lsnA - 1) /OS_FILE_LOG_BLOCK_SIZE & (innodb_log_write/flush_events - 1)
这意味着:如果事务的commit log的end lsn落在相同block里,他们可能产生event的竞争
当然如果不在同一个block的时候,如果调大参数,就可以减少竞争,但也会有无效的唤醒
唤醒操作通常由后台线程log_write_notifier 或者log_flush_notifier异步来做,但如果推进的log write/flush还不足一个block的话,那就log_writter/flusher
自己去唤醒了。

B.
innodb_log_recent_written_size, 默认1MB
表示recent_written这个link_buf的大小,其实控制了并发往log buffer中同时拷贝的事务日志量,向前由新的日志加入,后面由log writer通过写日志向前推进,如果写的慢的话,那这个link_buf很可能用满,用户线程就得spin等待。再慢io的系统上,我们可以稍微调大这个参数

innodb_Log_recent_closed_size, 默认2MB
表示recent closed这个link_buf的大小,也是维护可以并发往flush list上插入脏页的并罚度,如果插入脏页速度慢,或者lin_buf没有及时合并推进,就会spin wait

简单说下link_buf, 这本质上是一个数组,但使用无锁的使用方式来维护lsn的推进,比如获得一个lsn开始和结束,那就
通过设置buf[start_lsn] = end_lsn的类似方式来维护lsn链,基于lsn是连续值的事实,最终必然不会出现空洞,所以在演化的过程中,可以从尾部
推进连续的lsn,头部插入新的值.
如果新插入的值超过了尾部,表示buf满了,就需要spin wait了

C.
innodb_log_wait_for_write_spin_delay, 
innodb_log_wait_for_write_timeout

从8.0版本开始用户线程不再自己去写redo,而是等待后台线程去写,这两个变量控制了spin以及condition wait的timeout时间,当spin一段时间还没推进到某个想要的lsn点时,就会进入condition wait

另外两个变量
innodb_log_wait_for_flush_spin_delay
innodb_log_wait_for_flush_timeout
含义类似,但是是等待log flush到某个指定lsn

注意在实际计算过程中,最大spin次数,会考虑到cpu利用率,以及另外两个参数:
innodb_log_spin_cpu_abs_lwm
innodb_log_spin_cpu_pct_hwm

如果是等待flush操作的话,还收到参数innodb_log_wait_for_flush_spin_hwm限制,该参数控制了等待flush的时间上限,如果平均等待flush的时间超过了这个上限的话, 就没必要去spin,而是直接进入condition wait

关于spin次数的计算方式在函数log_max_spins_when_waiting_in_user_thread中":

函数的参数即为配置项innodb_log_wait_for_write_spin_delay或innodb_log_wait_for_flush_spin_delay值

static inline uint64_t log_max_spins_when_waiting_in_user_thread(uint64_t min_non_zero_value) {uint64_t max_spins;/* Get current cpu usage. */const double cpu = srv_cpu_usage.utime_pct;/* Get high-watermark - when cpu usage is higher, don't spin! */const uint32_t hwm = srv_log_spin_cpu_pct_hwm;if (srv_cpu_usage.utime_abs < srv_log_spin_cpu_abs_lwm || cpu >= hwm) {/* Don't spin because either cpu usage is too high or it'salmost idle so no reason to bother. */max_spins = 0;} else if (cpu >= hwm / 2) {/* When cpu usage is more than 50% of the hwm, use the minimum allowednumber of spin rounds, not to increase cpu usage too much (risky). */max_spins = min_non_zero_value;} else {/* When cpu usage is less than 50% of the hwm, choose maximum spin roundsin range [minimum, 10*minimum]. Smaller usage of cpu is, more spin roundsmight be used. */const double r = 1.0 * (hwm / 2 - cpu) / (hwm / 2);max_spins =static_cast<uint64_t>(min_non_zero_value + r * min_non_zero_value * 9);}return (max_spins);
}

D. 以下几个参数是后台线程等待任务时spin及condition wait timeout的值
log_writer线程:
innodb_log_writer_spin_delay,
innodb_log_writer_timeout

log_flusher线程:
innodb_ log_flusher_spin_delay
innodb_log_flusher_timeout

log_write_notifier线程:
innodb_ log_write_notifier_spin_delay
innodb_log_write_notifier_timeout

log_flush_notifier线程
innodb_log_flush_notifier_spin_delay
innodb_log_flush_notifier_timeout

log_closer线程(用于推进recent_closed这个link_buf的专用线程)
innodb_log_closer_spin_delay
innodb_log_closer_timeout

E
innodb_ log_write_max_size
表示允许一个write操作最大的字节数,默认为4kb, 这个是在推进recent_written这个link buf时计算的,个人认为这个限制太小了,可以适当调大这个参数。(然而8.0的最大写入限制还受到innodb_log_write_ahead_size限制,两者得综合起来看)

F
innodb_log_checkpoint_every
默认1000毫秒(1秒),表示至少每隔这么长时间log_checkpointer线程会去尝试做一次checkpoint. 当然是否做checkpoint还受到其他因素的影响,具体见函数log_should_checkpoint:

a) more than 1s elapsed since last checkpoint
b) checkpoint age is greater than max_checkpoint_age_async
c) it was requested to have greater checkpoint_lsn,and oldest_lsn allows to satisfy the request

G. 参考:
MySQL8.0.16源代码


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不改代码也能全面 Serverless 化,阿里中间件如何破解这一难题?

Serverless 话题涉及范围极广&#xff0c;几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构&#xff1f;今天&#xff0c;我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。 AWS Lambda …

java中的值传递

1.概述 引用类型中&#xff0c;java中全部都是值传递&#xff0c;传递对象里的值&#xff0c;而不会传递对象本身。 2.代码示例 public class Main {public static void main(String[] args) {Student a new Student();Student b new Student();a.setName("zhangsan&q…

Java-类型转换

类型转换 public static void main(String[] args) {/*由于java是强类型语言&#xff0c;所以进行有些运算时&#xff0c;需要用到类型转换低 ---------------------------------------- 高byte,short,char ->int ->long ->float ->double强制转换 高-->低自…

linux 环境搭建 Sentinel 控制台

文章目录一、搭建Sentinel 控制台1. Sentine文档2. 下载稳定版本3. 启动sentinel4. 登录 sentinel一、搭建Sentinel 控制台 1. Sentine文档 https://github.com/alibaba/Sentinel/wiki/控制台 2. 下载稳定版本 https://github.com/alibaba/Sentinel/releases wget https:/…

甲骨文Java 14来啦!

甲骨文两年来&#xff0c;每六个月如约发布新版本的Java&#xff0c;Oracle JDK 14为开发人员带来创新功能和新特性预览。Oracle JDK 14增加了一些新特性来提高开发人员工作效率&#xff0c;这些新特性包括&#xff1a;对switch表达式的Java语言支持&#xff0c;用于持续监控JD…

2019阿里巴巴技术面试题集锦(含答案)

为帮助开发者们提升面试技能、有机会入职阿里&#xff0c;云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次整体放出。并通过这些笔试真题开放阿里巴巴工作机会&#xff0c;让更多的开发者加入到阿里这个大平台。 …

揭秘!闲鱼拉新投放系统如何设计

背景 闲鱼目前已经是国内最大的闲置物品交易平台。随着闲鱼体量的增长和用户规模不断扩大&#xff0c;闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片&#xff0c;每天都可能被数以千万计的人看到。 为了更好地服务好广大的用户群体&#xff0c;更加个性化的内容推…

Springboot/Cloud集成Sentinel 和 入门实战

文章目录一、Springboot/Cloud集成Sentinel1. spring-cloud-alibaba依赖2. 引入 Sentinel starter3. 配置application.yml3. 接入限流埋点4. 访问接口5. sentinel控制台二、入门实战2.1. 流控管理2.2. 快速访问请求一、Springboot/Cloud集成Sentinel 1. spring-cloud-alibaba依…

Java-变量、常量

变量 public class Demo06 {// 类变量 staticstatic double salary 888;// 实例变量&#xff1a; 从属于对象; 如果不自行初始化&#xff0c;这个类型的默认值是 0 0.0// 布尔值 &#xff1a; 默认是false// 除了基本类型&#xff0c;其余都是nullString name;int age;public …

为什么kill进程后socket一直处于FIN_WAIT_1状态

本文介绍一个因为conntrack内核参数设置和iptables规则设置的原因导致TCP连接不能正常关闭(socket一直处于FIN_WAIT_1状态)的案例&#xff0c;并介绍conntrack相关代码在conntrack表项超时后对新报文的处理逻辑。 案例现象 问题的现象&#xff1a; ECS上有一个进程&#xff0…

Docker 开发环境的滑坡

作者 | Micah Adams责编 | 徐威龙封图| CSDN 下载于视觉中国最近&#xff0c;我构建了一个本地开发环境&#xff0c;该环境使用 Docker 进行一些关键的集成测试。 在我要完成这项工作时&#xff0c;我意识到在开始这项工作之前&#xff0c;我没有考虑到这么做的一些意义深远影响…

Springboot全局异常统一处理返回json

文章目录1. 创建一个枚举、封装异常的错误码等信息2. 创建一个自定义异常类继承RuntimeException。3. 自定义异常4. 抛出异常5. 测试1. 创建一个枚举、封装异常的错误码等信息 package com.gblfy.distributedlimiter.enums;public enum ServiceErrCode {REQ_PARAM_ERR(10001, …

关于JavaBean

JavaBean 是特殊的 Java 类&#xff0c;使用 Java 语言书写&#xff0c;并且遵守 JavaBean API 规范。 接下来给出的是 JavaBean 与其它 Java 类相比而言独一无二的特征&#xff1a; 提供一个默认的无参构造函数。需要被序列化并且实现了 Serializable 接口。可能有一系列可读…

TableStore: 海量结构化数据分层存储方案

前言 表格存储是阿里云自研分布式存储系统&#xff0c;可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质&#xff0c;针对读多写多的场景都有较好的访问延时。容量型使用的是SSD和SATA混合的存储介质。对写多的场景…

Java-基本运算符

运算符 public class Demo01 {public static void main(String[] args) {// 二元运算符// Ctrl D : 复制当前行到下一行int a 10;int b 20;int c 25;int d 25;System.out.println(ab);System.out.println(a-b);System.out.println(a*b);System.out.println(a/(double)b); …

蚂蚁金服终端实验室演进之路

0. 背景 作为国民级 App&#xff0c;支付宝客户端需要为亿级用户提供多元化的服务&#xff0c;因此应用的稳定性与可靠性面临巨大的挑战&#xff0c;需要不断地完善和优化。 今天&#xff0c;让我们站在服务质量的全方位监控与优化的角度&#xff0c;从蚂蚁终端实验室的演进之…

2020年边缘计算最新前沿报告:如何与核心云、5G、AI协同?如何打造新业态和部署运营?...

作者 | 唐汝林、陈琪责编 | 屠敏头图 | CSDN 下载自东方 IC数据来源 | 华信咨询设计研究院有限公司在数字经济的时代浪潮中&#xff0c;作为关键生产要素的数字技术的快速变革已成为新常态。正当人工智能开始崭露头角时&#xff0c;云计算的边缘化延伸趋势又成为了另一个新焦点…

Springboot/Cloud集成Sentinel进阶实战

文章目录一、自定义限流处理1. 自定义处理类2. 请求一次测试3. 重新配置流控规则4. 重新测试5. controller二、方法限流处理2.1. 创建接口2.2. 创建接口实现类2.3. 接口调用2.4. 请求2.5. 设置流控规则一、自定义限流处理 自定义限流文档 1. 自定义处理类 package com.gblfy…

若依SQL Server开发使用教程

1. sys_menu表中的将菜单ID修改为自动ID,解决不能增加菜单的问题&#xff0c;操作流程如下&#xff1a; 解决方案如下 菜单栏->工具->选项 点击设计器&#xff0c;去掉阻止保存要求更新创建表的更改选项&#xff0c;点确认既可以保存了 2 自动生成代码找不表的解决方案…

java基础 代理

1.代理是什么? 代理&#xff08;Proxy&#xff09;是一种设计模式。提供了对目标对象另外的访问方式&#xff0c;即通过代理对象访问目标对象。 有一个类我们无法更改&#xff0c;但我们希望在原有类上加上我们自己的逻辑&#xff08;增强&#xff09;&#xff0c;这时就可以…