在我的一个生产环境中,我们有两个实例在RedHat集群上运行,并且一个生产实例与该集群相关联。
我们有125G主内存,instance1占用了24G InnoDB缓冲池,instance2占用了12G,这与RedHat集群无关。数据日志和事务日志都位于带有ext3文件系统的LVM磁盘分区上。
为了提高性能和提高I / O吞吐量,我决定更改innodb_flush_method
为O_DIRECT
。
参考MySQL文档:
InnoDB数据和日志文件位于SAN上的位置,已发现将设置
innodb_flush_method
为O_DIRECT
可以使简单SELECT
语句的性能降低三倍。
提到高性能MySQL Ver 2和3,它指出InnoDB开发人员使用发现了错误innodb_flush_method=O_DSYNC
。O_SYNC
并且O_DSYNC
类似于fsync()
和fdatasync()
:O_SYNC
同步数据和元数据,而O_DSYNC
仅同步数据。
如果所有这些看起来都像是在没有任何建议的情况下进行很多解释,则以下是建议:
如果您使用类似Unix的操作系统,并且您的RAID控制器具有备用电池的写缓存,则建议您使用
O_DIRECT
。如果不是,则默认设置或O_DIRECT
将是最佳选择,具体取决于您的应用程序。
谷歌搜索,我得到这个基准测试报告:在O_DSYNC
VSO_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秒)