Wednesday, January 23, 2008

BestPractice|豆瓣的程序性能真的很惊人

豆瓣的程序性能真的很惊人,但... - robbin的自言自语 - JavaEye技术网站

http://www.dbanotes.net/arch/douban_web_server.html

在老冯同学的博客上看到的文章。里面介绍说豆瓣网站的情况如下:

一台Web服务器运行Lighttpd,每天处理2500万个request,峰值每秒处理1000个request;
一台应用服务器运行Python,每天处理500万PV;
数据库服务器运行MySQL,负载情况没有介绍。

我对比了一下JavaEye网站的服务器运行情况,我们是一台Web+应用服务器,一台数据库服务器,如下:

Web服务器运行Lighttpd,每天处理430万个request,峰值每秒处理150个request,平均每秒处理50个request;
Web服务器运行Ruby 1.8.6 + Rails 1.2.6,每天处理70万动态请求(去掉404,301状态的请求,只统计200的),如果算PV的话,去掉RSS订阅请求,AJAX请求,估计PV在60万左右;
数据库服务器运行MySQL,CPU负载不高,在5%-30%之间波动。

豆瓣的Lighttpd峰值每秒处理1000个request,到不让人觉得意外,因为Lighttpd本身就是设计能够并发处理上万个request的。但是豆瓣用单台服务器支撑500万动态请求,确实是很惊人的数据!看阿北介绍说,豆瓣的应用服务器是一台单颗双核AMD Opteron,JavaEye的Web服务器是两路老的单核的AMD Opteron,主频是2GHz,豆瓣的应用服务器是新的单颗双核AMD Opteron,主频不详。

目前JavaEye的Web服务器运行Lighttpd,Memcached,Email Server和Ruby的FastCGI,除了ruby之外,其他应用消耗的CPU资源都极少,Web服务器在峰值期间的CPU负载在35-50%之间波动,非峰值期间回落到20-30%。假设应用程序不做针对性优化,我估计这台服务器可以支撑到100万到120万PV,但要更高就很困难了。不过JavaEye要达到这样的访问量,估计还得一年时间。到那个时候再想办法也不迟。不过设想到这样的程度,我到宁愿加一台服务器立马解决问题,而不是投入人力去费时耗力的优化程序代码。

豆瓣使用的Python性能要比Ruby好很多,但即便如此,在同样硬件条件下,用Python支撑到500万以上,也是非常困难的,可以想像的是大量运用了页面的局部缓存,以及对程序和框架的优化达到了极致,这一点,不得不佩服豆瓣的技术人员的性能优化水准和所下的功夫。

不过,对于豆瓣只用一台应用服务器支撑500万PV,我觉得没有必要。豆瓣有2000万人民币的投资,增加一台服务器一次性开支不超过1.5万,每年托管费多支出0.5万而已,九牛一毛。但在今天一个资深程序员月薪都要超过1.5万的情况下,为了节省这点钱而需要对应用程序进行深度优化而投入的人力成本,远远超过2万元。豆瓣新版本刚上线的一段时间之内,网站访问速度非常缓慢,最近速度慢慢的提升上来了,似乎也从侧面证明了这一点。干吗不多部署几台应用服务器,让用户从一开始就享受良好的速度体验呢?而用一台应用服务器支撑,等着优化程序代码来提升访问速度呢?CSDN网站每天有600多万访问量,比豆瓣的访问量略高一些,CSDN有30多台服务器,其实服务器少不见得就有多好,服务器多也不见得就是什么坏事。用投入硬件的方式可以解决的性能问题,总是会比软件优化方式来得成本低。

豆瓣最近发布新功能有些"疯狂",所以服务器也有新的部署。看到阿北同学在豆瓣广播里说:

豆瓣的第二台应用服务器终于投入了使用。Hongqn 忙了一晚上就完成了部署。第一台服务器支撑到 500 万动态PV/天,服务 On Demand 即时分布式部署......

500 万 PV , 还是动态 PV, 是个很惊人的数字。因为,如果都能达到一台机器支撑 500 万,那么国内稍有点规模的网站(就说动态 PV 上亿的吧),只需要 20 台 Web 服务器就够了。事实上,即使比较强调技术的网站怕也要上百台 Web 服务器的规模。

我们知道豆瓣用 Lighttpd 做 Web 服务器。 从侦测到的数据看,目前线上有两个版本。

$ curl -I http://www.douban.com
HTTP/1.1 200 OK
.....(无关内容略)
Server: lighttpd/1.4.15

另外一个版本:

$ curl -I http://www.douban.com/people/ahbei/
HTTP/1.1 200 OK
.....(无关内容略)
Server: lighttpd/1.4.18

其实豆瓣服务器还有个更为惊人的性能数字。从这个 Powered by Lighttpd 的列表来看,豆瓣在一台 Gentoo 服务器上的记录是 1200 万/天的点击量。这应该是动、静态页面混合情况下的吧。

有同事对这个数据有些好奇,问我到底豆瓣是用啥做的服务器,其实这个问题我也问过阿北,他们就是自己攒的 PC 服务器,然后把性能发挥到极致。阿北也表示过,即使现在豆瓣流量激增个十倍啥的性能也不会是问题。这也是从起始就考虑扩展性的收益吧。

这里这位老兄用 七个 Mongrels 实例(也是一台Server)跑了 55 万 PV (thanks Robin 纠正) 就蛮自豪的,所以豆瓣的一台跑了"500 万动态 PV" 的确非常惊人。

Updated 2008-1-17 0:57:09

阿北留言了。主要是上面的有的数据还是旧的:

Lighty 网站上的数字很久没有去更新了。现在豆瓣的web服务器(lighttpd)每天估计2500万 Hits, 高峰时间大约1000 req/s (这里说的是主要输出HTML/CSS/JS和小图片的一台前端。大图片有另外的web服务器)。
我在广播里说500万PV/天的是应用服务器,就是lighty和mysql之间跑python的那台。现在豆瓣大多数PV来自注册用户,每个页面都需要几到十几种类的动态数据。
现在的服务器只是单片双核的opteron。换4核的话,应该能到一台1000万PV/ 天。

No comments: