RASE分布式计算系统

1.引入

        ranking and selection engine(RASE)是一个特定的分布式计算框架,用于通过ranking and selection算法进行的分布式simulation计算。

        通过一个例子简单介绍一下RASE的作用,现在有1000名乒乓球运动员,我们需要从他们中选出一名实力较强的运动员代表国家去比赛。如何看谁的实力强呢?我们需要进行一些比赛,从比赛结果来看他们的实力情况。最笨的方法就是让他们两两打比赛,最后找出胜场最多的。但是显而易见,这样是很费时费力的,我们可以一边让他们打比赛一边将一些实力相对来说不强的人淘汰,这样在较快的时间内就可以找到最终需要的那个人,并且在淘汰的时候使用概率论中的置信区间理论,使得淘汰的情况是理论上可控制的。这就是ranking and selection的基本思想。

        RASE需要输入一些alternative(如运动员数据),一个simulation的算法(如比赛的算法)和一个PK算法(如淘汰的算法)。在系统运行时,让这些alternative循环进行simulation计算,得到相应的计算数据(如选手得分),在比赛的同时,通过PK算法将那些显然实力比较差的alternative给PK掉,踢出总的alternative列表。这样经过一段时间的运行,可以最终得到一个最优的alternative。

 

2.系统分析

         根据上面的描述,RASE系统需要至少两个线程,一个线程进行simulation的计算,一个线程进行PK的计算,两个线程并发,需要共享alternative的数据,这是一个简单的模型。但是根据实际情况来看,这个系统的使用场景常常需要大量的simulation次数,需要运行的时间用天来度量。这时就需要一些改进,因为simulation和simulation之间是可以同时进行的,就好像乒乓球比赛可以很多场比赛同时进行一样,这样就可以有多个线程同时进行simulation,也就是说simulation这个计算是可以横向扩展的,当然PK的计算也是可以横向扩展的(这个有一定的数学理论支持)。这样原来的两个线程变化成了现在的两种线程,每种都可以进行多线程的横向扩展。我们想利用起我们已有的尽可能多的机器来进行计算,这时就涉及到一个分布式的技术。

 

3.系统描述

         经过多次的设计与修改设计,最后完成了一个较好的分布式解决方案,下面就来描述一下这个系统的结构。


         系统由一个Master和多个Agent组成,Master由一台机器担任,其余的所有机器都各自有一个Agent。Master的主要功能是数据中心,向Agent分发alternative数据,从Agent获取计算alternative的结果,对alternative进行PK,淘汰掉一部分的alternative。Agent的作用是从Master获取alternative数据,进行simulation计算,将结果返回给Master。

         Master上的数据结构中首先是一个mainList数组,保存着所有的alternative的原始参数以及simulation结果,然后是一个mainQueue和一个preQueue,这两个队列里面保存了mainList的索引信息。Master上还有一个master线程和多个selector线程。Master在启动的时候将所有mainLIst中所有的alternative放入mainQueue。通过master线程将mainQueue中的数据发送给Agent,通过master线程接受Agent的simulation结果,并放入preQueue。同时所有的selector线程从preQueue中获取simulation结果,将结果加入mainList中对应的alternative中,并与mainList中其他还存活的alternative数据进行PK,如果能够存活就将其放到mainQueue中,等待下一次的simulation计算。

         Agent上的数据结构是由AltQueue和SampleQueue两个队列组成,AltQueue存储着从Master发送来的alternative数据,SampleQueue存储着simulation结果。Agent上有一个agent线程和多个slave线程。Agent在启动的时候通过agent线程从Master获取alternative数据,将数据放入AltQueue,同时通过agent线程将simulation的结果传给Master,在此同时Slave线程从altQueue获取数据,进行simulation计算,然后将结果放入SampleQueue。

         关于网络数据通信,Master的master进程会开启多个端口的service,由Agent的agent进行进行数据拉去和计算结果推送。为了保证各Agent之间的负载均衡,在agent拉取数据量上是这样实现的,设定一个阈值,每过一个时间段进行一次检测,向Master拉取(阈值-当前值)数量的数据。这样能者多劳,使得计算负载均衡。

4.设计优势

1)一定程度上的顺序执行

         通过队列机制,使对于所有alternative来说,在一定程度上是顺序执行的,在PK的时候各个alternative之间完成simulation的次数是相差不大的。这样使得PK的算法在理论上能够得到证实。

2)多线程并发

         Slave和Selector的线程都是多线程并发的,Slave的并发较为简单,因为各个alternative在做simulation的时候是相对独立的,Selector的并发虽然线程间有一定的关系,但是这样的并发方式通过数学的可以得到证实的。并发的优点在于使得多核CPU能够最大限度的提高使用率。

3)异步传输,使得CPU使用率最高

         因为系统最耗时的地方在于Slave线程做simulation的过程和Selector线程做PK的过程,这两个是系统的瓶颈。通过队列机制实现系统的异步,让Slave线程和Selector线程不需要等待网络数据的传输,做到一刻不停的运行。

4)索引队列

         mainQueue和preQueue是使用链表实现的,因为其需要频繁的添加删除节点,mainList是用数组实现的,因为数组的遍历速度要远快于链表,在PK的时候需要对mainList中所有的alternative进行遍历。索引队列是指在mainQueue和preQueue中存储mainList的索引,能够通过索引很快的获取到数据,这样的索引队列的实现方式充分发挥了链表和数组的特点,使得效率提高。

5.设计弊端

simulation和PK的平衡性问题


        因为该系统在一定程度上是顺序的,即Master上的preQueue,mainQueue,Agent上的altQueue,sampleQueue,这四者之间形成一个环,数据在这个环上按照顺序传输。如果Selector做PK的速度大于Slave做simulation的速度,数据将堆积在mainQueue中,无法及时的进行simulation,而preQueue的数据将越来越少,导致Selector等待,降低Master的CPU使用率。如果Selector做PK的速度小于Slave做simulation的速度,数据将堆积在preQueue中,无法及时的进行PK,而mainQueue的数据将越来越少,导致Slave等待,降低Agent的CPU使用率。只有通过调整参数,使得simulation和PK达到一定的平衡性才能最大限度的提高CPU使用率。但是随着一些alternative被淘汰出局,alternative的总量发生变化,整个平衡性也会发生变化,使得系统的效率有所下降,所有这个问题还有待进一步解决。

你可能感兴趣的:(Architecture,分布式计算,算法,多线程,数据结构,负载均衡,扩展)