免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12125 | 回复: 13
打印 上一主题 下一主题

mysql具体是怎么支持多核的呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-23 11:03 |只看该作者 |倒序浏览
如果一个连接线程收到一个查询select请求,解析优化sql的时候是多个线程一起解析的吗?
或者解析完成之后,引擎里是多个线程一起读取索引和具体的物理块的?
再或者是支持查询粒度级别的并发,一个连接线程收到的多个select查询之间是分配到多个核上并发执行的,单个select语句是串行执行的?
再或者支持的是连接粒度级别的并发,多个连接线程间是并发执行的,而单个连接线程收到指令的执行是串行的?

评分

参与人数 1可用积分 +5 收起 理由
枫影谁用了 + 5 话题不错

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2009-11-23 22:58 |只看该作者
MySQL可以使用CPU多核,但是一个线程,或是连接,却只能使用一个核。所以,如果同时有8个查询同时在运行的话,那么8个核应该都是会被使用到的。但是,只有一个查询在运行的话,那么只能是一个核被这个查询所使用。

评分

参与人数 1可用积分 +5 收起 理由
枫影谁用了 + 5 我很赞同

查看全部评分

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
3 [报告]
发表于 2009-11-24 10:47 |只看该作者
嗯 基本是这样的。

论坛徽章:
0
4 [报告]
发表于 2009-11-25 11:11 |只看该作者

RE: is MySQL query execution single threaded?

Assuming you are asking if a SELECT is split up so that multiple CPUs
can participate in the operation, I don't believe any of these do such.
MyISAM, InnoDB, InfoBright, Partition, Federated (client), and Merge (at
least) fail to do such as of 5.1.

InnoDB uses I/O threads that are separate from the single SQL thread.
These are shared resources.

Separate SELECTs do use separate threads, but they stumble over each
other due to inefficiencies in
* Malloc in InnoDB
* premature locking of the Query Cache (unless it is fully OFF)
* key_buffer locking
Various 5.1 benchmarks show that these problems cause a decline in
system throughput after about 4-8 cores.  The problems are addressed to
various degrees in the "Google patch", the "Percona patch" (derived from
Google), and 5.4.

[Please correct any misrepresentations I have made.]

Rick James
MySQL Geeks - Consulting & Review

-----------------------------------------------------------------------------------------


学习了,多谢各位.
刚好在10月的邮件列表里看到这么封邮件,也是讨论单个查询是怎么执行的..
以上的邮件地址如下:
http://lists.mysql.com/internals/37347

有几点疑问,他所说的把一个select分割到多个核上执行的三点问题具体是怎么回事呢:

1.InnoDB 使用的malloc的问题?  -- malloc对分割操作具体有什么影响呢? 查了下好像google的patch中是用了tcmalloc

2.过早的锁定查询缓存?  --  难道不是先在查询缓存中查询完此select指令还未执行过,然后才开始把select分割的吗?

3.索引缓存的锁定? -- 也就是分割到多个核上执行的select不能同时访问索引缓存?


然后他说这些问题,已经被解决了..google的patch,和mysql 5.4.

想知道,他们是怎么做的呢, mysql5.4中具体是怎么支持多核的呢?

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
5 [报告]
发表于 2009-11-25 12:15 |只看该作者
这个得仔细看源码了

论坛徽章:
0
6 [报告]
发表于 2009-11-25 14:12 |只看该作者
原帖由 liova 于 2009-11-25 11:11 发表
Assuming you are asking if a SELECT is split up so that multiple CPUs
can participate in the operation, I don't believe any of these do such.
MyISAM, InnoDB, InfoBright, Partition, Federated (c ...



多核?

应用层上看,不存在多不多核的问题。应用程序(mysqld)所要做的是进行系统调用来产生多线程。
我想你这里要问的是多线程(至于哪个线程在哪个核上面运行,是由操作系统进行分配的;有多少个线程可以同时执行取决于物理cpu线程数和资源共享度)。

翻开我们的书或者mysql的源代码你会发现,mysql中存在很多全局变量。各线程是通过mutex来获取这些变量的,一旦被lock后,其他程序只能在原地spin(即在占这cpu这个茅坑不拉屎)。 你可以在多线程的物理机上查看繁忙的mysql,你会发现cpu线程多到一定程度时,mysql系统总体性能反倒下降了。(这也是为什么你在很多地方可以看到建议当mysql <= 5.1 时,最多放在8核的物理机器上。)

malloc和query cache check都是要加锁的。

编写过多线程的哥们应该知道,在多线程编程环境下,建议使用tcmalloc这一轻量级的操作来分配内存。因为这个操作可以减少执行时间,也就是减少锁时间。

query cache也是一样的。 我们需要加锁,防止线程1在使用某块cache时候,被其他线程2 所 update掉。


解释不对的,欢迎拍砖。

评分

参与人数 1可用积分 +10 收起 理由
枫影谁用了 + 10 鼓励

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2009-11-25 15:06 |只看该作者
非常感谢大家的回复,又了解了一点。

对的,从应用层看确实不用在意是否多核,而且程序也只需要负责产生线程,调度是由操作系统来负责的。但是我觉的对MySQL来说还是需要知道是否多核的,比如你的处理器只有单个计算核,那在执行时大量使用多线程不是个明智的选择,还需要浪费产生线程的开销。如果你的处理器是intel core i7呢 -- 同时具备多个具有独立L1、L2cache的物理核、支持指令级的无序执行以及硬件支持的多线程。这时候很自然的想是否能利用这些物理资源,使单个查询、DML或DDL操作能分割成多个操作并行的在这些核上执行 -- 也就是并行查询。当知道物理资源的情况下选择适当的策略。oracle的并行执行是这样做的吗?
当然具体分到哪个核上执行是操作系统根据调度算法来控制的,最极端的也就多个线程都被分配到一个核上,那有没有这么个情况呢,整个系统只运行MySQL一个程序,那么,一般的调度算法也不至于产生这么个极端的结果吧。能不能把查询操作分割成多线程,我个人觉的那是MySQL应该考虑的。

另外锁的问题,待会儿再说。

现在有两个更为急迫的疑问,

一是:多核处理器对数据库到底有没有意义呢?毫无疑问,对数据库来说,IO比处理器更为重要。那是否需要花精力去研究数据库在多核上的优化呢?你做了很多工作,利用了多核的性能终于提高了SQL执行计划的效率,但对整个数据库来说是否只是九牛之一毛的性能提升呢?或者对于大数据量索引的建立、多表查询时hash join操作、排序操作来说,确实如果能并行执行的话能带来性能较好的提升?

二是:并行查询等操作所需要的硬件条件问题。是不是只有分布式集群cluster才可以从并行查询中收益,而对于一台多核计算机来说是没有条件来实现并行查询的?比如一个Intel Xeon E5420处理器,共有4个核,每个核有独立的L1 Cache, 每两个核共享L2 Cache,但最重要的是,4个核只能通过一条总线和内存相连,也就是说内存必须互斥的访问?那么是不是不管你怎么优化分割单个查询操作到多个核,但你从内存读的数据量就那么大,那并行查询还有意义吗?特别是对MySQL这样的,许多的优化操作使用的缓存都是放在内存里的数据库来说,在单台电脑上有条件实现并行执行吗?

论坛徽章:
0
8 [报告]
发表于 2009-11-25 15:23 |只看该作者
原帖由 liova 于 2009-11-25 15:06 发表
非常感谢大家的回复,又了解了一点。

对的,从应用层看确实不用在意是否多核,而且程序也只需要负责产生线程,调度是由操作系统来负责的。但是我觉的对MySQL来说还是需要知道是否多核的,比如你的处理器只有单 ...



支持!

teradata应该找你。

论坛徽章:
0
9 [报告]
发表于 2009-11-25 15:32 |只看该作者
原帖由 liova 于 2009-11-25 15:06 发表
非常感谢大家的回复,又了解了一点。

对的,从应用层看确实不用在意是否多核,而且程序也只需要负责产生线程,调度是由操作系统来负责的。但是我觉的对MySQL来说还是需要知道是否多核的,比如你的处理器只有单 ...


说的挺好的。
我先理解一下你的意思。 你上面和之前说的多线程是指某个具体单一查询或命令,对吗?

但对于数据库本身肯定要多线程对吧。否则所有发往数据库系统的请求只能先来先到的串行解答。

如果你考虑的是某个具体查询的多线程,我同意你的说法,mysql需要在这方面改进。不过这样的设计确实很复杂(需要问询操作系统获得物理机是否是多核等,再按非临界区并行执行。临界区的寻找算法是非常复杂的),且只能针对一部分特定的语句执行。另外总不能什么事儿都让数据库来做,map-reduce不是出来了吗。

据我所知,oracle也不能并发执行某单个查询。Teradata确实可以!

论坛徽章:
0
10 [报告]
发表于 2009-11-25 15:34 |只看该作者
原帖由 liova 于 2009-11-25 11:11 发表
Assuming you are asking if a SELECT is split up so that multiple CPUs
can participate in the operation, I don't believe any of these do such.
MyISAM, InnoDB, InfoBright, Partition, Federated (c ...



mysql 5.4并没有支持单查询多线程运行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP