Amazon Elastic Computing Cloud试用手记

订阅了我博客的大家大概知道,我最近几年一直都在跟一个叫“优美树”的东西搏斗,不停地想办法在越来越多结点的树上验证某个猜想。于是,在多种非常重大的算法改进之后,在n=37的时候,终于一棵树平均只要1000个CPU周期就完成了(一共花了大概2400个T7200的CPU小时)。对于n=38,预计大概需要8000个CPU小时。因为没什么非常好的想法了,而且也觉得现在的性能没办法怎么提高了(因为即使是生成每棵树也要平均100-200个CPU周期),所以就只能堆CPU以数量取胜了。但是大家知道,我是个穷学生,而且没多少钱堆CPU。再加上n=38也是个一锤子买卖,大概不会做n=39了,所以我想,就顺便体验一下云计算吧。

我用的是Amazon的Elastic Computing Cloud(EC2),这个选择其实挺显然:Windows Azure只能跑.Net的程序,而这个东西性能不好是大家都知道的;Google App Engine大概也不能跑多快的东西。Amazon的Elastic Computing Cloud则是可以直接装个Linux(或者你想要Windows也可以),然后编译任意程序开算的。当然,这个选择是跟我的需求有关的。我要做的任务是单纯的计算任务,不用设计什么并行啊大规模并发计算啊之类的东西,所以不需要网络不需要别的infrastructure,只要CPU足而且可以编译运行高性能的程序就可以了。如果是需要大规模并发计算的话,Windows Azure有自带的很多有用的功能(Blob之类的,不太记得了)。Google App Engine没怎么接触过,所以就不评论了。

先是注册,要用Visa卡,输入卡号确定之后,会有一个电话打过来,电脑女声给你一个验证码,输入验证码就算完毕了。注册要用一个Amazon的帐号,然后开启一个什么aws账户,其实还是很容易的。

然后我们来看一下价格,基本上是挺贵的,一台8核的服务器(他们叫instance)要0.68美元每小时。但是Amazon有种叫Spot instance的东西,比正式的价钱要低。简单来说,Amazon有一个Spot instance的市场价,这个价钱比普通的instance价钱要低得多(原价的1/3甚至1/4)。这个市场价是会随着需求而变动的,比如说如果Amazon有突发事件了想要计算资源,它就可以把价格抬高;如果有人出高价申请很多Spot instance,价格也会抬高。然后如果要开一个Spot instance,我们就要给Amazon出一个价,说我们愿意用什么价钱买这个计算资源。如果这个出价比市场价高的话,Amazon就会给你以市场价开这个instance。开了instance之后,如果市场价有变动的话,就按照市场价收钱;如果市场价变得高于出价的话,Amazon就会把你的instance停掉。用这个东西的好处是比较便宜,坏处是啥时候被停了都不知道。对于我这样的穷学生,当然是Spot instance越多越好,而且因为优美树的计算程序本身有checkpoint,所以停掉什么的对我影响不大。

好了,然后是申请Spot instance和配置各种Linux的时候了。这个东西我不是很懂,我只会写计算程序,所以就让软件代劳了。MIT的人开发了一个叫StarCluster的软件,可以自动在EC2上申请instance然后配置成一台cluster(就是大学实验室里边cluster的那种样子,用qsub的那种),而且还可以以指定价格申请Spot instance,非常方便。我就是用这个软件来建cluster的,所以没在这个上面费多少心思。不过要注意的是,即使指定申请Spot instance,cluster的控制节点还是申请的正常instance,也就是说比较贵。在配置文件中可以设置控制节点用另一种instance,当然是选比较便宜的。

说到这里,就不得不提一下EC2的instance的种类了。我用到的有m1.small,c1.xlarge和cc2.8xlarge。m1.small是只有1个CPU的32位平台,当然是用来做控制节点的,这个东西的一般价格是0.085美元每小时;c1.xlarge和cc2.8xlarge都是64位平台的计算节点,用的都是Spot instance,所以比较便宜。c1.xlarge是一台8核的虚拟服务器,spot价在0.216美元每小时,偶尔会浮动得比较厉害;cc2.8xlarge是一台有2枚8核Xeon的虚拟服务器,超线程了所以相当于32个核,因为刚推出几个月,而且因为很大没啥人用,所以spot价大概在0.54美元每小时,相当稳定。至于内存什么的,因为对我来说绝对够用,所以没太关注。

储存计算数据的话,需要在EC2上建一个EBS卷,简单来说就是一个云上的硬盘。因为新注册用户一年内是可以每个月享受30GB的EBS卷的,所以这个没花钱。把计算数据放到这个EBS卷上,在StarCluster上做好相应的设置,就可以从cluster上直接访问里边的文件了。

好了,建好cluster之后,就可以直接按照老习惯submit各种任务了。但是要注意一点,如果控制节点和计算节点不是同种平台的话,可能需要禁止控制节点接任务。我的情况是计算程序是64位的,32位的控制节点一运行就报错……我的做法是qconf -ahgrp加一个group专门写计算节点,然后qconf -mq对队列做一些必要的设置,让它只向计算节点分配任务。这个稍微查一下就很容易写出来了。

经过一个星期的计算,经历了三四次cluster被断掉的情况之后,我终于完成了对n=38情况的大部分计算。从性能上来看的话,c1.xlarge的每核性能略胜一筹,计算速度大概比cc2.8xlarge的每核快25%左右。这个当然跟应用程序本身的特性有关,我强烈怀疑这是由于我的程序经常访问内存,而Xeon超线程了Cache方面分薄了有点吃紧,所以水平不太发挥得出来。不过如果从性价比来说的话,c1.xlarge则是远远比不上cc2.8xlarge,因为cc2.8xlarge虽然价钱是c1.xlarge的2.6倍左右,但核的数目是4倍,虽然速度稍差一点,价格上还是有优势。

不过,无论价格上多么有优势,这东西还是超级贵……这次计算,费用占大头的是计算节点,c1.xlarge用了290小时,cc2.8xlarge用了177小时,总计大概8000个CPU小时吧,一共花了230美元的样子……Amazon没告诉我他还要额外打税,结果要交大概计算费用的1/5的税……这些计算资源,如果换算成BOINC积分(以SETI优化来算),大概也就是40w-50w左右,1美元2000分左右,我觉得大概可以把很多想用EC2算分布式的人吓住了……

总结:这个月钱包空了……

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s