关于云计算/分布式计算的一些调研和思考
云计算
最近因为要跑一些大型的程序,自己的小本显得比较慢,又不想买一台workstation,于是想尝试一下传说中的云计算。调研了一下,目前提供云计算的公司主要分为两种,一种是Google, Microsoft这样的公司提供Google App Engine, Windows Azure这样的Cloud Web App Host Service,一种是类似Amazon EC2, Rackspace这样提供Cloud Server的公司。前者的主要模式是你上传一个web程序,公司负责维护物理机器,保证这个程序的正常运行。但我们对机器本身没什么控制权,也无法使用一般的C/C++/MATLAB来进行科学计算。后者的主要模式是虚拟机器的租赁,我们可以获得一个机器的root/Administrator权限,完全的控制它,根据使用时间来付费。
根据我的需求,尝试了Amazon EC2和Rackspace两个公司。两家的服务流程都比较类似,我们可以选择CPU,内存,操作系统等,新建一个虚拟机器出来并据此确定计费费率。机器建好以后我们会得到一个IP地址,ssh或者rdp到这个机器上就可以完全控制它了。
两家公司的服务各有特色。根据Rackspace的帮助文档,虚拟机器的计算能力在选择的CPU的基础上可能会增加,比如当整个集群有空闲计算能力的时候会按照一定算法把一定的CPU周期分到用户的机器上。Amazon的计算能力不变,但费率会动态变化。Amazon EC2在高峰期费率会上涨,低谷期会下降,每30分钟更新一次。我们可以设定只有在费率低于多少的时候才跑程序,也可以直接用“一口价”来立刻跑。虽然在注册的时候两家公司都会打电话来确认,但感觉Rackspace客服更好一些,24*7的服务,随时live chat、电话都可以,而且客服gg也很热情。
可是尝试了这些服务之后,发现并不很适合我的要求。虽然这些机器的内存可以很大,但CPU的性能往往并不很好,单机一般4核封顶,单核心性能相当于superpi 1M 32秒。可是目前需要的是高性能的计算能力。所以只好无奈放弃了。考虑到传输数据是要收费的,所以云计算并不适合数据密集型计算,CPU又不照,不适合计算密集型计算。所以从经济的角度来看,似乎cloud server现阶段还不靠谱。
分布式计算
今天又突然想起来一个东西。如果用php做后端分配计算数据,js做前端进行实际计算,这样似乎可以实现简便的分布式计算。这样的好处在于(1) 彻底跨平台,甚至移动设备的计算能力也可以利用进来,所以具有良好的并行性。(2) 终端用户不需要装任何额外软件/runtime。不好的地方是不知js用来做计算效率如何。同时里面也存在某些商业模式,比如终端用户来算一下就给一些钱。对用户来说可以充分利用现有的计算资源,比如晚上不关机挂个浏览器就能赚到钱。对组织计算的人来说也可以用远低于租用超级计算机的价格拿到结果。
初步想起来挺有前景,但做了一些实验和计算后比较失望。首先是js的效率问题。用superpi算1M位在我的机器上需要16秒,上网找了个算pi的js脚本在浏览器算0.1M位pi,过了3分钟左右才算出来。不清楚是不是算法的问题,但考虑到js设计的初衷是渲染网页和它解释执行的方式,似乎不适合做科学计算。另一个问题是商业模式的问题。为了推销这种模式,我们需要比传统的云计算更有竞争力,也不能比自己购买机器贵。对云计算来说,如果一次租几个月cloud server的话,当前市场的费用其实已经相当便宜了(4核机器约$0.2/h),我们再往下压就会缺乏对终端用户的吸引力(挂机赚的钱还比不上电费);可是对需要计算能力的用户来说,这个价格又不太划算,比如一次租4个月的计算时间需要0.2 * 24 * 30 * 4 = 576刀,已经够自己配一个AMD 4核机器了。所以要赚差价还是很困难的。
至于可以利用移动设备的计算资源的优势,我做了一个实验,同样采用python平台,一个iPhone4的计算能力大约相当于i7笔记本的1/40。所以移动设备的计算能力其实是可以忽略不计的,就算我们有5个iphone,也不过是把计算的时间减少了10%而已。这里还没有考虑js的效率问题,开发分布式平台的时间问题等等。所以整体来看这个分布式计算方案还不够成熟。
另一种解决方法也许是Go语言。看了一下google的介绍,它可以在amd64/x86/arm平台上跑,非常适合并行计算。不晓得未来会有什么发展。