性能优化是程序员工作必备的技能,下面分享一些经典的性能优化思路和方法。
首先明确性能优化的定义和目标。性能优化是指通过 持续的 分析、实践和测试,确保系统稳定高效运行,从而满足用户的诉求。
性能优化闭环:
性能优化分类
一般情况下,我们把性能优化分为 2 大类:
1)通用优化
是指一些经典的、对于绝大多数情况都适用的优化策略。比如增大服务器的并发请求处理数、使用缓存减少数据库查询、通过负载均衡分摊请求、同步转异步等。
2)对症下药
是指结合具体的业务特性和系统现状,先通过性能监控工具、压力测试等方式,分析出系统的性能瓶颈,再针对性地选取策略进行优化。
比如数据库单次查询超过 1 秒,属于慢查询,根据实际的查询条件给对应的字段增加索引,一般就能提高查询性能。
实际开发中,这两类性能优化策略通常都要使用。在系统设计和开发阶段,我们要根据自己的经验,本能地引入一些性能优化的手段,降低后续系统出现问题、需要迭代优化的概率。此外,性能优化一定是持续的,随着需求、用户、系统用量的增多,原本性能符合要求的系统也可能会出现各种新的问题,很难面面俱到、一步到位。
但是,对于复杂的、对可用性和稳定性要求极高的项目,我们可以提前通过压力测试来模拟用户量极大的情况,并提前做好性能优化和应对措施。
通用性能优化手段
有哪些通用的性能优化手段呢?
我们以一个请求的完整生命周期为例,依次去介绍。
通常,用户从发送请求,到最终得到数据,要分别经过以下节点:
每个节点,我们都有对应的优化方法:
1)前端:
●离线缓存:利用浏览器的缓存机制,请求过一次的资源就不用重复请求,提高页面加载速度。
●请求合并:页面请求过多时,将多个小请求合并成一个大请求,减少网络开销。
●懒加载:延迟加载页面的图片等元素,提高首屏加载速度。
2)网关:
●负载均衡:负责接受请求,根据一定的路由算法转发到对应的后端系统,实现多个后端服务器分摊请求,增大并发量。
●缓存:将后端返回的数据进行缓存,下次前端请求时,直接从网关获取数据,减少后端调用、提高数据获取速度。
3)后端请求层:
●服务器优化:根据业务特性,选择性能更高的服务器并调整参数,比如 Nginx、Undertow 等。
●微服务:将大型服务拆分为小型服务,并通过微服务网关进行转发,增大各服务的并发处理能力。
4)业务逻辑层:
●异步化:将同步的业务逻辑改为异步,尽早响应,提高并发处理能力。
●多线程:将复杂的操作拆分成多个任务,通过多线程并发执行,提高任务处理效率。
5)中间件(第三方依赖):
●缓存:将数据库查询出的结果数据缓存到性能更高的服务(比如基于内存的 Redis 或本地),减少数据库的压力、并提高数据查询性能。
●队列:使用消息队列,对系统进行解耦、或者将操作异步化,实现流量的削峰填谷。
6)存储层:
●分库分表:数据量极大时,对数据库进行垂直或水平切分,提高数据库并发处理能力。
●数据清理:定期清理无用或过期的数据,减少存储压力,必要时可以对数据进行备份转储。
虽然有那么多性能优化方法,但并不是每一种都要用、每一种都有用。在做性能优化时,一定要根据实际情况,权衡性价比和系统改动风险,并且做好充分的测试,不要好心优化、结果给系统导入了新的 Bug。而且一般情况下,不建议大家为了优化盲目引入新技术,先从成本最低的优化方法开始。
举个例子,你在本地使用 Elasticsearch 优化了查询性能,但是公司根本没有成本采购 Elasticsearch,这就脱离了实际情况。
大家先了解这些方法,日后做性能优化时能够想起来就足够了。