可以使MySQL使用多个内核吗?


131

我看到了一些专用的MySQL服务器,它们从未使用过多个内核。我比MySQL的DBA开发人员更多,因此需要一些帮助

设定

这些服务器非常繁重,并带有OLAP / DataWarehouse(DW)类型的负载:

  • 主:96GB RAM,8核心+单个RAID 10阵列
  • 测试:具有4核的32GB RAM
  • 最大的数据库为540 GB,总容量约为1.1TB,大部分为InnoDB表
  • Solaris 10 Intel-64
  • MySQL 5.5.x

注意:最大的数据库是从OLTP DR服务器复制的数据库,而DW就是从中加载的。它不是完整的DW:仅持续6个月到6周,因此它比OLTP DB小。

在测试服务器上的观察

  • 3个独立的连接
  • 每个都有一个并发的(并且不同) ALTER TABLE...DROP KEY...ADD INDEX
  • 这3个表格分别有2.5、3.8和450万行
  • CPU使用率上升至25%(一个核心已满),并且没有更高
  • 3个ALTER需要12-25分钟(最小的一个需要4.5分钟)

问题

  1. 要使用多个内核需要什么设置或补丁?
    也就是说,为什么MySQL不使用所有可用的内核?(与其他RDBMS一样)
  2. 是复制的结果吗?

其他注意事项

  • 我了解RDBMS“线程”和OS“线程”之间的区别
  • 我不是在问任何形式的并行性
  • InnoDB和线程的一些系统变量不是最优的
    (寻找快速的胜利)
  • 短期而言,我无法更改磁盘布局
  • 可以根据需要调整操作系统
  • 最小的桌子上的单个ALTER TABLE需要4.5分钟(震惊IMO)

编辑1

  • 两者的innodb_thread_concurrency都设置为8。是的,这是错误的,但不会使MySQL使用多个内核
  • innodb_buffer_pool_size在主数据库上为80GB,在测试中为10GB(另一个实例已关闭)。现在可以了。
  • innodb_file_per_table =开

编辑2

去测试

  • innodb_flush_method应该显示为O_DIRECT时不显示
  • 将遵循RolandoMySQLDBA的设置

让我知道我是否错过任何重要事项

干杯

更新资料

在RolandoMySQLDBA的答案中更改了innodb_flush_method + 3个线程设置
结果:>用于测试的1个核心=阳性结果


@Dtest:innodb_file_per_table = ON。显示引擎INNODB STATUS \ G仅是命令行吗?
gbn

@Dtest:我在SQLyog中没有输出,需要从命令行运行某人
gbn

1
webyog.com/forums/index.php?showtopic=1290应该在没有的情况下工作\G。另外,我觉得SHOW INNODB STATUS赞成不赞成SHOW ENGINE INNODB STATUS在5.5(我得到运行在命令行前的错误。
德里克·唐尼

1
尽管所有其他答案都不错,但由于您是开发人员,所以我建议您查看Shard Query code.google.com/p/shard-query,它可能会对您有帮助,尤其是在数据仓库环境中。
乔纳森

谢谢,这是我们考虑过的一种选择。我也兼任DBA角色。
gbn

Answers:


123

我实际上在2011年5月的Percona Live NYC会议上与MySQL专家讨论了innodb_thread_concurrency

我学到了一些令人惊讶的东西:尽管有文档,但最好保留innodb_thread_concurrency为0(无限并发)。这样,InnoDB innodb_concurrency_tickets可以为给定的MySQL实例设置确定最佳的打开次数。

设置innodb_thread_concurrency为0后,您可以将innodb_read_io_threads和设置为innodb_write_io_threads(自MySQL 5.1.38起)最大值为64。这应该使用更多的内核。


会尝试这个。无论如何,我也会根据我已经读过的东西将innodb_thread_concurrency设置为0
gbn11

9
+1为innodb_thread_concurrency = 0
randomx 2011年

3
@gbn-来自DBA.SE排名第一的人,谢谢是增强自信的人,非常感谢。谢谢,不客气!!!
RolandoMySQLDBA 2011年

设置全局innodb_read_io_threads = 8错误代码:1238。变量'innodb_read_io_threads'是只读变量
wgq3g23g,

2
@ wgq3g23g如果要执行RDS,请在数据库参数组中进行更改,然后重新启动实例。如果您使用的是EC2或裸机,请将该选项添加到my.cnf并重新启动mysqld。请。
RolandoMySQLDBA

29

MySQL将自动使用多个内核,因此25%的负载是巧合1或Solaris上的潜在配置错误。我不会假装不知道如何调整solaris,但是这篇文章介绍了一些solaris特定的调整信息

在MySQL 5.5中已经对InnoDB调整页面进行了大修,因此那里也有一些不错的信息。从InnoDB磁盘IO技巧

如果Unix顶级工具或Windows任务管理器显示您的工作负载中的CPU使用百分比小于70%,则您的工作负载可能是磁盘绑定的。也许您提交的事务过多,或者缓冲池太小。使得缓冲池更大的帮助,但不要将其设置为物理内存的80%以上。

其他需要检查的内容:

  • innodb_flush_method切换为O_DIRECT是值得测试的。如果有帮助,您可能需要使用forcedirectio选项挂载文件系统

  • innodb_flush_log_at_trx_commit从1 更改为0(如果您不介意在mysql崩溃时丢失最后一秒)或2(如果您不介意在OS崩溃时丢失最后一秒)。

  • 检查innodb_use_sys_malloc的值。本文提供了有关该变量的更多信息

    那时,还没有为多核CPU调整的内存分配器库。因此,InnoDB在mem子系统中实现了自己的内存分配器。该分配器由单个互斥锁保护,这可能会成为瓶颈。

    但是,在本节末尾有一些警告说明了打开变量的含义(默认情况下在5.5中为打开状态)。

    请注意,当禁用InnoDB内存分配器时,InnoDB将忽略参数innodb_additional_mem_pool_size的值。

  • 复制很可能导致某些问题。我知道您对并行性不感兴趣,但是从此工作日志的描述中可以看出

    当前,复制在多核计算机上无法很好地扩展。单个从线程一个接一个地执行复制事件,并且可能无法应付由单独的主服务器的CPU服务的并发多个客户端连接所产生的负载。

最终,由于发生了基于磁盘的操作,InnoDB可能不是最佳的数据仓库引擎。您可以考虑更改要压缩的MyISAM数据仓库表。

1 碰巧,我的意思是存在一个瓶颈,可以防止您的负载增加到25%以上,但不一定是强制性的单核问题。


谢谢。设置部分添加到问题。问题是使用单个内核进行了多次密集查询:尚未设置内存或线程。更多线程仍在同一内核上运行
gbn

@gbn感谢您的更新,仍在寻找。我当时以为这是“巧合”。我想知道这是否仅是solaris的问题(developers.sun.com/solaris/articles/mysql_perf_tune.html),但对该系统了解不多。
Derek Downey

1
@Dtest:我会扔掉那篇文章交给了Solaris管理过一些好东西有
GBN

1
现在,复制(可选)在从属服务器上是多线程的。自编写此答案以来,InnoDB已有改进。我不建议您使用MyISAM,尤其是如果不压缩的话。
瑞克·詹姆斯

15

单个连接将仅使用单个核心。(好的,InnoDB使用其他线程(因此使用内核)进行一些I / O处理,但这并不重要。)

您有3个ALTER,所以您使用的核心价值不超过3个。

las,甚至PARTITION也没有使用多个内核。

直到最近,多个连接将在4-8个内核之后达到最大。Percona的Xtradb(包含在MariaDB中)更好地利用了多个内核,但每个线程仍然只有一个。它们最多可以容纳32个核心。


(2015年更新:)具有5.6的多个连接最大可容纳约48个核心。5.7承诺会更好。(因此,Oracle基准测试表示。)但是,单个连接仍不使用多个内核。
里克·詹姆斯

更新(在进入Oracle的OpenWorld之后):新版本8.x将没有任何并行性。
瑞克·詹姆斯

9

恕我直言,在上述用例中,您永远不会使用多个内核。原因是您的工作负载受IO约束,而不受CPU约束。当您的3个连接创建一个新的索引时,每个索引都需要从磁盘读取整个表:这是在花时间,而不是在计算索引。


8

考虑到瓶颈可能是文件系统的IO性能。

除了@RolandoMySQLDBA建议的设置之外,我还为包含我的mysql数据目录的分区(在我的情况下为挂载到)中设置了noatime挂载设置。/etc/fstab/data01/mysql/dev/sdb1/data01

默认情况下,Linux记录每个磁盘读取或写入的访问时间,这会对IO性能产生负面影响,尤其是对于数据库等高IO应用程序而言。这意味着即使从文件中读取数据也会触发对磁盘的写操作... WAT!

要禁用此功能,请为所需的挂载点添加noatime挂载选项,/etc/fstab如下所示(以我的情况为例):

/dev/sdb1  /data01  ext4  defaults,noatime  0  2

然后重新挂载该分区:

mount -o,remount /data01

这将提高使用该分区的应用程序的读/写性能。但是...将所有数据保存在内存中无所不能。

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.