配置innodb_flush_method = O_DIRECT引起mysqldump慢

2023-05-16

今天配置my.cnf修改一些参数,mysqldump备份数据时发更慢了几倍,由原来的七分钟左路变成要20多分钟才能完成。经测试发现注释innodb_flush_method = O_DIRECT后就正常了。

下面文章说如果存储介质是SAN,那么使用默认fsync或者osync或许更好一些。

我的虚拟机是跑在机械盘的,可能性能比较差。

innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式,对于这个参数,文档上是这样描述的:

有三个值:fdatasync(默认),O_DSYNC,O_DIRECT(mysql5.7其它几个值 littlesync ,nosync,O_DIRECT_NO_FSYNC官方不建议使用)

默认是fdatasync,调用fsync()去刷数据文件与redo log的buffer
为O_DSYNC时,innodb会使用O_SYNC方式打开和刷写redo log,使用fsync()刷写数据文件
为O_DIRECT时,innodb使用O_DIRECT打开数据文件,使用fsync()刷写数据文件跟redo log


 首先文件的写操作包括三步:open,write,flush

上面最常提到的fsync(int fd)函数,该函数作用是flush时将与fd文件描述符所指文件有关的buffer刷写到磁盘,并且flush完元数据信息(比如修改日期、创建日期等)才算flush成功。

使用O_SYNC方式打开redo文件表示当write日志时,数据都write到磁盘,并且元数据也需要更新,才返回成功

O_DIRECT则表示我们的write操作是从mysql innodb buffer里直接向磁盘上写

至此我再总结一下三者写数据方式:

fdatasync模式:写数据时,write这一步并不需要真正写到磁盘才算完成(可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。
O_DSYNC模式:写日志操作是在write这步完成,而数据文件的写入是在flush这步通过fsync完成

O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲

官方的建议是这样:

How each setting affects performance depends on hardware configuration and workload. Benchmark your particular configuration to decide which setting to use, or whether to keep the default setting. Examine theInnodb_data_fsyncs status variable to see the overall number of fsync() calls for each setting. The mix of read and write operations in your workload can affect how a setting performs. For example, on a system with a hardware RAID controller and battery-backed write cache, O_DIRECT can help to avoid double buffering between the InnoDBbuffer pool and the operating system file system cache. On some systems where InnoDB data and log files are located on a SAN, the default value or O_DSYNC might be faster for a read-heavy workload with mostly SELECTstatements. Always test this parameter with hardware and workload that reflect your production environment.

也就是说,具体的取值跟硬件配置和工作负载相关,最好做一次压测来决定。不过通常来说,linux环境下具有raid控制器和write-back写策略,o_direct是比较好的选择;如果存储介质是SAN,那么使用默认fsync或者osync或许更好一些。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配置innodb_flush_method = O_DIRECT引起mysqldump慢 的相关文章

  • PHP - 使用 Ajax 刷新 While 循环数据

    使用PHP 我想创建一个 while 循环来读取大文件并在请求时发送当前行号 使用 Ajax 我想获取当前的行数并将其打印到页面上 使用 html 按钮 我希望能够单击并激活或终止仅运行一次并调用阿贾克斯方法 我已经尝试过 但由于某种原因
  • Mysql phpMyadmin 超时问题

    我在Mysql中有一个非常大的数据库 我需要以这种方式维护它 例如 Innodb 中大约有 300 000 条记录 我将记录解析到数据库中 但现在我需要通过转换一些字段类型 例如将 long int 转换为tinyint 或其他类型 来完善
  • 如何在 MySQL innoDB 中重建索引并更新统计信息?

    我有使用 MS SQL 服务器的经验 它是可能且有用的 and 重建索引 https msdn microsoft com en us library ms189858 aspx 我在MySQL innoDB中找不到这样的选项 有这样的选项
  • 在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新?

    我想将 cookie 添加到HttpServletResponse其内容 通常是 HTML 呈现后 正如这里提到的 http osdir com ml java jasig uportal 2005 10 msg00276 html htt
  • Java Socket OutputStream 未刷新

    我正在用java编写一个基于套接字的服务器 客户端连接到它 网络浏览器 服务器发回一个简单的 html 代码并设置 cookie 以在客户端下次再次连接时进行识别 我正在使用 PrintStream 写入套接字 但刷新不起作用 我可以刷新的
  • IntelliJ Idea 调试/运行控制台; System.out.flush 不刷新

    这几天一直困扰着我 因为它曾经有效 我升级了我的intellij 现在它不起作用了 我不想回去 但我需要一个答案 因此 我正在编写一个控制台应用程序 当它运行时 我希望有一个 shell 来显示进度 它在运行时工作正常 但是当我在 Inte
  • 如何刷新“RandomAccessFile”(java)?

    我在java中使用RandomAccessFile file new RandomAccessFile filename rw file writeBytes 如何确保这些数据刷新到操作系统 没有 file flush 方法 请注意 我实际
  • 如何修复 InnoDB 表?

    昨晚我们的 Solaris MySQL 数据库引擎 显然 执行得很差 至少有一些 InnoDB 表已损坏 事务日志中出现时间戳无序错误 以及有关索引损坏的特定错误 我们知道可用于 MyISAM 表修复的工具 但找不到任何适用于 InnoDB
  • MySQL 查询缓存:最大缓存大小限制为 128 MB?

    我的应用程序是数据库密集型的 因此我非常努力地确保应用程序和 MySQL 数据库尽可能高效地协同工作 目前 我正在调整 MySQL 查询缓存 使其符合服务器上运行的查询的特征 query cache size是可以存储在缓存中的最大数据量
  • 两个相同查询(不同参数)的 MySQL InnoDB 死锁问题

    我有下表 CREATE TABLE IF NOT EXISTS task id int 10 unsigned NOT NULL AUTO INCREMENT job id int 10 unsigned NOT NULL COMMENT
  • MySQL:如何实现行级事务锁定而不是表锁定

    这是用例 我有一张桌子 上面有一堆可用或不可用的唯一代码 作为事务的一部分 我想选择表中可用的代码 然后在事务中更新该行 由于这种情况可能会同时在许多会话中同时发生 因此我希望理想地选择一个随机记录并在表上使用行级锁定 以便其他事务不会被从
  • 列出Innodb全文索引的单词

    在 Mysql Innodb 中 我创建了一个全文索引 是否有一个查询可以用来检索全文索引中包含的所有单词的列表 我的想法是使用一个文本字段来保存标签列表的 json 转储 我可以使用全文查询来检索与标签匹配的行 它有效 剩下的问题是检索索
  • 在 MySQL 中使用 NoSQL

    我注意到 MySQL 可以将 Memcached NoSQL 与 InnoDB 结合使用 但我无法检索有关如何使用它的信息 我想与 PHP 一起使用 NoSQL 查询是标准的吗 首先 MySQL从5 6版本开始只支持NoSQL的memcac
  • Grails: .save(flush:flush, insert:true) 与 .save(flush:true) 有何不同

    在spring security生成的类中UserRole or SecUserSecRole 你可以随意称呼它 有一个命令可以创建一个new UserRole 并保存它 save flush flush insert true 这意味着什
  • MySQL 的锁定和并发

    我目前正在将 Mysql 与 InnoDB 存储引擎用于所有表 所以 我想知道这是否是一个真正的问题以及是否有解决方案 例如 我将使用数据库事务向用户收费 1 检查他的余额 2 减去他的余额 3 将此余额记入某处 4 提交 如果更新发生在
  • 如何进行快速但不准确的 InnoDB 行计数?

    PHPMyAdmin常见问题解答有话要说 http www phpmyadmin net documentation faq3 11关于 InnoDB 的大概行数 phpMyAdmin 使用快速方法来获取行数 并且此方法仅在 InnoDB
  • MySQL REPLACE 在自动递增行中

    假设我有一个 MySQL 表 其中包含三列 id a and b和名为id is an AUTO INCREMENT场地 如果我将如下查询传递给 MySQL 它将正常工作 REPLACE INTO table id a b VALUES 1
  • MySQL InnoDB 约束不起作用

    我偶然发现 innoDB 约束的奇怪行为 但找不到原因 我有包含数据的表格 下面列出了它们的结构 CREATE TABLE contents id int 10 unsigned NOT NULL AUTO INCREMENT title
  • 使用控制台记录器的控制台应用程序不会写入最终消息。轻松重现

    Windows 上使用 LoggerFactory 的 net 6 控制台应用程序 最终消息不会出现在控制台上 loggerFactory Dispose 没有帮助 Ilogger 没有 Dispose 方法 这是一个复制品 大约会出现 2
  • 为什么将 std::endl 与 ostringstream 一起使用会影响输出速度?

    我正在计算将文本打印到标准输出的各种方法之间的差异 我正在测试cout printf and ostringstream两者同时使用 n and std endl 我期望std endl有所作为cout 确实如此 但我没想到它会减慢输出速度

随机推荐