使用云服务要精打细算

原文发表地址: Pinching pennies when scaling in The Cloud

原文发表时间: March 30, 2013

在云上运行网站,花费少许美分购买CPU时间来配置你的应用程序是一个很吸引人的方法。我想说的是,我们所有人都应该配置自己的应用程序,对吗?最主要的是真正地关注CPU做了什么以及连接了多少数据库,内存的使用量如何,但实际上我们没有这样做。如果那些代码没影响到你的钱袋子,你几乎不会去搭理这些。

有趣的是,我发现自己不管是在驾驶混合动力车还是应付智能手机有限的数据时都在执行性能优化计划。当确实缺乏资源和(最重要的)资金即将消耗到上限的情况下,明智且显而易见的方法就是 – 优化方案及降低成本。

劣质的代码在云中花费金钱

我订购了MSDN Subscription,它包括相当多的免费Azure云时间。假如你有自己MSDN,请确认你已经开启它。这个订购是我个人账户支付的,超期就需要我续款(我没有免费通行证只因为我服务于云组织),因此我想花尽量少的钱。

一个经典且明显的减小系统的规则是“少做,并且尽可能多的少做”。当你在云上购买你的主机系统采用这个方法时,你想做的是尽可能节省你的美元。你支付CPU时间,支付带宽并且支付数据库访问 – 但它增加了。假如你循环打开数据库连接,传输比实际需要更多的数据,你将会为此买单。

最近我和设计师Jin Yang一起重新设计了这个博客,制作新的主页Hanselminutes Podcast 站点。在这过程中我对包含更多个人档案的页面有一个想法,可以达到因为姓名重复而更少的显示我的信息并且更多的从视觉上展示访客信息。我正在研究通过360+来显示并获取每个访客的头像。

我登陆了该网站,感觉它真的很棒。然而,我立马注意到数据量比过去的确高了很多。我给别处的MP3提供服务器,在登陆新网站仅几个小时,光图片就耗费近500M流量。

你能从图表猜测出我何时登陆的网站。

I used way too much bandwidth this day

我“很少”需要支付额外的带宽,但这看上去并不好。Azure有一个很棒的功能,就是你每天都能查看你的账单,而不仅在月底。我能够看到带宽缓缓的增长。按照这个速率,月底必须为超出的带宽付出额外的费用。

Almost out of outbound bandwidth

我想了一下,立马意识到当有人点击文档页面时我一直在加载360+图片。现在回想起来,这是很显而易见的。但是记得我转移站点进云出于二个原因。

· 省钱

· 当需要时,快速扩容

我给所有数据库调用都提供了缓存,这是小事,但图像的事想了一会。我能够加分页,或者可以做一个”just in time”的无限滚动条。大家喜欢在页面上使用CTRL-F查找自己想要的信息。但如果数据量不是非常庞大的话,我不喜欢这种页面。旁白: 我的清单上包括在Hanselminutes上添加”topic tagging”和客户端排序和筛选。我认为这将是对后台编录一个很好的补充。我还在寻找更好的方法去利用不断增加的副本库。关于这个有什么想法呢?

一个简单的方法就是当用户下拉滚动条时去延迟加载图片,你看到的图片才会占用带宽。我查看了Mike Tupola's jQuery LazyLoad plugin和一些其他类似的脚本。如果你不想要这么多的警告和悄悄话还有Luis Almeida's lightweight Unveil。我最后用了standard Lazy Load.

实施很简单。添加如下脚本:

<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>

<script src="/jquery.lazyload.min.js" type="text/javascript"></script>

然后,给延迟加载提供一个选择器插件。你能说“just images in this div”或者“just images with this class”或你喜欢的.我是这样写的:

<script>

$(function() {

$("img.lazy").lazyload({effect: "fadeIn"});

});

</script>

最重要的部分是你生成”img”元素应该为src属性定义一个“TINY”图片。Src属性将总是被读取,无论是什么,因为那将由游览器处理。不要相信任何延迟加载的解决方案,那将是另一种情况。我从”github ropo”上用了1个像素灰色图片。当然,如果可以,设置图片的最终高度和宽度以便轻松加载页面。

<a href="/363/html5-javascript-chrome-and-the-web-platform-with-paul-irish" class="showCard">

<img data-original="/images/shows/363.jpg" class="lazy" src="/images/grey.gif" width="212" height="212" alt="HTML5, JavaScript, Chrome and the Web Platform with Paul Irish" />

<span class="shownumber">363</span>

<div class="overlay">HTML5, JavaScript, Chrome and the Web Platform with Paul Irish</div>

</a>

你最终加载的图片是定义在data-original属性上的。图片进入当前可视区域时才被加载。你可以设置阀值,从而可以较早加载图片如果你想的话,像在它显示前设为 200像素。

$("img.lazy").lazyload({ threshold : 200 });

在把代码加入之后,我让它运行一天,它完全冷却了我的服务器。已经没有轰炸般的300+图片请求,带宽使用明显下滑。

image

10个站点在1台VM VS 10个站点在共享模式

现在,我在云上运行10个网站。在价格计算器上有一件事不是很明确(除非你看了)。那就是,当你在你的一个云网站上切换到一个已保存实例时,你在里面其它不包括这个数据中心的所有共享站点都会跳转到预定的虚拟机。你实际上可以运行100(!)网站在一台虚机机上,这最终将节省您的钱。

旁白: 这确实很好,这样网站在一台虚拟机,而我并不需要管理它或者从未去想过它。Azure的站点位于虚拟机的上层,它会帮我自动地更新和管理。我用Git部署了一些网站,一些是用web进行部署,一些是我通过FTP更新的。我也可以动态扩展的虚拟机,所有网站可以从中获益。

想想这个方法,在Azure运行100个站点在1台小的虚拟机上(目前我有10个站点)......

1 VM for $57.60

比在共享模式下运行同样的10个站点更便宜。

10 shared websites for $93.60

这个是2013年3月30日后的价格。

这里有一点,你能从一台小虚拟机中挤出很多资源,我打算继续下去,缓存,尽可能优化,这样我就可以在云上支付尽可能少的费用。如果我能让这台虚拟机少做,那么我将能够运行更多的网站,省钱。

这一切的结果是,我开始编写不同以前的代码,使得我能够看到费用基于一种特定的改变规律积攒下来。