我们在一个相当大的服务器上运行一个中等大小(350GB)的数据库和一些相当大的表(几亿行,50GB)(RAID10中的2 x四核Xeon,24GB RAM,2.5“10k磁盘) ),并且正在进行一些相当慢的插入(例如,单行的简单插入需要90秒!)。
我们的innodb_buffer_pool_size设置为400MB,这对于这种设置来说通常太低了。但是,我们的托管服务提供商建议在ZFS上运行时这无关紧要。他是对的吗?
(对https://dba.stackexchange.com/questions/1975/is-tuning-the-innodb-buffer-pool-size-important-on-solaris-zfs的双重帖子表示道歉,但我不确定那里的观众有多大!)
答案 0 :(得分:2)
您的托管服务提供商不正确。在ZFS上运行MySQL时,您需要对各种事情进行不同的调整,但是减少innodb_buffer_pool_size
并不是其中之一。我写了一篇关于运行MySQL on ZFS的文章,前一阵子就给了lecture。特别是对于innodb_buffer_pool_size
,应该将其设置为在任何其他文件系统上合理的值,并且由于O_DIRECT并不意味着在ZFS上“不缓存”,因此应将primarycache=metadata
设置为在包含datadir
的ZFS文件系统上。您还可以在本文和讲座幻灯片中找到其他优化方法。
答案 1 :(得分:1)
我仍然会将innodb_buffer_pool_size设置为高出400M。原因? InnoDB缓冲池仍将缓存经常访问的表所需的数据和索引页。
运行此查询以获取MB中推荐的innodb_buffer_pool_size:
SELECT CONCAT(ROUND(KBS / POWER(1024,IF(pw< 0,0,IF(pw> 3,0,pw)))+ 0.49999),SUBSTR('KMG',IF(pw< 0, 0,IF(pw> 3,0,pw))+ 1,1))recommended_innodb_buffer_pool_size FROM(SELECT SUM(data_length + index_length)KBS FROM information_schema.tables WHERE engine ='InnoDB')A,(SELECT 2 pw)B;
只需使用此查询的结果或80%已安装的RAM(在您的情况下为19660M)中较小者。
我还将innodb_log_file_size设置为InnoDB缓冲池大小的25%。不幸的是,innodb_log_file_size的最大值是2047M。 (1M短于2G)因此,将innodb_log_file_size设置为2047M,因为我推荐设置的innodb_buffer_pool_size的25%是4915M。
另一个推荐是disable ACID compliance。对innodb_flush_log_at_trx_commit使用0或2(默认值为1,支持ACID合规性)这将产生更快的InnoDB写入风险在发生崩溃时丢失最多1秒的交易。
答案 2 :(得分:0)
如果你还没有,可能值得阅读slow-mysql-inserts。还有关于此问题的mysql文档的this link - 特别是关于在对大型表进行多次插入时考虑事务的问题。
更相关的是this mysql article on performance of innodb and zfs,它特别考虑缓冲池大小。
标题结论是;
使用InnoDB,ZFS性能曲线提出了一种新策略“将缓冲池大小设置为低,让ZFS处理数据缓冲。”
您可能希望在表格中添加更多细节,例如索引的数量/复杂性 - 这显然会产生很大的不同。
抱歉这是相当通用的建议而不是个人经验,我没有愤怒地运行zfs,但希望其中一些链接可能有用。