前两天跟同事讨论,说到高并发系统如何做优化,提到这个问题,他说他有些茫然,有点不知道该如何下手。
我想了想这几年做的各种系统优化工作,正好也简单总结一下,总结起来就是:一个核心,N种手段。
一个核心就是:多、快、准。
N种手段就要围绕上面的核心做的各种处理。
上面这个核心字多点说也就是:更多用户访问、更短响应时间、数据正确性。
优化的过程,我的想法就是先顺藤摸瓜,沿着一个请求发生的路径一路看过去,测量一下每个点上消耗的时间,会发现很多消耗时间多的点,都是值得你去优化的地方。然后再考虑在每个点上发生了拥挤导致响应时间变长了又该怎么解决。
当然也不需要一上来就全面优化,连影响最小的地方也不放过。先优化对你的性能影响最大的地方,效果是最好的,解决主要矛盾才是关键。不同的情况下,会有不同的优化方式。
简单地来看一个浏览器用户访问的流程:
浏览器->服务器->返回结果显示
这么简单地看,可能想得到的优化手段很少,常见的可能就是优化sql,加快数据库处理;加个缓存,加快返回;使用静态文件,减少动态计算。
细分开来看每一个步骤:
1 浏览器发起一个请求,如果本地有缓存会请求本地缓存文件,没有缓存会请求服务器。所以这里就有一个优化点:需要把常用的css和js文件独立成独立的静态文件,一次加载以后,后面直接加载本地缓存。另外IE浏览器内核在请求图片下载时会限制一次只能同时从同一个域名下载两个文件,这里又有优化点,分散图片存储的域名。使用静态文件,减少计算的同时增加本地缓存的使用,减少请求。静态化是常见的一种优化手段。
2 浏览器真实发起请求服务器时,首先被请求到的是服务器的操作系统层,那么服务器的操作系统对外界连接的响应能力,就是你需要了解的东西了。比如linux的内核参数的调整如何影响最大连接数,简单的一个例子就是在一个默认最大文件句柄数只有1024的服务器上,超过这个压力的时候,你如何优化你的程序,也都没有意义。入口只有那么窄,你得把口给扩开。熟悉服务器的性能,调优系统内核也是一个必要的手段。
3 系统层再把连接交给你的server做处理的时候,server的配置这个时候也相当重要。比如apache的最大连接数,tomcat的最大连接数。对server的配置调优很影响性能。比如tomcat在处理静态文件上的能力比apache要差很多,所以在apache+tomcat的负载均衡就能很好地进行动静请求的分离,提高响应速度。又比如tomcat新版本里的NIO技术又比普通IO性能好上不少。对server的了解,要保持跟踪最新动态。
4 server再把数据交给你的程序处理的时候,就到了考验你编程能力的时候了。你得对你的程序的执行效率非常清楚。必须保证每个响应都在尽量短的时间内执行成功。还有比较常见的一些对不常更新的数据使用内存缓存来加快访问。内存永远是最快的。这方面的优化也有非常非常多的事情可以去做,而且跟你的编程息息相关。
5 程序处理的时候,数据库连接池的使用,连接池大小的配置,连接池性能的优化,sql语句的优化,等等都可能影响你的程序的效率,这些地方永远是值得关注的。当然,优秀的算法在这个地方是少不了的。一个好的业务逻辑设计,可能极大提升你的程序性能。对数据库操作的调优也是一个永远的话题。
6 数据传递到数据库进行保存和查询的时候,你就必须对你的数据库的使用有所了解,知道数据库本身的哪些配置可以优化从而带来性能的提升。一个简单的例子就是在内存足够大的时候,增大mysql的内存缓存就可以极大提升它的响应速度。
7 现在server把数据返回给用户了,那么返回的数据的大小又同样影响着结果的显示速度。尽量减小数据的大小,比如开启apache的gzip就能极大压缩常见的静态文件,可以保证用户更快完出数据的下载,同时节省你的服务器使用带宽,老板一定会很高兴的。
8 用户下次访问的时候,同样面临一个优化的方式:是利用上次跟服务器建立好的连接再次通讯呢?还是重现跟服务器建立连接?这就是在server端做配置要考虑的一个问题,在低并发下,保持跟用户建立的socket连接,并且让用户通过这个连接来多次访问,可以提高速度。但是在高并发下,大量这种建立好的连接就意味着其他用户失去了进来的机会。所以这个是需要权衡的。一般情况下最好可以预估一下一个用户可能在多长的时间里连续发起多少个请求,然后可以把用户断开,把资源用来服务其他用户。
9 ajax技术也是在减少大请求,使用更小的局部数据更新来代替整个页面的刷新,加快用户的响应速度,结合静态化能完美改善性能。
这是对一个用户的访问的时候的考虑,然后就要考虑多用户情况的问题(有些是上面提到过的):
1 操作系统对多用户访问时的一些限制的优化
2 server的并发量的优化
3 多用户并发下,更多地要仔细考虑程序在数据操作的并发上的问题。比如对象的锁,数据库的锁,事务,等待处理的数据的排队方式等等。你需要知道读写分离的好处,应该隔离不同操作间的等待。另外并发带来的锁等待问题需要极大地关注,往往不是在内存就是在数据库里,发生着大量并发锁等待,导致你的程序缓慢。
4 对数据库的锁的机制必须深入了解,比如mysql不同引擎的带来的锁表和行级锁对性能的影响。同时要在自己的逻辑处理上要控制好不同用户同时操作的问题,时刻要绷紧这个弦。多数据集群,读写分离等等机制也是需要深入了解的。
以上是我一些简单的零碎总结,并不全面,也不细致,主要想表达一个思考的过程。不在于你都学会了什么,发现问题,研究问题,解决问题的能力,才是最重要的。
其实每一个点上,基本上你都可以找到N多牛人写的很牛很细致的书来讲具体怎么优化的,需要的时候可以好好去找书来研究一下。
深入去了解每一个点上的优化,你会发现,互联网的魅力真的是奇妙无穷!
分享到:
相关推荐
java面试笔试题库java学习比较开发教程互联网公司面试资料大全合集: 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx 8张图解...
Java开发与技术挑战——关于技术的技术思考.docx Java框架研发思考.docx Java程序员们最常犯的10个错误.docx java程序员的就业指导(重点).docx Java程序员面试宝典 .pdf java笔试题大集合及答案 Java经典项目集锦....
该毕业设计不仅展示了学生在Java Web开发方面的扎实技能,也体现了学生对于实际问题的深入思考和解决问题的能力。通过这个项目,学生不仅能够锻炼自己的编程能力,还能够提升团队协作和项目管理的能力,为未来的职业...
Java开发与技术挑战——关于技术的技术思考.docx Java框架研发思考.docx Java程序员们最常犯的10个错误.docx java程序员的就业指导(重点).docx Java程序员面试宝典 .pdf java笔试题大集合及答案 Java经典项目集锦....
开发者可以根据实际需求对系统进行二次开发,添加新的功能模块或优化现有功能。因此,无论是作为毕业设计项目还是作为实际应用的酒店客房管理系统,该项目都具有很高的实用价值。 总的来说,这是一份非常优秀的毕业...
总的来说,本资源不仅适合作为毕业设计的参考项目,也适合有一定Java Web开发基础的开发者进行学习和实践。通过该项目,开发者可以深入了解Spring Boot框架的应用以及漫画网站的开发流程,同时也可以根据自己的需求...
该毕业设计项目不仅展示了学生在Java Web开发方面的技能,还体现了他们对商城业务逻辑的深入理解和创新思考。通过该项目,学生可以锻炼自己的实践能力、解决问题的能力以及团队协作能力,为未来的职业发展打下坚实的...
这是一份全面而深入的毕业设计资源,旨在帮助学生了解并实践Spring Boot框架在Web应用开发中的应用,同时掌握论坛系统的基本设计与实现方法。 该论坛系统采用了Spring Boot框架,结合前端技术,构建了一个功能完善...
高磊、杨诚、元凯编著的《Android应用开发精解(工程师经验手记)》以Android应用开发所需要的技术为线索,先后讲解了SDK一些工具的使用、UI开发...图形动画、网络开发、硬件操作、结合Web开发以及如何对应用进行优化等...
Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的MasterPage技术) Tool Tip 示例(FILTER版) Tool Tip示例 (htc版) 一个.net发送HTTP数据实体的类 按键跳转以及按Enter以不同参数提交,及...
大型Java Web系统服务器选型问题探讨 193 高并发高流量网站架构 210 1.1 互联网的发展 210 1.2 互联网网站建设的新趋势 210 1.3 新浪播客的简介 211 2.1 镜像网站技术 211 2.2 CDN内容分发网络 213 2.3...
第9章 学以致用--一步一步做Web系统性能测试 264 9.1 软件系统背景及架构设计介绍 264 9.2 性能要求和性能指标分析(Goal阶段) 267 9.2.1 性能指标 267 9.2.2 业务模型分析和需求细化 268 9.3 性能测试方案和用例...
几年前雅虎里牛逼的前端工程师们出了一本关于提升web前端性能的书籍,轰动了整个web开发技术界,让神秘的web前端优化问题成为了大街的白菜,web前端优化变成了菜鸟和大牛都能回答的简单问题,当整个业界都知道了惊天...
不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。 要试着运行这些示例,需要先 复制本代码...
5.4.3 从Web页面的角度思考:以内容为中心的交互 5.4.4 从插件的角度思考:以脚本为中心的交互 5.4.5 从应用的角度思考:以数据为中心的交互 5.5 向服务器写数据 5.5.1 使用HTML表单 5.5.2 使用XMLHttpRequest对象 ...
主要讲述了计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。 本书介绍了...
《Hadoop实战》作为云计算所青睐的分布式架构,Hadoop是一个用Java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,是谷歌实现云计算的重要基石。《Hadoop实战》分为3个部分,深入浅出地...
出版信息编辑译者:韩冀中出版社:人民邮电出版社出版时间:2011年10月版次:1.1开本:16开装帧:平装字数:417千字页数:253页内容简介编辑作为云计算所青睐的分布式架构,Hadoop是一个用Java语言实现的软件框架,...