innodb_flush_method = O_DIRECT与O_DSYNC性能对具有LVM磁盘分区的ext3的影响


12

在我的一个生产环境中,我们有两个实例在RedHat集群上运行,并且一个生产实例与该集群相关联。

我们有125G主内存,instance1占用了24G InnoDB缓冲池,instance2占用了12G,这与RedHat集群无关。数据日志和事务日志都位于带有ext3文件系统的LVM磁盘分区上。

为了提高性能和提高I / O吞吐量,我决定更改innodb_flush_methodO_DIRECT

参考MySQL文档:

InnoDB数据和日志文件位于SAN上的位置,已发现将设置innodb_flush_methodO_DIRECT可以使简单SELECT语句的性能降低三倍。

提到高性能MySQL Ver 2和3,它指出InnoDB开发人员使用发现了错误innodb_flush_method=O_DSYNCO_SYNC并且O_DSYNC类似于fsync()fdatasync()O_SYNC同步数据和元数据,而O_DSYNC仅同步数据。

如果所有这些看起来都像是在没有任何建议的情况下进行很多解释,则以下是建议:

如果您使用类似Unix的操作系统,并且您的RAID控制器具有备用电池的写缓存,则建议您使用O_DIRECT。如果不是,则默认设置或O_DIRECT将是最佳选择,具体取决于您的应用程序。

谷歌搜索,我得到这个基准测试报告:在O_DSYNCVSO_DIRECT

基准报告:
===================
1B行复杂事务测试,64个线程

 * SAN O_DIRECT:读/写请求:31560140(每秒8766.61个)
 * SAN O_DSYNC:读/写请求:5179457(每秒1438.52)
 * SAN fdatasync:读/写请求:9445774(每秒2623.66)
 *本地磁盘O_DIRECT:读/写请求:3258595(每秒905.06)
 *本地磁盘O_DSYNC:读/写请求:3494632(每秒970.65)
 *本地磁盘fdatasync:读/写请求:4223757(每秒1173.04。

但是,O_DIRECT禁用OS级别的缓存,可以禁用双重缓存,这会显示出更好的I / O吞吐量。

O_DIRECT而不是一起去O_DSYNC好吗?这两个选项有些令人困惑。哪个选项可以显示出更好的I / O吞吐量并增强性能,而不会对数据,读/写(特别是在生产中)产生任何影响?根据您的个人经验有更好的建议吗?

我可以在帖子中看到Rolando Update :

这两个参数仍然有些混乱。在可以看到大多数使用的生产配置模板的地方O_DIRECT,没有任何推荐的地方O_DSYNC

系统

  • MySQL 5.1.51-enterprise-gpl-pro-log
  • 红帽企业Linux服务器5.5版
  • 具有Raid Controller的DELL DRAC,具有电池写回缓存512MB
  • Dell PERC控制器H700带有备用电池(BBU)。

附加信息

mysql>显示类似'innodb_thread_concurrency'的变量; 

+ --------------------------- + ------- +
| 变量名| 价值|
+ --------------------------- + ------- + 
| innodb_thread_concurrency | 96 |
+ --------------------------- + ------- + 
设置1行(0.00秒) 

mysql>显示类似'innodb_read_io_threads'的变量; 
空置(0.00秒) 

mysql>显示类似'innodb_write_io_threads'的变量; 
空置(0.00秒)

我们使用的是默认插件,因此我从InnoDB状态发布了信息:

mysql> SELECT * FROM插件,在PLUGIN_NAME像'%innodb%'和PLUGIN_TYPE像'STORAGE ENGINE'\ G
*************************** 1.行******************** *******
           PLUGIN_NAME:InnoDB
        PLUGIN_VERSION:1.0
         PLUGIN_STATUS:有效
           PLUGIN_TYPE:存储引擎
   PLUGIN_TYPE_VERSION:50151.0
        PLUGIN_LIBRARY:NULL
PLUGIN_LIBRARY_VERSION:NULL
         PLUGIN_AUTHOR:Innobase OY
    PLUGIN_DESCRIPTION:支持事务,行级锁定和外键
        PLUGIN_LICENSE:GPL
设置1行(0.00秒)

Answers:


7

回到2009年1月21日,彼得·扎伊采夫(Peter Zaitsev)在mysqlperformanceblog.com上声明了以下内容

作为呼吁采取的行动–我肯定希望有人能够在这方面解决EXT3是否可以修复的问题,因为它是迄今为止Linux上最常见的文件系统。还值得研究是否可以在MySQL方面完成某些工作- O_DSYNC如果sync_binlog=1不是使用fsync会有所帮助,则可以使用标志打开binlog 吗?或者可能是binlog的预分配将是一个好的解决方案。

到目前为止,我还没有人碰过这个问题。O_DSYNC默认情况下,它不是一个吸引人的前景,但是可以容纳尚未真正验证的更快写入。那就是为什么这么多炒作O_DIRECT

我可以告诉您没有安装InnoDB插件。使用InnoDB插件,应该存在几个变量。

您应该通过以下两种方式之一升级InnoDB:

  • 升级到MySQL 5.5(所有InnoDB插件增强功能都是MySQL 5.5的一部分)
  • 升级InnoDB插件

完成后,您可以增强InnoDB以使其

  • 访问更多的CPU和内核
  • 增加读写I / O线程
  • 扩展I / O容量(这对于不同的存储介质尤其需要)

这是我过去关于设置可以更改的帖子:


1

我总是O_DIRECT对性能有更好的印象,因为它可以防止双重缓冲。另外,如果您具有带有电池后备写入缓存的硬件RAID。当然,这也取决于工作量,无论您是读还是写很重。

另外,请教专家:额外的要求fsync()是否O_DIRECT会导致整体性能明显下降,还是可以忽略不计?我还没有看到基准显示这一点。

另外,请注意,Percona启用了set的功能innodb_flush_method=ALL_O_DIRECT,该功能不仅可以在InnoDB数据文件上同时在InnoDB事务日志上提供直接I / O。


2
早在2012年,缓冲池就无法针对大型RAM进行很好的扩展,因此,在OS缓存比innodb缓冲池大得多的情况下,提到的双缓冲可能会很好。至于5.6及以上-我说你的答案是完全有效的。
noonex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.