您如何为繁重的 InnoDB 工作负载调整 MySQL?

Rie*_*sio 40 mysql innodb performance

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

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

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

Rol*_*DBA 20

有趣的是,在 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 缓冲池大于Total Installed Divided By Number of Physical CPUs,由于完整的 InnoDB 缓冲池,您将促使操作系统定期进行内存交换。MySQL 5.5 的innodb_buffer_pool_instances选项可用于拆分缓冲池。昨天,我为去年回答中提到的客户正确实施了这一点。我仍然有 162GB 用于客户端的缓冲池。我已将服务器的 innodb_buffer_pool_instances 选项设置为 2,因为每个数据库服务器都是双六核。我想将它设置为 12,但后来一位同事向我展示了Jeremy Cole 关于 MySQL 和 Swappiness博客. 读完后,我立即为我的客户付诸实践。我运行了这个命令

numactl --hardware
Run Code Online (Sandbox Code Playgroud)

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


Gai*_*ius 16

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

  • 珍妮陈是谁? (4认同)

Bri*_*ton 7

您可能想要探索以下资源: