大话性能优化

来源:互联网 发布:iphone5越狱软件 编辑:程序博客网 时间:2024/06/06 13:04

2011年1月,新加坡飞往杭州的航班。飞行持续时间很长,大约6个小时,坐在四周的人很快熟悉了,互相攀谈起来。有一位小姑娘,十六七岁的模样,长得很漂亮,默默地坐在座位上。热心的阿姨和她攀谈,问起她的情况,她带着疲倦自我介绍起来,“我在新加坡念初三,那所学校一点都不好,我在成都是最好的初中毕业的,也考上了成都最好的高中,但是,我的父母,他们一定要我来新加坡复读初三,让我考新加坡的高中,我一点都不喜欢这里,这里的同学看不起我们这些大陆学生,经常上课找大陆来的老师麻烦,经常辱骂我们,我烦透了!!!”对,这不是自我介绍,这是一个人接近奔溃边缘的歇斯底里。也就是在当时,我做出了决定,我绝不会让我的女儿这样远离我,一个人在很年幼的时候就必须独立面对生活的困难,绝不。无论她的父母出于什么原因让她去国外念书,我所看到的,是让一个不适合承受压力的人承担了巨大的压力,这就是本书的编写原因。在这本书里我想要和大家讨论的话题是基于Java语言的性能优化,我们不能随意地给出性能优化方案,就像随意指派由那位小姑娘来完成全家的未来方向一样。我们必须经过严密的研究、测试及验证,明确造成性能瓶颈真正的原因后才能开始着手,盲目地行动只会造成不必要的损失。当然,如果系统架构设计得很好,就可以在很大程度上避免类似事情发生。

铁道部的12306[1]网站一直被全国人民所诟病,它确实存在一些问题,但是这些看似简单的问题,其背后牵扯着复杂的系统架构设计。这些设计最终是为业务需求服务的,即12306的职责是为所有旅客的需求服务的,而程序员设计的程序又是为12306服务的,所有的用户体验归到最终就是服务意识。我们来看一下12306的业务,12306需要支持海量并发查询,即海量用户同时查时间、查车次、查座位、查铺位。此外,对应的下单过程也就会伴随着海量并发的数据库操作。据说,淘宝在双十一期间也只有几百万用户[2],而春运期间抢购火车票是全国人民的统一活动,瞬时访问数量有千万级别甚至是亿级别的。据说12306的高峰访问是10亿PV[3],这些访问主要集中在早8点到10点,每秒PV在高峰时上千万[4]。

再来看看其他的业务系统。奥运会期间的奥运票务系统采用抽奖的方式,这样的业务设计让系统不存在先来先得抢购需求,由于是事后抽奖,因此事前只负责收集信息,所以不需要保证数据的一致性,这也就没有高强度并发锁[5]的需求,很容易通过水平扩展方式克服性能瓶颈。B2C网站一般实时性要求不高,比如下单,用户提交订单后,订单并不是马上被处理的,而是等待一定时间后,用户才会收到订单是否确认的通知,这样就确保了数据不需要立即被处理,没有了数据高并发同步的需求。也就是说,在高并发要求下的数据一致性是通常情况下的性能瓶颈点,也是通常意义上的技术难点之一。

前面提起过,高并发情况下的数据高度实时一致性需求是很难实现的。对于一个网站来说,并发浏览网页造成的高负载较容易处理,高并发的查询负载也可以处理,但是实时下单是最难处理的,因为下单需要访问当前的库存量,对于12306网站来说,库存量就是指火车票的库存,由于这是一个全国联网系统,所以可以预见库存量保持数据一致性的难度。据说苹果CEO库克[6]正是因为处理好了库存问题才得以继任乔帮主[7]的宝座。目前来看,很多B2C[8]网站的下单都是通过异步方式来实现的,这样的做法可以避免数据高度一致性要求。

淘宝模式相较于传统B2C网站有一个优势,即它不需要查询库存。B2C网站拥有自己的仓库,每次下单前,都需要查找距离客户最近的仓库是否有库存,这样的计算量累计后会很大。比如,你在上海买一本书,如果上海附近的仓库没货,我们需要先计算哪个仓库既离上海最近又有这本书。淘宝网站由于本身商业模式的原因,它不需要去实时检查库存,反而对于性能扩展较为容易。

的确我们可以通过Nginx[9]来搞定每秒10万的静态请求,只要有足够的网络带宽、磁盘I/O,服务器的并发计算能力够强,可以很容易地处理10万的并发连接。但是如果我们引入了大量的业务逻辑,那就不是单纯的访问问题了,该解决方案也就成了浮云。

除了业务需求、程序运行方式之外,程序设计本身需要考虑基础编程技术、系统架构、网络技术、操作系统、硬件服务器等诸多因素。计算机专家在问题求解时非常重视表达式简洁性的价值。UNIX的先驱者Ken Thompson[10]曾经说过非常著名的一句话:“丢弃1000行代码的那一天是我最有成效的一天之一。”这对于任何一个需要持续支持和维护的软件项目来说,都是一个当之无愧的目标。早期的Lisp[11]贡献者Paul Graham[12]甚至将语言的简洁性等同为语言的能力。这种对能力的认识让我们把编写紧凑、简洁的代码作为许多现代软件项目选择语言的首要标准。



[1]    12306:中国铁路客户服务中心(12306网)是铁路服务客户的重要窗口,将集成全路客货运输信息,为社会和铁路客户提供客货运输业务和公共信息查询服务。

[2]    来源2013年的网络数据,作者非阿里人士,也没有淘宝账户,所以数据不准确请读者见谅。

[3]    PV:即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。

[4]    摘自2013年的官方数据。

[5]    提高系统并发吞吐能力的方式,第5章会详细介绍。

[6]    蒂姆·库克(Tim Cook),1960年11月1日出生于美国阿拉巴马州,1982年毕业于奥本大学工业工程专业。1988年获得杜克大学企业管理硕士学位。曾在IBM供职12 年,负责PC部门在北美和拉美的制造和分销运作。1998年年初,库克进入苹果,任副总裁,主管苹果的电脑制造业务。2011年接替乔布斯担任苹果公司CEO。

[7]    即乔布斯,1955年02月24日—2011年10月05日。

[8]    B2C:Business To Customer。

[9]    一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

[10]   肯·汤普森(Kenneth Lane Thompson,1943年2月4日),一般称之为Ken Thompson,为美国计算机科学学者,与丹尼斯·里奇同为1983年图灵奖得主。

[11]   LISP是一种通用高级计算机程序语言,长期以来垄断人工智能领域的应用。Lisp作为因应人工智能而设计的语言,是第一个函数式程序设计语言,有别于C、Fortran等命令式程序设计语言和Java、C#等面向对象语言。

[12]   保罗·格雷厄姆(Paul Graham),美国著名程序员、风险投资家、博客和技术作家。他以Lisp方面的工作而知名,也是最早的Web应用Viaweb的创办者之一,后来以近5千万美元的价格被雅虎收购,成为Yahoo! Store。


欢迎关注麦克叔叔每晚十点说,感兴趣的朋友可以关注公众号,,一起交流与学习。

原创粉丝点击