大话性能优化

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。


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

大话Java性能优化》是一本关于提升Java应用程序性能的指南。这本书通过深入讲解Java程序的运行原理、关键性能指标和常见性能问题,提供了一系列实用的优化技巧和工具的使用方法,帮助读者更好地理解和应用性能优化的方法和技术。 首先,这本书详细介绍了Java程序的运行原理,包括Java虚拟机(JVM)的内部结构、垃圾回收机制、类加载和字节码执行等关键概念。通过深入了解Java运行机制,读者可以更好地理解性能优化的原理和方法。 其次,书中重点讲解了常见的Java性能问题,并提供了对应的解决方案。作者通过实例和案例分析,指导读者如何寻找和修复内存泄漏、线程竞争、不合理的IO操作等常见问题,从而提升程序的性能和稳定性。 除了问题解决方案,这本书还介绍了一些性能优化的基本原则和技巧。例如,作者讲解了如何选择合适的数据结构、如何优化算法、如何合理使用多线程等。这些优化原则和技巧可以帮助读者在开发过程中避免常见的性能问题,并提升程序的效率和响应能力。 此外,书中还介绍了一些常用的性能优化工具和技术,如性能测试工具、代码分析工具和调优工具等。通过使用这些工具,读者可以对自己的程序进行性能测试和分析,并找出潜在的性能瓶颈。同时,书中还介绍了一些常用的性能调优技术,如缓存技术、异步处理和负载均衡等,帮助读者优化自己的开发和运维流程。 总之,《大话Java性能优化》是一本从理论到实践都相当详细和实用的Java性能优化指南。通过学习这本书,读者可以更好地理解和应用Java程序的运行原理和性能优化技巧,提升自己的开发水平和应用程序的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值