对于一个信息系统的后端服务(如一个web服务),其性能优化应该如何着手?这里试图从通常性方法论的角度,给出一些思路。java
1、性能优化流程
性能优化通常流程以下图所示:linux

2、性能指标
用来衡量一个系统的性能指标一般有:web
- TPS/QPS:Transaction Per Second,每秒处理事务数量;Query Per Second,每秒请求次数。这两个指标反应的是系统吞吐量,每每用于描述系统在必定的并发压力下的性能表现。
- RT:Response Time,响应时间,执行一个请求从开始到最后收到响应数据所花费的整体时间,即从客户端发起请求到收到服务器响应结果的时间。它反应的是系统的响应速度。
一个描述系统的指望性能指标的例子:redis
- 无并发环境下,单次请求的响应时间小于1秒;
- 在【100用户同时操做,QPS达到500,并持续30分钟】的并发压力下,系统的TPS达到300以上,平均响应时间小于5秒,90%响应时间小于3秒。(90%响应时间意思是指90%的请求的响应时间,依据不一样的性能需求,也能够指定80%RT,95%RT等等。)
3、寻找性能瓶颈及其优化对策的指导方针
按照性能优化通常流程,你须要先衡量系统目前的性能表现。因此首先你须要耗时统计与资源监控。算法
而后你能够从三个层面去考虑如何寻找性能瓶颈及其优化策略:数据库
3.1 耗时统计
响应时间是一个系统最重要的性能指标之一。对于系统的用户而言,响应时间是最直接影响使用用户体验的性能参数。后端
咱们须要首先经过日志分析等手段,肯定一个请求的各阶段耗时。缓存
例如对于典型的分层部署的后台系统,你须要首先定位耗时较长的处理分别位于哪些服务器。
web服务器?业务逻辑层服务器?DB层服务器?性能优化
3.2 分析硬件资源监控的统计数据,肯定资源有无瓶颈
当咱们已经明确耗时较长的处理位于哪一个服务器以后,咱们首先须要确认该服务器在性能测试期间的资源消耗。服务器
- CPU负载/利用率:若是CPU负荷太高说明目前CPU资源是不足的。那么在后续的[分析程序的数据结构与算法]阶段,你须要优化运算逻辑如设计更合理的并行线程数量(一般是cpu核数×2);或者你能够直接增长CPU资源(scale up);
- 内存占用:若是内存占用太高,可能会致使交换到swarp区,进而致使性能降低。那么在后续的[分析程序的数据结构与算法]阶段,你须要优化程序设计,好比减小缓存使用,及时释放内存等;或者你能够直接增长内存(scale up)。
- 磁盘IO:磁盘IO过多会致使性能表现降低,严重时会致使相关线程阻塞。那么在后续的[分析程序的数据结构与算法]阶段,你能够考虑优化程序设计,减小IO量,减小小文件读写频率,增长缓存等等;或者你能够直接置换磁盘为SSD(scale up)。
- 网络IO:网络IO过多可能会被网络带宽限制,致使传输速度受限。那么在后续的[分析程序的数据结构与算法]阶段,你能够优化程序设计好比减少通讯量;或你能够直接增长带宽(scale up)。
3.3 应用层面的优化
从应用层面考虑,咱们应该对逻辑处理的数据结构与算法进行优化:
- 若是资源有瓶颈,参考[3.2 分析硬件资源监控的统计数据,肯定资源有无瓶颈]中的相关记述对程序自己逻辑进行优化分析;
- 若是资源无瓶颈,则须要分析程序自己的数据结构与算法有无优化空间。
例如:
- 优化算法,采用在时间复杂度方面更具备优点的算法,例如,使用更合理的数据结构,减小循环的深度与次数,减小递归深度等;
- 有没有临界资源的竞争,例若有没有使用排它锁致使其余线程阻塞等现象;
- 对于SQL语句,要考虑SQL语句有没有优化空间,表可否优化结构好比添加索引,甚至考虑explain解析执行计划分析SQL语句;
- 其余...
3.4 架构层面的优化
从架构层面分析性能问题时,涉及到的技术较多。
这里以通常的Web站点架构(大体以下图所示)为例,说明一下咱们能够考虑的切入点:

- 反向代理层性能优化(如经过参数优化增长并发能力)。
- Web站点层性能优化。参数优化增长QPS指标;是否须要使用支持异步非阻塞模式的web容器来增长单机并发能力(如webflux);是否须要水平扩展多个web站点并负载均衡来增长集群并发能力(scale out)。
- 是否须要内存数据库实现缓存层设计(如redis)。
- DB是否须要读写分离,是否须要分库分表(如sharding-jdbc)。
- 各层通讯效率可否优化,有没有更高效的序列化协议(如protobuf)。
- 是否须要引入搜索引擎为数据库或非结构化数据创建反向索引实现快速检索(如elasticSearch)。
- 是否须要对业务层进行水平扩展来增长并发能力(scale out)。
- 是否须要采用分布式并行运算框架,解决特殊场景的单机性能上限问题。
- DB层是否须要使用其余的NOSql数据库从而提高非OLTP场景的性能表现。
3.5 运维层面的优化
运维层面的优化主要是各类组件服务器的性能相关参数优化。
这里列举了常见的组件服务以及linux内核等参数优化的例子:
- DB参数优化 : 对于DB服务器,有无性能相关参数能够优化。好比存储引擎,缓冲池大小等等。
- JVM参数优化 : 对于java应用,JVM参数是否能够优化。如GC算法,堆栈分配等等。同时,能够增长GC日志分析是否发生了过多的full GC。
- linux内核参数优化 : 对于linux服务器的内核参数,应当根据业务环境特性及服务器硬件配置来设置合理的值。