首先性能优化其实分成很多方面,无论怎么样优化都是我们需要持续学习的,因为只有知道了基础和问题所在,才能确定优化的方案
1.优化的指标
一个系统的性能指标有哪些?大概分为以下这几个方面:
1.cpu 2.内存 3.磁盘io 4.网络 5.异常 6:数据库 7:锁竞争 8:响应时间 9:吞吐量 10:负载承受能力 11:计算机资源分配利用率
2.如何制定一个系统性能优化策略
2.1:先对性能做测试(先知道哪里可以做提升或者哪里是弱点就可以优先对这部分做性能优化)
- 2.1.1微基准性能测试:只要是对某一个部分或者模块做测试.这样能定位的更准确(单独领出来测试)
-
2.1.2宏基准性能测试:主要是一个综合测试,是把多个模块都放在一起测试,就能体现出不同模块之间
的相互影响(多模块测试)
2.2.测试时需要注意的问题
-
2.2.1:热身问题:在很多缓存和数据库中,刚开始的查询效率和开机一段时间之后的效率是不一样的,
甚至达到了上百倍的差距,优先对部分数据做热处理(优化),在进行测试
-
2.2.2:性能测试结果不稳定,在各个条件稳定的情况下.测试结果没有一致,可以做个波状图,如果波动
的区间在一定范围内,就可以视为是合格的
-
2.2.3:多jvm的影响:如果在一台机器中部署有多个jvm,那么即使在单台机器单个jvm中运行的很好的
代码也有可能出现性能问题,应该避免在单台机器部署多个jvm
通过测试之后,就可以拿到一部分的报告,从中可以看出是哪里有问题,从应用层到操作层来优化的话
-
3.1:代码优化:代码问题往往是资源耗尽造成,或者是资源耗费巨大,可能是死循环,内存溢出等问题
或者是一些影响的数据结构使用上面
- 3.2:设计优化:通过设计模式来提高系统资源利用率
- 3.3:优化算法:不同的场景采用不同的算法,则可以提高
- 3.4:时间换空间:对查询速度要求不高的可以使用不同的保存容器,来降低系统损耗
- 3.5:空间换时间:采用分库分表和增加缓存之类的操作,扩大存储空间空间来提升访问速度
- 3.6:参数调优:mysql,jvm,各中间件和引擎的参数
兜底策略:在没有进行应用和操作层面来优化的情况下,只有最后一步
- 4.1:限流:限制访问量,来保障系统,避免负载过高的情况
- 4.2:自动化横向扩容:达到阈值之后,自动横向扩容,比如加服务器和加引擎
-
4.3:提前扩容:在抢购这种活动中,提前扩容
(学习docker能快速扩容)
其实大部分开发能做的优化不多,但是从一个请求来看,可以从发请求开始算,
- 5.1:网络(rpc,http,tcp等.以及各个网络框架)
- 5.2:负载均衡(各个算法的优劣,以及各个的使用场景)
- 5.3:消息队列(大批量的请求必然是有消息队列的,但是什么消息队列有哪些特质,可以做什么,还有消息队列起的什么作用)
- 5.4:代码(设计模式,代码复用,算法等)
- 5.5:数据库(包括缓存读写分离,热点数据等)
- 5.6:分布式或是微服务(包括集群等)
当我们懂得了这些东西,不仅仅知道他是怎么做的,还要知道他为什么要这么做,怎么可以这样做(how,why,what)
技术路漫漫,且行且珍惜