Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51167
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-16 18:31
个人简介

关注PostgreSQL,关注数据库技术以及分布式系统,热爱开源,享受生活

文章分类

全部博文(9)

文章存档

2015年(1)

2014年(6)

2013年(2)

我的朋友

分类: Mysql/postgreSQL

2013-11-10 10:29:03

原文:http://rhaas.blogspot.tw/2013/10/parallelism-progress.html

最近几个月,我花大量的时间实现PostgreSQL中的并行。我之前的博文中就经常提及并行性,并在PostgreSQL未来的开发方向中有很高的优先级,尽管优先级最高的是物化视图,而且物化视图经在PostgreSQL9.3中实现,并会在PostgreSQL9.4中继续改善,我在EnterpriseDB的同事仍然在为改善物化视图而努力。我的工作主要集中在并行方面,那目前的进展如何呢?

目前为止,我所做的主要工作是实现了两个重要的底层机制

1. 动态后台进Dynamic Background Workers

多亏了Herrera的工作,使PostgreSQL9.3中添加了一个特性:在服务启动时注册一个后台进程。这些进程可以作为守护进程在后台运行,与用户会话无关,它们在服务启动时启动,在服务进程的整个生命周期内都在运行,服务关闭时它们才关闭。对于并行查询,我们需要类似的进程--在后台运行、不与客户端连接但有较短的生命周期。事实证明,Herrera实现的底层机制很容易改写并实现该目的,我的实现在

2. 动态共享内存Dynamic Shared Memory

PostgreSQL使用进程模型而非线程模型,因此,默认情况下所有数据是不共享的。为了在进程间共享数据,我们在服务启动时分配一个固定大小的共享内存块(译者注:默认分配1000*8KB),服务运行期间的所有进程将该共享内存块映射为它们的地址空间。共享内存的大小是固定的,这在过去几年都是一个令人头疼的问题,而并行查询使这个问题更为凸显。PostgreSQL9.4较以往的版本,将可以在内存中对更过的数据进行排序。假设我们正在内存中对TB级的数据排序,如果我们尝试通过并行来实现,很明显,并行涉及的所有进程都需要访问需要排序的数据,而通过管道传输数据是相当低效的;同样,我们无法从主共享内存段获取到我们需要的TB级的共享内存。我们需要从操作系统获取内存,并在操作完成之后释放它。为了解决这个问题,PostgreSQL9.4将添加一个新特性:服务启动后,分配额外的共享内存段,具体实现见

以上这些都已经提交,我目前仍在处理一些细枝末节的事情。事实证明,在系统运行时启动一个后台进程并不是很好:你需要知道它是否正在运行,如果决定终止并行计算,你还需要结束它。然而,共享内存段的动态分配是很不错的,它简单地提供了一大块内存。为了用这些内存做真正有意义的事情,我们需要一些共享内存数据段的数据结构,并提供丰富的API使编写并行算法更加简单。


阅读(1758) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:PostgreSQL9.3中的表别名冲突规则

给主人留下些什么吧!~~