在这篇文章中,第三个在一系列解释InnoDB冲洗的内部,我们将关注调优。(其他系列可以看到InnoDB冲洗在行动Percona MySQL服务器雷竞技下载官网和给爱你的ssd -减少innodb_io_capacity_max !)
了解调优过程是非常重要的,因为我们不想让事情变得更糟或燃烧我们的ssd。我们进行一个部分每个变量或密切相关的变量。也在分组的变量部分基于MySQL的版本或raybetapp 他们都是有效的。给定的变量可能出现不止一次,如果它的意思版本之间的变化。可能有其他因素影响InnoDB处理写密集型工作负载的方式。希望最重要的。
MySQL社区8.0.19之前
innodb_io_capacity
这个变量的默认值是200。如果你阅读我们之前的帖子,你知道的innodb_io_capacity数量的iops用于闲置冲洗和任务应用改变缓冲区操作在后台。自适应冲洗innodb_io_capacity无关。很少有理由提高innodb_io_capacity高于默认值:
- 减少缓冲延迟的变化
- 增加闲置冲洗率(LSN是常数时)
- 增加脏页冲洗率百分比
我们很难找到任何理由增加闲置冲洗率。同时,脏页冲洗不应该使用比例(见下文)。这使得变换器缓冲延迟。如果你不断改变缓冲区中有大量的条目当你“显示引擎innodb状态\ G”,如:
|
1
2
3
4
5
6
7
8
|
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
插入
缓冲
和
自适应
哈希
指数
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
Ibuf
:
大小
1229年
,
免费的
列表
len
263690年
,
赛格
大小
263692年
,
40050265
合并
合并后的
操作
:
插入
98911787
,
删除
马克
40026593
,
删除
4624943
被丢弃的
操作
:
插入
11
,
删除
马克
0
,
删除
0
|
哪里有1229未实施的变化,你可以考虑提高innodb_io_capacity。
innodb_io_capacity_max
的默认值innodb_io_capacity_max2000年innodb_io_capacity也在其默认值。这个变量控制每秒多少页InnoDB允许冲洗。这大概和写IOPS由InnoDB。你的硬件应该能够执行许多页面将每秒。如果你看到这样的消息:
|
1
|
(
请注意
]
InnoDB
:
page_cleaner
:
1000毫秒
目的
循环
花了
4460 ms。
的
设置
可能
不
是
最优
。
(
刷新
=
140年
,
在
的
时间
。
)
|
在MySQL错误日志,然后硬件无法跟上,所以你应该降低innodb_io_capacity_max价值。理想值允许检查点年龄应尽可能高而保持在75%的马克斯检查点的年龄。检查点年龄越高,越少写数据库将需要执行。同时,如果检查点年龄是75%以上,你就会停滞的风险。需要一个平衡,写性能与短停滞的风险。选择你在哪里站根据性能痛点您正面临和短停滞的风险。如果你有部署raybetapp官方下载 (PMM),“InnoDB检查点时代”的“MySQL InnoDB细节”仪表板是非常有用的。这是一个简单的例子产生的帮助下sysbench:
InnoDB检查点的年龄
负载从15:02和检查点时代迅速水平约20%。然后,在15:13,innodb_io_capacity_max降低,检查点年龄提高到50%左右。这提高了冲洗率下降了一半,因为它在另一个PMM图可以看出,“InnoDB数据I / O”
PMM InnoDB IO图
雷竞技下载官网Percona MySQL服务器也暴露了所有相关的变量:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
mysql
&
gt
;
显示
全球
状态
就像
“innodb_ch %”
;
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
|
Variable_name
|
价值
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
|
Innodb_checkpoint_age
|
400343763
|
|
Innodb_checkpoint_max_age
|
1738750649
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
2
行
在
集
(
0.00
证券交易委员会
)
mysql
&
gt
;
显示
全球
变量
就像
“innodb_adaptive_fl %”
;
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - - - - -
+
|
Variable_name
|
价值
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - - - - -
+
|
innodb_adaptive_flushing
|
在
|
|
innodb_adaptive_flushing_lwm
|
10
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - - - - -
+
2
行
在
集
(
0.00
证券交易委员会
)
|
使用上面的示例中,检查点年龄是大约23%的最大年龄,远高于10%的innodb_adaptive_flushing_lwm中定义。如果检查点年龄值是典型的负荷下数据库时,它从未提出更高的值,innodb_io_capacity_max可以降低一点。相反,如果检查点年龄通常是接近甚至超过75%,价值innodb_io_capacity_max太小了。
innodb_max_dirty_pages_pct
innodb_max_dirty_pages_pct_lwm
这些变量控制旧MySQL 5.0时代冲洗脏页的百分比的函数在缓冲池中。它应该被禁用innodb_max_dirty_pages_pct_lwm设置为0。它的默认值是5.7,但奇怪的是,没有在8.0。
innodb_page_cleaners
innodb_page_cleaners设置一个专门的线程数量为脏页扫描缓冲池实例和冲洗。此外,你不可能比缓冲池清洁线程实例。这个变量的默认值是4。
4清洁线程,InnoDB能够刷新速度非常高。实际上,除非使用Percona服务器为MySQL雷竞技下载官网平行doublewrite缓冲功能doublewrite缓冲,很有可能瓶颈前清洁线程。
innodb_purge_threads
innodb_purge_threads定义了专用的清洗操作的线程数量。清洗操作删除删除行和明确撤销历史列表的条目。这些线程处理撤销空间磁盘上的截断。默认清除线程的数量是4。
很难想象一个工作负载能够浸透4清除线程,缺省值是慷慨的。清除线程所做的大部分工作是在内存中。除非你有一个非常大的缓冲池和高负载写,默认值为4是充分的。如果你看到历史高值长度在“显示引擎innodb状态”没有任何长期运行的事务,你可以考虑增加清除线程的数量。
innodb_read_io_threads
innodb_write_io_threads
令人惊讶的是,在Linux和异步IO,这些线程几乎没有相关性。例如,我们的一个客户运营服务器16读io和16个线程写io线程。的正常运行时间大约35天mysqld过程消耗了104小时的CPU、读281 TB,写了48个结核病到磁盘。压缩的数据集是由基本上InnoDB表。你可以认为对于这样一个服务器IO线程会很忙对吗?让我们来看看:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
根
@
刺激
:
~
# ps - pid, tid、少量、时间- p $ (pidof mysqld)
PID
TID
少许
时间
72734年
72734年
Mar07
00
:
23
:
07年
72734年
72752年
Mar07
00
:
00
:
00
- - - - - -
&
gt
;
ibuf
(
未使用的
)
72734年
77733年
Mar07
00
:
01
:
16
72734年
77734年
Mar07
00
:
01
:
51
72734年
77735年
Mar07
00
:
05年
:
46
- - - - - -
&
gt
;
读
_io
72734年
77736年
Mar07
00
:
06
:
04
- - - - - -
&
gt
;
读
_io
72734年
77737年
Mar07
00
:
06
:
06
- - - - - -
&
gt
;
读
_io
…
11
行
删除
72734年
77749年
Mar07
00
:
06
:
04
- - - - - -
&
gt
;
读
_io
72734年
77750年
Mar07
00
:
06
:
04
- - - - - -
&
gt
;
读
_io
72734年
77751年
Mar07
00
:
35
:
36
- - - - - -
&
gt
;
写
_io
72734年
77752年
Mar07
00
:
34
:
02
- - - - - -
&
gt
;
写
_io
72734年
77753年
Mar07
00
:
35
:
14
- - - - - -
&
gt
;
写
_io
…
11
行
删除
72734年
77766年
Mar07
00
:
35
:
18
- - - - - -
&
gt
;
写
_io
72734年
77767年
Mar07
00
:
34
:
15
- - - - - -
&
gt
;
write_io
|
我们添加了注释来帮助识别IO线程和一个被删除的行数。IO读线程的平均CPU时间6分钟虽然写IO线程略高,35分钟。这些都是非常小的数字,显然,16太多在这两种情况下。默认值为4,CPU时间是25分钟左右的IO读线程和2小时左右写IO线程。34天的正常运行时间,这些时间代表不到1%的正常运行时间。
innodb_lru_scan_depth
innodb_lru_scan_depth是一个非常糟糕的命名变量。一个更好的名字将innodb_free_page_target_per_buffer_pool。InnoDB的页面数量试图保持自由在每个缓冲池实例加快阅读和页面创建操作。变量的默认值是1024。
这个变量的危险是,在高价值的缓冲池,许多情况下,你可能会浪费大量的内存。与64年缓冲池的情况下,默认值是1 gb的内存。设置此变量的最佳方法是看的输出“显示引擎innodb状态\ G”寻呼机grep对“自由缓冲区”。这是一个例子。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql
&
gt
;
寻呼机
grep
“自由缓冲区”
寻呼机
集
来
grep的
免费的
缓冲区
”
mysql
&
gt
;
显示
引擎
innodb
状态
\
G
免费的
缓冲区
8187年
免费的
缓冲区
1024年
免费的
缓冲区
1023年
免费的
缓冲区
1022年
免费的
缓冲区
1020年
免费的
缓冲区
1024年
免费的
缓冲区
1025年
免费的
缓冲区
1025年
免费的
缓冲区
1024年
1
行
在
集
(
0.00
证券交易委员会
)
|
第一行是总对所有的缓冲池。如我们所见,InnoDB没有困难维持约1024免费每个缓冲池页面实例。最低的所有实例的观测值是1020。作为一个经验法则,你可以使用当前的变量值(这里是1024),减去最小的观测值在一个体面的样本的数量,然后将结果乘以4。如果1020年是最低的价值,我们会(1024 - 1020)* 4 ~ 16。最小允许变量的值是128。我们16日计算值小于128,所以应该使用128年。
innodb_flush_sync
innodb_flush_sync允许InnoDB冲洗忽略innodb_io_capacity_max值时,检查点年龄是其最大价值的94%以上。这通常是正确的,因此“在”的默认值。唯一的例外是一个情况下,阅读sla是非常严格的。允许InnoDB使用innodb_io_capacity_maxIOPs冲洗会与负载和读过sla将错过。
innodb_log_file_size和innodb_log_files_in_group
的变量innodb_log_file_size和innodb_log_files_in_group确定重做日志循环缓冲区的大小。讨论了这个话题在我们的长度以前的文章。从本质上讲,重做日志是一个杂志的最近的变化。最大允许总大小是512 gb的-一个字节。更大的重做日志循环缓冲区允许页面脏呆更长一段时间的缓冲池。如果在这段时间里,页面获得更多更新,写负载本质上是放气。降低写负载性能好,特别是接近IO-bound数据库。一个非常大的重做日志循环缓冲区导致崩溃后恢复时间花费更多的时间,但这些天这是少得多的一个问题。
作为一个经验法则,时间充分利用重做日志应该一个小时左右。看innodb_os_log_written状态变量随时间的演变,并相应地调整。记住,一小时是一个一般规则,你的工作量可能需要不同。这是一个非常简单的可调,它应该成为首批旋钮。
innodb_adaptive_flushing_lwm
innodb_adaptive_flushing_lwm定义了自适应水印较低激活冲洗。低水印值表示为一个百分比的检查点年龄最大的检查点。当比例值定义的变量,自适应冲洗是禁用的。默认值是10,最大允许的值为70。
更高的水印的主要好处是类似于使用更大的值innodb_log_file_size但它将数据库接近边缘的马克斯检查点的年龄。高的水印值低,平均写性能会更好,但可能会有短暂的摊位。生产服务器,增加innodb_log_file_size优先在增加innodb_adaptive_flushing_lwm。但是,暂时,它可能是有用的动态加速提升价值逻辑转储恢复或允许赶上它的主人的奴隶。
innodb_flushing_avg_loops
这个变量控制自适应冲洗的反应性算法,它抑制反应。它会影响计算的平均消费率重做日志。默认情况下,InnoDB计算平均每30秒,得到的值与前一个进一步的平均。突然交易激增,这意味着如果有一个自适应冲洗算法将反应缓慢,只有检查点与年龄相关的部分将立即反应。很难确定一个有效用例,有人会需要修改这个变量。
MySQL社区8.0.19后
innodb_io_capacity
MySQL 8.0.19之前,当InnoDB需要冲洗疯狂地在同步点,接着在大批量的页面。这种方法的问题是,冲洗顺序可能不是最优的,太多的页面可能来自同一个缓冲池的实例。
由于MySQL 8.0.19,愤怒的冲洗在大块的innodb_io_capacity大小。没有等待时间之间的块与IO能力所以没有关系。这样有助于更好的平衡冲洗秩序,降低了潜在的拖延时间。
innodb_idle_flush_pct
MySQL 8.0.19,闲置冲洗速度不再是直接规定innodb_io_capacity,乘以所代表的比例innodb_idle_flush_pct。InnoDB使用剩下的IO能力插入缓冲线程。当一个数据库变为空闲时,通常意义的LSN价值不移动,InnoDB刷新脏页,然后应用等待二级索引存储在变化改变缓冲区。如果这不是你想要的行为,降低值给一些IO改变缓冲区。
雷竞技下载官网Percona MySQL 5.7服务器。x和8.0.x
innodb_cleaner_lsn_age_factor
雷竞技下载官网Percona MySQL服务器有一个不同的默认适应性冲洗算法,high_checkpoint,本质上允许更多的脏页。这种行为是由变量控制的innodb_cleaner_lsn_age_factor。你可以恢复默认MySQL算法通过设置变量遗产。因为你应该有尽可能多的脏页不至于遇到风暴和停滞,high_checkpoint算法将帮助你。如果你有极端的检查点的年龄,也许遗产算法会更好。有关此主题的更多信息,请参阅我们的以前帖子。
innodb_empty_free_list_algorithm
这个变量控制InnoDB的行为时,挣扎在寻找空闲页面缓冲池实例。它有两个可能的值:遗产和倒扣。只有有意义如果你经常有“免费的缓冲区”接近于0的“显示引擎innodb状态\ G”。LRU经理在这种情况下,线程可以锤空闲列表的互斥锁,导致与其他线程争用。当设置为倒扣,线程将睡眠一段时间,由于未能找到空闲页面降低争用。默认值是倒扣在大多数情况下,通常应该没事的。
结论
还有其他变量影响InnoDB写道,但这些都是最重要的。作为一般规则,不over-tune数据库服务器和试图改变一个设置。
这是我们的理解InnoDB变量影响冲洗。这些发现支持的非常独特的接触我们在Percona各种用例。雷竞技下载官网我们也花很多时间阅读代码理解InnoDB的内部运动部件。像往常一样,我们是开放的评论,但如果可能的话,尝试任何反对我们的意见参考代码或可再生的用例。






我很困惑读完这些参数的官方文档。在读了这本书之后我还是很困惑。开始我的困惑是什么声明,innodb_io_capacity不需要改变。我认为这意味着innodb_io_capacity_max仍然应该设置,我将不再困惑你补充说。
无论如何,InnoDB在这个空间太多的调优选项。这是开始让MyRocks & RocksDB看起来容易调整。
确切地说,比innodb_io_capacity innodb_io_capacity_max更重要。MyRocks最近我工作,我可以建议你方便调优与你熟悉然后引擎。它最终工作假设,我有机会尝试列家庭…仍然有几件事情我不明白MyRocks闹够了。我的博客,在不久的将来。
RocksDB的问题是太多的选项,可以设置。问题不是太多的选择,应设置。如果能有简单的方法来选择名称空间分割成“可以设置”和“应该”,以减少混乱。我是一个老的文章http://smalldatum.blogspot.com/2018/09/5-things-to-set-when-configuring.html
从上面我还不清楚是否这些选项是“可以”或“应该”。也许这是你接下来的博客的内容。我应该设置哪些选项?
嗨伊夫,旧金山,
你写4清洁线程,InnoDB能够刷新速度非常高但是没有平行doublewrite缓冲区,doublewrite缓冲区将瓶颈前清洁线程。
你测试了MySQL 8.0.20 (https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html sysvar_innodb_doublewrite_files)。
现在,如果你认为默认2应该是4,像innodb_page_cleaners的数量,请让我们知道
欢呼,
嗨,弗雷德,8.0.20发布了这篇文章后,乍一看,新doublewrite缓冲似乎与Percona服务器并行doublewrite缓冲区。雷竞技下载官网我将更详细地检查,当我有一分钟。