免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: dunk007
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2009-11-25 16:51 |只看该作者
原帖由 hironics 于 2009-11-25 15:32 发表


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

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

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



不好意思,之前没说清楚,上面说的是指某个单一查询命令的多线程执行。恩,你的说数据库本身是多个的,确实。连接线程肯定是多个的,不然也没法响应多个用户的多个请求~呵呵

“不过这样的设计确实很复杂(需要问询操作系统获得物理机是否是多核等,再按非临界区并行执行。临界区的寻找算法是非常复杂的),且只能针对一部分特定的语句执行。”
感谢啊,正想知道这方面的信息。
想知道你说的设计复杂的具体细节,到底MySQL在并行执行方面遇到的是什么问题呢?哪几个模块有问题呢?

mapreduce就我所知,应该是个并行编程框架的规范,但那不是对单台电脑的,是对cluster,并行系统来说的,额,至少不是对单个硬盘来说的。
mapreduce有个开源的实现是hadoop,有兴趣可以去看看。
另外耶鲁大学的有个 HadoopDB 研究项目挺有意思。这是个并行 DBMS(PostgreSQL) 技术和 MapReduce 的结合的产物。
地址如下:
http://db.cs.yale.edu/hadoopdb/hadoopdb.html

评分

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

查看全部评分

论坛徽章:
0
12 [报告]
发表于 2009-11-25 16:57 |只看该作者
另外,oracle是可以并行执行的,找到oracle的并行查询文档看了看
地址在这:
http://download.oracle.com/docs/ ... a96524/c20paral.htm

因为之前的疑问,更关于刚才关注的两个方面意义和条件总结一下:
一、意义:
很多在线事物处理(OLTP)相对来说需要很快的相应速度,在几秒几毫秒之间就需要完成的操作是不适合并行执行的,因为执行并行操作的开销将比单个执行来的大。但是在非时间紧迫的情况下,并行执行可以有效的处理大量的批量操作。比如一个银行能使用并行批处理程序来执行上百万条数据的升级请求。还有在决策支持系统(Decision Support Systems,简称DSS)中,复杂的查询,比如涉及join的操作或者搜索非常大的表都能从并行执行中获益。

并行执行提高了以下几种操作的性能:
1.查询;
2.创建大的索引;
3.大量记录的插入,更新和删除;
4.聚合与复制;

二、并行执行所需要的四个条件:
1.对称多处理器(SMP),集群,或者大规模的并行系统;
2.充足的I/O带宽;
3.利用不足或间歇使用的处理器(例如,系统中,CPU的使用通常小于30%);
4.足够的内存来支持额外的内存密集型处理如排序,hash和I/O缓存;

三、来看看实现时的一些基本概念:
一条执行语句如:SELECT * FROM employees ORDER BY employee_name;将被解析后生成有两个操作(scan 和 sort)的执行计划,那么这两个操作是并发执行的,每个操作又被多个并行执行服务(parallel execution servers)并行的执行(比如,排序操作中名字范围为A-G,H-M,N-S,T-Z分别由四个并行执行服务来并行执行排序)。而在oracle中最多有两个操作可以并发的执行的,如果有第三个操作比如还有一个ORDER BY在之前ORDER BY empleoyee_name之后,那么需要扫描操作(scan)结束之后然后这个操作的并行执行服务转去执行这第三个ORDER BY.

操作的数据来源是这样的:
表/索引被协调器动态分割成不同的负载单元(granules),每个并行执行服务执行一个granule,granule和并行执行服务间的映射不是静态的而是执行时决定的.每个granule是表的物理块的一小部分.当一个并行执行服务执行完一个granule,他就去看协调器里是否还有未执行的granule,如果就就执行,知道所有granule被执行完,也就是说整张表都读完了,协调器把所有从执行服务返回的结果进行整合.

流程:
协调器 --> 表/索引 --> |-- granule-->|-- 操作1  |-- 并行执行服务1
                              |-- granule-->|   (scan) |-- 并行执行服务2
                              |-- granule-->|                        ……
                                    ……         |     ||
                                                  |     ∨
                                                  |-- 操作2 |-- 并行执行服务1
                                                  |   (sort) |-- 并行执行服务2
                                                                        ……

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

总结可能不是很准确,也不清楚我的理解对不对,大家可以根据需要看看原文。
额,这么看来并行还是有那么点意义的(幸好啊幸好  =。=:)

但多核优化的可行性还是有些疑问啊:
1.条件里有个SMP,那SMP是共享内存的么,如果是的话,那I/O带宽岂不是又不充足了?
2.既然内存的I/O这么重要,我想知道MySQL在内存里都放了些什么东西呢?
(这有篇oracle的内存:http://download.oracle.com/docs/ ... /c08memor.htm#10127
3.如果确实可以把一个操作分割来执行,比如在排序中就有AlphaSort algorithm的并行排序算法,那么如果MySQL按oracle这样来并行执行的话,主要会遇到哪些问题呢?请教ing~~~

[ 本帖最后由 liova 于 2009-11-25 17:00 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-11-25 17:08 |只看该作者
另外诚如hironics兄所说,确实,在多线程编程环境下,建议使用tcmalloc这一轻量级的操作来分配内存。因为这个操作可以减少执行时间,也就是减少锁时间。

google的文档里有说明:
http://goog-perftools.sourceforge.net/doc/tcmalloc.html

还有,google对MySQL的patch是做了以下两个改变来提高SMP的性能:
1.use atomic memory instructions for the InnoDB mutex and rw-mutex.
2.disable the InnoDB memory heap.
(地址:http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patches)

这都主要是为了解决MySQL在并行查询方面的什么问题呢?

论坛徽章:
0
14 [报告]
发表于 2009-11-25 17:13 |只看该作者
原帖由 liova 于 2009-11-25 16:57 发表
另外,oracle是可以并行执行的,找到oracle的并行查询文档看了看
地址在这:
http://download.oracle.com/docs/cd/B10501_01/server.920/a96524/c20paral.htm

因为之前的疑问,更关于刚才关注的两个方面意 ...



版主怎么不出来表扬一个!这么大段文字都解释过来了。。



有机会我去请教一下dev team。不过现在肯定是没有这个功能,roadmap里面也没有。

我印象中依稀记得mysql的sql线程不可以concurrent的,到某些第三方存储引擎io线程好像可以concurrent。
过了parser阶段,execute模块的代码你可以看看JOIN,的JOIN::prepare和JOIN::exec这块,似乎都是单线程。你要改进的话,看看可否做成多线程的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP