您的位置:首页 > 运维架构 > 网站架构

多核计算与并发编程(一) 架构篇

2013-12-26 09:26 113 查看
集群与多核
当cpu还在主频之争的年代,主频翻番,处理器的能力就翻番,这是摩尔定律。主频提高了
1.同一件任务,可以用更短的时间完
2.在单位时间内,可以处理更多的任务。
注意,这两件事其实有差别,请思考,如果是多核,能不能达到这两个目标。
回到到单核的年代,那个时候,为了提高计算能力,已经有支持多路cpu的主板,也就是在一块服务器主板上,可以插两个(或更多)cpu,这个模式类似现在的多核cpu,在操作系统里面,可以看到有两个cpu,系统可以把任务分配到两个cpu上,提升计算能力。现在的多核cpu,类似当时的多路cpu服务器。请继续考虑之前的问题,如果是完成一件任务,是否可以用更短的时间完成。
同期,服务器集群技术也可以通过增加计算机数目,来提升系统整体的计算能力。计算机集群通常用高速局域网来连接所有的计算机,计算机之间可以高速通讯,协作完成任务。继续考虑那个问题,给你两台计算机,完成一件任务,能不能用更短的时间完成。
你应该已经有了答案,在多核或者集群环境下,如果不改变编程的方式,是无法缩短完成“一件”任务的时间。好在,今天我们通常不在乎“一件”事情做多久,我们是要构建同时给上万人访问的网站。我们今天讨论的两个场景,都是基于多任务。也就是任务可以被分配到计算机的多个核,或者集群的多台服务器上。
场景A,网页服务
网页服务,响应许多用户请求网页,每个请求都是独立的,不共享内存。网页服务响应时间短,内存需求少。
场景B,缓存服务
当网页服务收到请求后,如果是请求动态内容,通常都去缓存服务查询是否有命中的缓存可以直接使用。这时缓存服务会在内存中查找,如果找到,就返回结果给网页服务。缓存服务响应时间短,内存需求大。
思考:
场景A,多核如何架构,集群如何架构
场景B,多核如何架构,集群如何架构

在这里给出我的设想。

场景A网页服务-多核
如果网页服务支持多核,我什么都不用做,cpu内核数目增加,我的网页服务响应请求的能力就会倍增,多么完美的世界。
如果网页服务不支持多核,我需要启动多个网页服务的进程,数目和cpu的内核数一样,确保在满负荷运行下,可以让每个cpu内核处于工作状态。这还不够,我需要有一个分配任务的进程,用于接受请求,再把任务平均分配到每个网页服务的进程。

场景A网页服务-集群
我需要在每台服务器上启动网页服务进程,这样每台服务器都可以响应网页请求,我还可能需要一种硬件设备,可以把来自网络的请求,分配到每台服务器上。
场景A结论
1.多核可以达到和集群等效的性能目标,在集群中使用多核,可以减少集群所需要的服务器数量。能得出这样的结论,思维得有多跳跃啊。
2.如果用某种编程方法,能够使得服务本身支持多核,可以简化一台服务器内部的部署架构

场景B缓存服务-多核
和场景A类似如果缓存服务支持多核,cpu内核数目增加,缓存服务响应请求的能力就会倍增。
如果缓存服务不支持多核,我需要启动多个缓存服务的进程,由于缓存服务消耗内存较多,启动进程的数目可能收到物理内存容量的限制,比如我的缓存服务需要4g内存,在32g内存的服务器上,我最多只能启动8个服务。另外,我总是希望每个缓存服务提供的数据一致,需要写额外的代码,保证数据同步。如果一个缓存服务的数据有变化,我希望所有的服务数据做同样的变化。

场景B缓存服务-集群
因为在不同的服务器之间更加没有可能共享内存,我总是需要在每台服务器上启动缓存服务,同时写额外的代码,保证数据同步。
场景B结论
1.部署多个有内存占用的服务时,需要考虑数据同步。
2.在多核环境下,有可能通过共享内存,提高服务吞吐能力的同时,不增加额外的内存占用。
总之,多核可以和集群用同样的方式来开发部署软件,同时,多核提供了共享内存的可能,提高内存的使用效率。我们在《语言篇》中继续讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: