集群与多核

   当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.在多核环境下,有可能通过共享内存,提高服务吞吐能力的同时,不增加额外的内存占用。

总之,多核可以和集群用同样的方式来开发部署软件,同时,多核提供了共享内存的可能,提高内存的使用效率。我们在《语言篇》中继续讨论。