最近几个月花了很大精力稳定性以及优化上面,打算继续写一下如何提升稳定性和系统调优。中间有一些是参照公司一些大牛的PPT,有一些是自己的思考和实践。可能不会涉及到具体的细节,但是优化过程中的思路基本都会涉及到。
性能调优一般的思路是什么?
这里其实在最开始想做优化的时候,也是摸不着头脑,但是想了下,其实性能调优,首先要找到瓶颈在哪里?然后针对瓶颈做优化,再压测看结果,后面具体做的过程也就是这样来的。所以分为三步:一、需找性能瓶颈,二、针对瓶颈做优化,三、压测看优化的效果,逐步迭代,最终达到性能的要求。
性能的要求是啥?
这个主要看制定的性能基线是啥,例如需要的单机QPS和RT是多少。之后基于这个目标,把系统的吞吐量和响应时间搞上来。这时候可能需要一个性能模型,也可以理解为系统水位评估,即通过一系列的数字,描述目前系统的水位是多少,极限的情况下,能够承受的压力是多少。这个过程可能更多的是非技术性的。但是这步非常重要。
哪有那些压测方式?
其实不要被压测吓住了。自己写一个多线程压测接口或者方法也是压测,也可以发现瓶颈。
一、单机多线程压测,这里可以使用自己搞的线程池,压接口看看QPS和RT的情况(这时候再配合本地的visualvm来看一些热点的方法等);
二、如果是web请求,可以尝试使用ab或者httpload的方式制造压力;(http://iamzhongyong.iteye.com/blog/1757180 单元测试压测和工具的使用)
三、线上能不能压测?答案肯定是可以的,目前两种思路,一种是复制线上请求到另外一台机器(例如tcpcopy可以实现这种复制),一种是请求转发,把请求转发到特定的机器上,这两种方式各有利弊,目前这两种都有尝试。线程压测的好处是能够反映真实的情况,真实的数据,真实的业务模型,比较客观。
四、线下搭建系统,这个系统可能包含了你这个系统所依赖的所有系统了,然后在线下制造数据,模拟请求(例如loadrunner等工具),好处是不干扰线上的正常使用,坏处是造数据的成本有点高,且和线上真实的业务模型有出入。
五、线上全链路压测,从入口的系统开始,把这个业务涉及到的核心系统,全部覆盖,在最前端来模拟用户的请求,然后制造压力。这种方式好处是非常可观,能够反映真实的情况,确实是成本很高。
如果寻找系统的依赖情况?
应用系统一般依赖的资源会比较多,例如数据库,例如缓存系统,例如其他应用系统,这时候有个问题,如何识别他们呢?可能你的第一反应是看代码,但是其实业务系统一般非常复杂,看代码会搞死人的。这时候其实一个链路分析的系统不可少,说说简单,一个链路的分析系统还是很有难度的。一般是基于系统的调用日志以及一些端口等去做的分析,基于系统自己留下的数据,把系统的依赖搞出来。例如Google Dapper、Twitter Zipkin。在最前端的请求中,设置一个流水号ID,然后把这个ID传递到后端依赖的系统中,然后打日志,之后分析日志,然后把依赖的数据统计出来。基于这个依赖情况,能够很客观的反应系统的情况。
超时时间的设置?
这里可能觉得这个事情太小了,但是实际上有很多超时时间设置不合理导致的血的教训。如果超时时间不做评估,核心的调用依赖在出现问题的时候,可能会出现连锁反应。具体的数值设置,取决于业务的情况以及依赖的要求,如果不知道设置多少,设置3秒即可。
为什么说可能最多的是业务逻辑调优?
在最开始优化的时候,我也想通过调整一个JVM的参数来提升1倍的性能,或者升级一下linux的内核来提升。但是实际上,大多数的优化还是业务逻辑的优化。例如业务逻辑的调用顺序,以及是否有多余的调用,是否有多余的循环,是否有一些调用可以简化的。这些都要具体问题具体分析。但是,重点觉得一定在这里。
服务器如果做到更加简单和单一?
这里提一个概念就是服务治理,可能服务治理是一个很大的话题,目前我也是处于一个很菜的阶段,这里就提一个“服务隔离”,一个系统A可能同时提供了web的请求和接口的请求,一般情况下每台机器都会承载web和接口的请求,这时候就没有办法单一了,可能稳定性方面不符合我们的期望。怎么做呢?把不同的请求做隔离。例如专门搞几台机器来承载所有的web请求,单独搞几台机器承载接口的请求,做好分组和隔离。这样就能保证机器做的事情更加单一。简单了,也自然就减少了一些问题隐患。
多个机房的情况下本地调用优先?
A应用系统调用B应用系统,A的机器分布在F1、F2、F3机房中,B集群的也分布在F1、F2、F3机房中,这时候如果A和B的调用,出现扩机房的情况,就会比同机房调用有更大的开销,所以,可以采用本地调用优先的策略,既A集群中F2机房的机器调用B集群,仅仅会调用F2的机房,这样能够很好的减少网络开销。当然也有坑了,例如A集群中F2机器承载了80%的请求,B集群仅仅有50%,这时候就有隐患了。
每次请求都动态渲染页面,这种情况咋搞?
答案很简单“页面静态化”,具体的静态化方案比较多,例如页面的元素放入CDN中,或者放入到分布式缓存中,放到这些地方之后,获取非常快,要远远好于每次都去做页面的渲染。但是同时也要考虑缓存的清理问题。
如果做系统的过载保护?
java系统发展到现在,过载保护已经研究的比较多了,这里就不多说了,之前的两篇文章列在这里。http://iamzhongyong.iteye.com/blog/1742829 , http://iamzhongyong.iteye.com/blog/1982113
如果做业务的平滑降级?
业务模块,可能包含多个功能,在系统出现问题的时候,例如无法再做多余的业务计算,仅仅需要保留核心业务,这时候咋办?开关关掉。比较常见的办法就是在java系统中搞个单例,然后通过外部的请求修改这个开关。http://iamzhongyong.iteye.com/blog/1897694 这里文章有个介绍。
异步化改造如何做?
目前的互联网架构,其实是离不开异步化的,异步,就是不阻塞当前的请求。例如我在用户登录之后,需要把用户的积分加一下,这步没有必要阻塞用户的登录过程,完全可以异步去做,如果做异步呢?我总结的几个思路:
一、利用线程池去做,在主线程中做核心的业务逻辑,多余的可以异步去做的,可以把任务放入线程池,由线程池自行去做;
二、利用协程等工具做异步,当然目前java的协程还不是很成熟(http://iamzhongyong.iteye.com/blog/1916740);
三、再就是结合目前的消息系统,在做异步的地方,发消息,然后另外一个地方接收这个消息,做处理,实现异步;
至此,over,可能大多数的都是思路,每一点做起来其实都不是很容易。优化和稳定,更多的在于细节,魔鬼在细节啊。
相关推荐
通过实际运行测试,系统表现出良好的稳定性和可靠性,充分满足了医药管理的基本需求,并具备一定的创新性和实用性。综上所述,JAVA医药管理系统设计以其高度的专业性和实际应用价值,为学习者提供了一个理想的实践...
基于Java的视频会议系统是一个针对现代远程沟通需求而设计开发的应用程序,它结合了网络编程、多媒体处理...这些方案不仅提升了系统的实用性和稳定性,而且也是对当前网络编程和多媒体处理技术的一次实践检验。综上所述
系统采用B/S架构,以SSM框架为基础进行后端开发,前端通过JAVA客户端技术实现,充分考虑了技术可行性、操作可行性、经济可行性和法律可行性,确保了系统的实用性和稳定性。系统功能包括用户登录、订单管理、菜品管理...
该系统采用先进的Java技术,实现了客户端与服务器之间的稳定、高效通信,适用于各种网络应用场景。 **论文部分**: * 详细阐述了系统的设计背景、目标和技术选型,为后续开发提供了坚实的理论基础。 * 深入分析了...
2. **稳定可靠**:Java具有良好的稳定性和可靠性,而MySQL作为一款成熟的关系型数据库管理系统(RDBMS),也有很高的稳定性,并且支持事务处理和ACID属性(原子性、一致性、隔离性、持久性)。 3. **开源免费**:...
后端则采用了Spring、Hibernate等成熟的Java EE框架,确保了系统的稳定性和可扩展性。 本资源不仅适合作为Java毕业设计的参考项目,也非常适合Java Web开发的初学者学习和实践。通过本项目的学习和二次开发定制,...
此外,系统还引入了Spring、Hibernate等开源框架,提高了开发效率和系统的稳定性。 本资源不仅适合Java专业的学生进行毕业设计,也适合广大开发者进行二次开发和定制。通过对该系统的学习和研究,可以帮助您深入...
数据库方面,选择了SQL作为数据存储方案,确保了数据的稳定性和可扩展性。此外,系统还集成了JavaFX技术来实现图形用户界面,以及Java的SystemTray类来实现系统托盘功能。 项目的主要功能包括: 1. 用户注册与登录...
通过本研究的实践,我们验证了系统的稳定性和性能优势,提升了求职招聘过程的效率和便利性。未来,我们将继续优化系统功能,探索更多智能化应用,推动求职招聘行业向数字化、智能化方向发展。 关键词:SpringBoot; ...
该系统采用Java作为开发语言,结合SSM框架的稳定性和高效性,实现了汽车租赁业务的全面管理。系统功能包括车辆信息管理、客户信息管理、订单处理、租赁费用计算等核心模块,能够帮助租赁公司更好地管理车辆资源、...
该系统基于JAVA技术构建后端服务,使用mysql数据库存储数据,确保了系统的稳定性和数据的安全性。用户可以通过系统浏览各种旅游路线信息,包括路线介绍、行程安排、费用明细等,并根据自己的需求在线预订和支付。...
此外,论文还对系统的性能进行了测试和分析,验证了系统的稳定性和可靠性。 本资源不仅为学习者提供了一个实践Spring Boot开发的案例,同时也为婚纱行业提供了一个可参考的信息化解决方案。无论是对于JAVA开发者...
数据持久化:利用SQL数据库进行数据持久化存储,保证系统数据的稳定性和可靠性。 阳光酒店管理系统的实现将为酒店管理人员提供一个高效、便捷的管理工具,帮助他们更好地管理酒店业务,提升服务质量和客户满意度。
安全性与稳定性: 系统采用安全的身份认证和数据加密技术,保障顾客和店铺信息的安全性。 系统设计稳定可靠,具备异常处理和备份恢复机制,确保店铺的日常运营不受影响。 Java某店POS积分管理系统通过有效管理顾客...
该系统具备用户管理、内容发布、评论互动、私信通讯等基本功能,同时支持多用户在线操作,保证了系统的并发处理能力和稳定性。作为一个适合毕业设计或课程设计的项目,它不仅包含了完整的源代码文件,还附有详细的...
系统具有良好的稳定性和可靠性,能够长时间运行并处理大量的图书和读者信息。 通过《JAVA图书馆书库管理系统》,图书馆管理人员可以更加高效地管理图书馆的资源,提升服务质量,满足读者的阅读需求,是一款具有实用...
该系统基于Java技术开发,提供了一个稳定、安全的评教环境。学生可以通过系统对教师的授课内容、教学方法、师生互动等方面进行评价,评教结果将以匿名形式反馈给教师和教育管理部门。系统支持多维度评价指标,确保...
整个系统采用Java语言开发,利用Javamail API实现了邮件的发送与接收功能,具有用户友好的界面和稳定的性能。 项目的亮点在于其可扩展性和可定制性。开发者可以根据自己的需求,对系统的功能进行进一步的扩展和优化...
在技术实现上,SSM框架的运用使得系统具有出色的稳定性和可扩展性,能够应对复杂多变的信息管理需求。同时,Java语言的灵活性和强大功能为系统的开发提供了有力支持,确保了系统的高效运行和良好性能。 此外,该...
《计算机毕业设计:Java实现的图书借阅系统(SSH框架,源码+数据库+说明)》是一项精心设计的计算机毕业设计资源,旨在帮助学生深入理解Java编程和SSH框架的应用,同时满足本科课程设计、毕业设计以及Java学习的需求...