1

我们在相当大的服务器(2 x 四核 Xeon、24GB RAM、RAID10 中的 2.5" 10k 磁盘)上运行一个中等大小 (350GB) 的数据库,其中包含一些相当大的表(几亿行,50GB),以及正在获得一些非常慢的插入(例如,单行的简单插入需要 90 秒!)。

我们的 innodb_buffer_pool_size 设置为 400MB,对于这种设置来说通常太低了。但是,我们的托管服务提供商建议在 ZFS 上运行时这无关紧要。他是对的吗?

(为https://dba.stackexchange.com/questions/1975/is-tuning-the-innodb-buffer-pool-size-important-on-solaris-zfs上的双重帖子道歉,但我不确定如何大观众在那边!)

4

3 回答 3

2

您的托管服务提供商不正确。在 ZFS 上运行 MySQL 时,您应该对各种不同的东西进行不同的调整,但减少innodb_buffer_pool_size不是其中之一。我写了一篇关于在 ZFS 上运行 MySQL的文章,并在不久前做了一个讲座。具体而言innodb_buffer_pool_size,您应该将其设置为在任何其他文件系统上合理的值,并且因为 O_DIRECT 并不意味着在 ZFS 上“不缓存”,所以您应该primarycache=metadata在包含datadir. 您可以在文章和讲座幻灯片中找到其他优化。

于 2020-06-05T21:27:58.783 回答
1

我仍然会将 innodb_buffer_pool_size 设置为远高于 400M。原因?InnoDB 缓冲池仍然会缓存你经常访问的表所需的数据和索引页面。

运行此查询以获取推荐的 innodb_buffer_pool_size(以 MB 为单位):

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。(2G 不足 1M)因此,将 innodb_log_file_size 设置为 2047M,因为我推荐设置的 innodb_buffer_pool_size 的 25% 是 4915M。

另一个建议是禁用 ACID 合规性。对 innodb_flush_log_at_trx_commit 使用 0 或 2(默认为 1,支持 ACID 合规性)这将产生更快的 InnoDB 写入,但在发生崩溃时有丢失多达 1 秒事务的风险。

于 2011-03-29T17:54:29.247 回答
0

如果您还没有阅读,可能值得阅读slow-mysql-inserts 。此外,此链接指向有关此问题的 mysql 文档 - 特别是在考虑事务时,如果您正在对大表进行多次插入。

更相关的是这篇关于 innodb 和 zfs 性能的 mysql 文章,它特别考虑了缓冲池的大小。

标题结论是;

对于 InnoDB,ZFS 性能曲线提出了一种“将缓冲池大小设置为低,让 ZFS 处理数据缓冲”的新策略。

您可能希望添加更多细节,例如表上索引的数量/复杂性 - 这显然会产生很大的不同。

抱歉,这是相当笼统的建议,而不是来自个人经验,我没有生气地运行 zfs,但希望其中一些链接可能有用。

于 2011-03-29T16:23:03.190 回答