科学健康资讯 · 内容仅供参考,不替代专业诊疗 联系我们|疾病百科
操作系统

instances(mysql 参数调优(11)之innodb_buffer_pool_instances设置多个缓冲池实例)

2023-08-21 操作系统 本文链接

  MySQL 5.5带来了缓冲实例,这是一种减少内部锁竞争以提高MySQL吞吐量的方法。在5.5版本中,这对提高吞吐量的帮助有限。然而,在MySQL 5.6版本中,这种提升就非常明显。所以在MySQL5.5中,你可能会保守地设置innodb_buffer_pool_instances为4个。而在MySQL 5.6和5.7中,你可以设置为8-16个缓冲池实例。

  调整后观察,你可能觉得性能提升并不明显。但在大多数高负载情况下,它应该表现不错。不过要注意,不要指望这个设置能够减少单个查询的响应时间。它主要在高并发负载的服务器上能够显示出差异。比如,在多个线程同时做很多事情的情况下。

  在MySQL 5.7和8.0中,INNODB_BUFFER_POOL_INSTANCES的默认值是1。如果MySQL存在高并发和高负载访问,设置为1会导致大量线程对BUFFER_POOL的单实例互斥锁竞争,从而消耗一定量的性能。

  设置pool_instances的值可以根据CPU核心数进行调整。它的作用是:

  1)对于拥有数千兆字节缓冲池的系统,通过减少不同线程对缓存页面进行读写的竞争,将缓冲池划分为多个独立的实例可以提高并发性。可以类比为Java中的ThreadLocal线程本地变量,为每个线程维护一个buffer pool实例,这样就不需要争用同一个实例了。相当于减少高并发情况下MySQL对INNODB_BUFFER缓冲池的竞争。

  2)使用散列函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给缓冲池中的一个实例。每个缓冲池实例管理自己的空闲列表,刷新列表,LRU列表以及连接到缓冲池的其他所有数据结构,并受其自己的缓冲池互斥量保护。这样可以提高缓冲池的效率和并发性。

本文内容仅供健康科普参考,不能替代专业医疗诊断和治疗建议。如有身体不适,请及时就医并遵从医师指导。

相关阅读