您如何调整MySQL以处理繁重的InnoDB工作负载?


39

假设生产OLTP系统主要包含InnoDB表

  • 错误/配置错误的系统的常见症状是什么?
  • 您最常更改哪些配置参数的默认值?
  • 在出现问题之前,您如何发现潜在的瓶颈?
  • 您如何识别和解决活动中的问题?

任何详述特定status变量和诊断的轶事都将不胜感激。


2
这个问题非常广泛。您可以将其分为四个问题吗?(甚至您的项目符号问题都难以置信的广泛。您能否通过具体问题实例化这些问题?)
Brian Ballsun-Stanton 2011年

Answers:


16

是Sun的Jenny Chen撰写的有关InnoDB调整的好文章-她在MySQL上写了很多博客,其中有些是Solaris特定的(例如,使用DTrace),但是整个博客充满了有趣的花絮。


4
珍妮·陈是谁?
Pacerier,2015年

19

有趣的是,在MySQL 5.5中,您现在可以拥有多个innodb缓冲池。

您关心的参数是

在大约一个月的时间里,我计划为客户端实现112个innodb缓冲池。我会让你知道这是怎么回事。

更新2011-02-27 21:57 EDT

我发现innodb_buffer_pool_instances的最大值是64,我决定配置144 GB,因此我将innodb_buffer_pool_instances设置为18,将innodb_buffer_pool_size设置为8。我当前正在为服务器加载450GB

更新2011-04-28 13:44 EDT

我尝试了多个InnoDB缓冲池。线程锁定和争用过多。我切换到一个162GB的缓冲池+将read_io_threads和write_io_threads设置为64(最大值)。这工作得更好。

更新2012-07-03 17:27 EDT

我学到了一些关于MySQL的惊人知识。如果您分配的单个整体式InnoDB缓冲池大于已安装的总数量除以物理CPU数量,则由于InnoDB缓冲池已满,将促使操作系统定期更换内存。MySQL 5.5的选项innodb_buffer_pool_instances可用于拆分缓冲池。昨天,我为去年在回答中提到的客户正确实施了此操作。我的客户端缓冲池还有162GB。我已将服务器的innodb_buffer_pool_instances选项设置为2,因为每个数据库服务器都是双六核的。我原本打算将其设置为12,但后来一位同事向我展示了Jeremy Cole的有关MySQL和Swappiness博客。阅读后,我立即为我的客户将其付诸实践。我跑了这个命令

numactl --hardware

我看到了192GB的服务器RAM和96GB到每个物理核心的映射。因此,我将innodb_buffer_pool_instances设置为2。现在情况看起来很好。我将更新答案,以了解这如何影响接下来2个月的内存交换。


@RolandoMySQLDBA,您好,在jeremy的博客中,我找不到任何设置innodb实例等于物理CPU数量的连接或结论都可以解决交换问题。是否多个innodb实例会自动在内存节点之间保持平衡,而无需设置numactl --interleave = all,刷新Linux的缓冲区高速缓存或强制OS分配InnoDB的缓冲池?
Wen Ren

@Rolando,尼斯2x 100 GB内存。是哪个客户
Pacerier,2015年

我认为“实例”是这样实现的:(块号)MOD(数字实例)->(将块放入哪个实例)。这与NUMA 无关
里克·詹姆斯


4

首先在my.cnf中增加默认的InnoDB缓冲池大小(我相信它默认为8MB)

您可能应该将此设置为RAM大小的75%(通常)


-1

您最常更改哪些配置参数的默认值?

内存配置


您能否提供更多说明性答案?您会如何改变?为什么要进行这些更改?更改之后,您的预期观察结果是什么?您怎么知道将其更改为什么?
jcolebrand

开箱即用的mysql配置已准备好快速设置myisam表(因为大多数用户以这种方式使用它),此外,要拥有经过优化的服务器,您应该选择要使用的“主要”引擎(innodb或mysql),因为很难配置数据库以实现展位引擎的出色性能,mysql具有用于myisam和innodb引擎的单独缓冲区
sbczk 2011年
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.