服务器特征
- 系统总内存:8GB(运行MySQL以及上面运行的MySQL以外的其他东西,即不专用于MySQL)
- CPU核心数:6
- 我在数据库中的数据量约为2GB
- 我将InnoDB缓冲池大小设置为4GB
哪个更好:
- Innodb缓冲池实例设置为1?
- Innodb缓冲池实例设置为2(每个实例2GB)?
- Innodb缓冲池实例设置为4(每个实例1GB)?
- Innodb缓冲池实例设置为8(默认设置)
因此,我不确定如何推理缓冲池实例,以及整个“在InnoDB缓冲池如此大的情况下使用实例或遭受OS交换”。
哪个更好:
因此,我不确定如何推理缓冲池实例,以及整个“在InnoDB缓冲池如此大的情况下使用实例或遭受OS交换”。
Answers:
当我回到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,因此您不必再考虑它了。
我会这样说:阿库明斯基的回答是最高原则。我的答案只是根据过去的经验(好坏)从臀部射击。
应当增加缓冲池实例的数量,以避免缓冲池互斥争用。
如果缓冲池大小为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的缓冲池中,争用不太可能发生。