Riedsio Asked: 2011-01-05 10:17:50 +0800 CST2011-01-05 10:17:50 +0800 CST 2011-01-05 10:17:50 +0800 CST 您如何针对繁重的 InnoDB 工作负载调整 MySQL? 772 假设有一个以 InnoDB 表为主的生产 OLTP 系统 系统失调/配置错误的常见症状是什么? 您最常从默认值更改哪些配置参数? 您如何在出现问题之前发现潜在的瓶颈? 您如何识别和解决活动问题? 任何详细说明特定变量和诊断的轶事status将不胜感激。 mysql performance 5 个回答 Voted RolandoMySQLDBA 2011-02-12T19:51:29+08:002011-02-12T19:51:29+08:00 有趣的是,在 MySQL 5.5 中,您现在可以拥有多个 innodb 缓冲池。 你关心的参数是 innodb_buffer_pool_instances(默认为 1) innodb_buffer_pool_size(默认为 1G) 大约一个月后,我计划为一个客户端实现 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 我看到 192GB 的服务器 RAM 映射为 96GB 到每个物理内核。因此,我将 innodb_buffer_pool_instances 设置为 2。现在情况看起来不错。我将更新我的答案,看看这如何影响接下来 2 个月的内存交换。 Best Answer Gaius 2011-01-16T09:23:53+08:002011-01-16T09:23:53+08:00 这是 Sun 的 Jenny Chen 的一篇关于 InnoDB 调优的好文章——她写了很多关于 MySQL 的博客,其中一些是 Solaris 特定的(例如使用DTrace),但整个博客都充满了有趣的花絮。 Brian Ballsun-Stanton 2011-01-10T16:29:40+08:002011-01-10T16:29:40+08:00 您可能想探索以下资源: 最佳实践常见问题解答 手动:调整服务器参数 手册:InnoDB 调优 较旧的重要变量列表。 Matt Healy 2011-01-11T21:00:05+08:002011-01-11T21:00:05+08:00 首先增加 my.cnf 中默认的 InnoDB Buffer Pool Size(我相信它默认为 8MB) 您可能应该将其设置为 RAM 大小的 75%(通常) TomaszSobczak 2011-01-06T06:09:59+08:002011-01-06T06:09:59+08:00 您最常从默认值更改哪些配置参数? 内存配置
有趣的是,在 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 的博客. 阅读后,我立即为我的客户付诸实践。我运行了这个命令
我看到 192GB 的服务器 RAM 映射为 96GB 到每个物理内核。因此,我将 innodb_buffer_pool_instances 设置为 2。现在情况看起来不错。我将更新我的答案,看看这如何影响接下来 2 个月的内存交换。
这是 Sun 的 Jenny Chen 的一篇关于 InnoDB 调优的好文章——她写了很多关于 MySQL 的博客,其中一些是 Solaris 特定的(例如使用DTrace),但整个博客都充满了有趣的花絮。
您可能想探索以下资源:
首先增加 my.cnf 中默认的 InnoDB Buffer Pool Size(我相信它默认为 8MB)
您可能应该将其设置为 RAM 大小的 75%(通常)
内存配置