MySQL InnoDB缓冲池实例的最佳数量


13

服务器特征

  • 系统总内存:8GB(运行MySQL以及上面运行的MySQL以外的其他东西,即不专用于MySQL)
  • CPU核心数:6
  • 我在数据库中的数据量约为2GB
  • 我将InnoDB缓冲池大小设置为4GB

哪个更好:

  • Innodb缓冲池实例设置为1?
  • Innodb缓冲池实例设置为2(每个实例2GB)?
  • Innodb缓冲池实例设置为4(每个实例1GB)?
  • Innodb缓冲池实例设置为8(默认设置)

因此,我不确定如何推理缓冲池实例,以及整个“在InnoDB缓冲池如此大的情况下使用实例或遭受OS交换”。


您在哪里得到“使用如此大的InnoDB缓冲池大小时使用实例或遭受OS交换”?
里克·詹姆斯

减去实例空间之外的“ MySQL以外的其他东西”的空间,总buffer_pool的70%的RAM 应该没问题。
里克·詹姆斯

只要我认为所有答案都是“从臀部拍摄”,我就无法设置任何答案。如果有人想知道,我选择了4G缓冲池大小和2个实例,它在Debian 8.1上运行良好,在同一台机器上运行php-fpm + nginx的总内存为8G,大约mysql以平均60个查询/秒的速度运行。
阿德加德2015年

Answers:


7

当我回到MySQL 5.5时,我会想到同样的事情。

这些年来,我学到了以下内容:如果缓冲池大于安装的RAM的一半,并且innodb_buffer_pool_instances为1(默认值为 5.5),则交换的威胁总是迫在眉睫。

我之前曾讨论过:关于缓冲池实例的大小和数量是否有经验法则?。在那篇文章中,我提到了一个客户端示例,该客户端在服务器上具有192GB RAM和162GB缓冲池。当innodb_buffer_pool_instances为1时,发生交换。当我将innodb_buffer_pool_instances设置为2时,情况会变得更好。

在您的情况下,由于缓冲池恰好是一半,因此值1可能就可以了。我没有机会。我将其设置为2。

由于MySQL 5.6的默认值为8,因此您不必再考虑它了。

我会这样说:阿库明斯基的回答是最高原则。我的答案只是根据过去的经验(好坏)从臀部射击。


没门!交换取决于分配的内存量,而不取决于池实例。
里克·詹姆斯

很高兴知道默认值为8 ...但是如果将其减少到4或增加到16,会有什么区别呢?是否有任何记忆/存储惩罚或好处?我真正在这里的唯一原因是,mysqltuner建议使用innodb_buffer_pool_instances(= 1),但我并不总是信任它的建议。当然,我没有问题,只是好奇。
PJ布鲁内特

@PJBrunet如果InnoDB缓冲池小于RAM的一半,则InnoDB缓冲池实例可以保留为
1。– RolandoMySQLDBA

6

应当增加缓冲池实例的数量,以避免缓冲池互斥争用。

如果缓冲池大小为8GB,我怀疑您是否会看到缓冲池互斥争用。

更新0

我在回答中提到8Gb缓冲池,而在最初的问题中,总内存为8GB。当然,缓冲池必须小于8GB。4GB听起来是个不错的开始,但请确保没有发生交换。

更新1

// Yasufumi的幻灯片(在最新的MySQL版本中,输出可能略有不同)

要确定缓冲池互斥锁上是否存在争用,请SHOW ENGINE INNODB STATUS在高峰时间收集十二个样本。

然后使用shell片段对其进行聚合:

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

给出这样的输出:

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

如果看到大量的缓冲池互斥锁等待,那么该考虑多个缓冲池实例了。在小于约48G的缓冲池中,争用不太可能发生。


1
但千万不能有8G BUFFER_POOL只有8GB的内存!
里克·詹姆斯

那么,将以什么dbsize(即innodb缓冲池大小)开始考虑实例?我认为您的答案是,在这些相对较小的级别上,没有理由拥有多个。正确?您有这样的消息来源吗?MySQL文档说“千兆字节”(对我来说)是表达事物的非常模糊的方式。实际上,2 GB是多
字节的

2

如果您的操作系统具有“ swappiness”,则将其设置为1。问题可能是过于激进的OOM。


0

我建议将其设置为与要同时运行的MySQL线程的最大数量相匹配。我使用核心数。

我还设置innodb_read_io_threadsinnodb_write_io_threads匹配了这个数字。

如果innodb_buffer_pool_instances太低,您的线程可能会陷入信号量等待中。即使系统繁忙,这也将使CPU和I / O看起来都处于空闲状态-并且应用程序延迟会不断增加。

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.