二进制日志和文件系统是如何影响MySQL的性能的(译自Percona)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 基准测试的设置概览如下

01

基准测试的设置


基准测试的设置概览如下:

  • Percona Server for MySQL 5.7.21
  • InnoDB 存储引擎
  • 启用了外键,使用可重复读取隔离级别,并使用了 UTF8 字符集。
  • 数据集:sysbench-tpcc 有 10 个表和 100个仓库,总共有 1000个仓库,数据集大小约为90GB。
  • 使用 80GB、70GB 和 60GB innodb_buffer_pool_size来模拟不同的 IO 负载,并评估这对二进制日志写入的影响。


02

初步结果


第一次测试,对比没有启用二进制日志与启用二进制日志(设置 sync_binlog=0) :

我们可以看到没有启用二进制日志的性能通常略好。另一个值得注意的现象是,启用二进制日志且 sync_binglog=0 的情况下,每40秒会出现吞吐量下降到0,并持续 1-2 秒,这时基本上任何连接的应用都会停滞。原因是二进制日志文件 (max_binlog_size) 的大小有限制,即 1GB。当达到1GB的限制时,MySQL会执行二进制日志轮换。因为使用 sync_binlog=0 ,以前对二进制日志的所有写入都缓存在操作系统缓存中,在二进制轮换时,MySQL 强制同步刷新所有的更新到磁盘,这导致每 40 秒应用完全停止一次,40秒是在上述测试中填满 1GB 二进制日志所需的时间。我们该如何解决这个问题?显而易见的解决方案是更频繁地进行二进制日志的同步写入,这可以通过将sync_binlog设置为>0来实现。流行的选择是sync_binlog=1,这时每次提交都会写二进制日志,它可以最大限度的保护数据,但伴随着明显的性能下降。我将测试 sync_binlog=1000 和 sync_binlog=10000,这意味着分别每 1000 和 10000 个事务各执行一次二进制日志的同步写入。


03

测试结果

下面用表格的方式列出吞吐量的中位数(tps越多性能越好)


InnoDB缓存/ sync_binlog 0
1
1000
10000
无二进制日志
60GB 4174.945 3598.12 5263.375 4205.165 4277.955
70GB
5053.11
4541.985 4997.87 4997.87 5328.96
80GB 5701.985 5263.375 5303.145 5664.155 6087.925

我们可以得出一些结论:

  • sync_binlog=1 的性能损失最大,但差异最小,这与在没有二进制日志的情况下运行相当。
  • sync_binlog=0 在已启用的二进制日志时提供最佳的性能,但差异很大。
  • sync_binlog=1000 是一个很好的折衷方案,它以最小的差异提供比 sync_binlog=1 更好的性能。
  • sync_binlog=10000 可能不好,显示的差异比sync_binlog=0 少,但仍然很大。

那么我们应该把sync_binlog设置成什么值呢?这可能是在 sync_binlog=1 或 1000 之间做选择。这取决于您的应用和存储,我这里使用的是enterprise SATA SSD SAMSUNG SM86,但在存储性能比较差的情况下,设置sync_binlog=1对性能的影响更大。


04

件系统


以上所有结果都在 EXT4 文件系统上,让我们与 XFS 进行比较。它会显示不同的吞吐量和差异吗?

下面用表格的方式列出吞吐量的中位数(tps越多性能越好)





sync_binlog Buffer pool(GB) EXT4 XFS
0 60 4174.945 3902.055
0 70 5053.11 4884.075
0 80 5701.985 5596.025
1 60 3598.12 3526.545
1 70 4541.985 4538.455
1 80 5263.375 5255.38
1000 60 3950.19 3620.05
1000 70 4714 4526.49
1000 80 5303.145 5150.11
10000 60 4205.165 3874.03
10000 70 4997.875 4845.85
10000 80 5664.155 5557.61
No binlog 60 4277.955 4169.215
No binlog 70 5328.96 5139.625
No binlog 80 6087.925 5957.015

我们可以观察到一个总体趋势,即 XFS 的吞吐量中位数比 EXT4 差一点,差异几乎相同。

吞吐量的差异很小,您可以使用 XFS 或 EXT4中的任意一种。


05

硬件规


Supermicro 服务器:

  • Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz
  • 2 sockets / 28 cores / 56 threads
  • Memory: 256GB of RAM
  • Storage: SAMSUNG  SM863 1.9TB Enterprise SSD
  • Filesystem: ext4/xfs
  • Percona-Server-5.7.21-20
  • OS: Ubuntu 16.04.4, kernel 4.13.0-36-generic
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
8月前
|
存储 调度 C++
16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造
大规模数据如何进行语义检索? 当前 SLS 已经支持一站式的语义检索功能,能够用于 RAG、Memory、语义聚类、多模态数据等各种场景的应用。本文分享了 SLS 在语义检索功能上,对模型推理和部署、构建流水线等流程的优化,最终带给用户更高性能和更低成本的针对大规模数据的语义索引功能。
631 69
|
8月前
|
Ubuntu 关系型数据库 MySQL
MySQL二进制包安装
本文详细介绍了在多种Linux系统上通过二进制包安装MySQL 8.0和8.4版本的完整过程,涵盖用户创建、glibc版本匹配、程序解压、环境变量配置、初始化数据库及服务启动等步骤,并提供支持多发行版的一键安装脚本,助力高效部署MySQL环境。
1228 4
MySQL二进制包安装
|
9月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
280 6
|
10月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
734 10
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
960 90
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
867 23
|
Oracle 关系型数据库 MySQL
Oracle linux 8 二进制安装 MySQL 8.4企业版
Oracle linux 8 二进制安装 MySQL 8.4企业版
593 1
|
关系型数据库 MySQL 数据库
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
1482 5
图解MySQL【日志】——两阶段提交
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
903 5
图解MySQL【日志】——Redo Log

推荐镜像

更多