首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ib_logfile在O_SYNC打开innodb_flush_method=O_DSYNC时

ib_logfile在O_SYNC打开innodb_flush_method=O_DSYNC时
EN

Database Administration用户
提问于 2014-07-30 09:54:24
回答 2查看 940关注 0票数 4

mysql将在innodb_flush_method=O_DSYNC中打开和刷新数据/日志文件,如下所示

代码语言:javascript
运行
复制
Open log    Flush log   Open datafile   Flush data

O_SYNC       NONE           NONE         fsync ()                    

我的第一个问题是,为什么我们需要使用O_SYNC来打开日志而不是O_DSYNC

对于O_DSYNC,每个事务都需要一次写入,而对于O_SYNC则需要两次写入。我觉得这会有很大的不同。

我在percona服务器ALL_O_DIRECT中找到了另一个选项:使用O_DIRECT同时打开数据和日志文件,并使用fsync()刷新数据文件,而不是日志文件。

测试此选项使用sysbench OLTP,单线程

响应时间从20.11ms变为8.3ms

在MySQL5.7上测试选项O_DIRECT_NO_FSYNC,它仍然调用fsync来刷新日志文件

代码语言:javascript
运行
复制
  strace -p `pgrep -x mysqld`  -ff -e trace=desc >strace.out 2>&1 &
  tail -f strace.out |grep "(8\|(9"

  [pid 12258] pwrite(9, "\200\10K\376\2\0\0N\0\0\0L.\0\4\0\2018\0300\2018\2\0\2018\0304\226\240\4\0"..., 1024, 26740736) = 1024
  [pid 12258] fsync(9)                    = 0
  [pid 12258] pwrite(9, "\200\10K\377\2\0\0\25\0\0\0L\10\215\247\3\4\0\0\0\1\247\f\240\37\0\6\0\1\200\4\200"..., 1024, 26741248) = 1024
  [pid 12258] fsync(9)                    = 0

第二个问题,除了使用ALL_O_DIRECT之外,还有其他方法可以阻止innodb将日志文件的元数据写入存储设备吗?

EN

回答 2

Database Administration用户

发布于 2014-07-30 10:24:12

是的,这个O_DSYNC (选项)根本没用,因为MySQL/InnoDB工程师认为在某些情况下(损坏) 和禁用它在许多情况下,使它成为一个同义词O_SYNC是危险的。出于同样的原因,它也会执行fsync()

您想要调优的主要内容是O_DIRECT与默认(刷新),以及Percona上的ALL_O_DIRECT

在您的例子中,我认为您对文件系统( O_DIRECT闪耀的地方)有很好的延迟。有时,在文件系统缓存中拥有事务日志可能会造成伤害(尽管这种差异对我来说似乎有点太大了--您是否将其与所有版本的O_DIRECT进行比较,该版本只避免数据文件缓存?)。

也要小心,因为sysbench可能不能很好地代表您的实际负载。根据flush_log_at_trx_commit的不同,响应时间可能会发生很大的变化,我假设您的响应时间为1。

据来自Oracle的上游解决方案为5.7的迪米特里说。我现在喜欢在珀科纳,你可以选择。

票数 1
EN

Database Administration用户

发布于 2014-07-30 13:26:07

请研究一下数据库服务器的内核,看看操作系统是如何完成日志记录的。为什么?我最近遇到一个来自mysqlperformanceblog.com的最新文章,上面写着:

我还查看了内核ext4源代码和changelog。直到最近,在内核3.2之前,data=journal不支持data=journal,MySQL在错误日志中会发出警告。现在,使用最近的内核,O_DIRECT映射到O_DSYNC,而O_DIRECT是伪造的,总是用于data=journal,这正是我们所需要的。实际上,我尝试了“innodb_flush_method=O_DSYNC”并找到了相同的结果。对于较老的内核,我强烈建议使用“innodb_flush_method=O_DSYNC”设置来确保文件被打开,这将使文件对ext4是事务性的。一如既往,彻底测试,我只在Ubuntu14.04上进行了测试。

你看到了吗?

O_DIRECT映射到O_DSYNC,而O_DIRECT是伪造的。

哈?我是认真的?吓到我了。

下一步该做什么

我以前写过关于诺姆b (MySQL innodb的澄清_同花顺_方法变量对)的文章。当然,诺姆b_同花顺_方法设置为O_DIRECT可以让InnoDB负责缓存。如果它是伪造的,你就任由操作系统摆布。更糟糕的是,你在云端。现在,你真的要听命于操作系统了。

由于操作系统可能是磁盘刷新的瓶颈,我建议将诺姆b_同花顺_日志_在…_trx_提交设置为1以外的其他内容。

根据MySQL关于诺姆b_同花顺_日志_在…_trx_提交的文档

如果值为0,任何mysqld进程崩溃都可以擦除事务的最后一秒。日志缓冲区每秒写入日志文件一次,对日志文件执行刷新到磁盘操作,但在事务提交时不执行任何操作。如果值为2,操作系统崩溃或停电可以擦除提交记录的最后一秒。日志缓冲区将在每次提交时写入文件,但不对其执行刷新到磁盘操作。但是,日志文件上的刷新也是在值为2时每秒发生一次。注意,由于进程调度问题,每秒一次刷新并不是100%的保证。

我会将诺姆b_同花顺_日志_在…_trx_提交设置为0,以使日志缓冲区刷新。

根据您的写I/O,我还会将诺姆b_日志_缓冲器_大小增加到6400万或128百万。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/72721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档