mysql将在innodb_flush_method=O_DSYNC
中打开和刷新数据/日志文件,如下所示
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来刷新日志文件
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将日志文件的元数据写入存储设备吗?
发布于 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的迪米特里说。我现在喜欢在珀科纳,你可以选择。
发布于 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百万。
https://dba.stackexchange.com/questions/72721
复制相似问题