问:若是项目运行变得愈来愈慢了,应该从哪些方面去考虑去优化?

这个问题问的很泛,因此能够回答的点有不少。css

能够从前端、后端、数据等方面进行回答。html

前端

能够经过Chrome控制台、抓包工具等分析请求状况。前端

  • 请求资源是否是不少。

看看每次打开页面的时候,是否是会加载不少的资源文件,如mysql

xxxx.js 
xxxx1.js
xxxx2.js
xxxx1.css
xxxx2.css
xxxx3.css
xxxx1.jpg
xxxx2.jpg
....

打开一个网页可能加载了几十种资源文件。这个是能够优化一下的。nginx

首先是减小资源的个数,由于每多一个资源文件就是一次http -> tcp的请求流程处理。
其次是对资源文件进行优化,js\css文件能够压缩,jpg\jpeg\png等文件进行无损压缩或处理webp格式,更省空间。web

  • 响应信息的内容是否是不少。

我只想要一个头像信息,接口确返回了一大堆有关、无关数据,若是数据格式复杂,还须要对应的解析过程。因此响应体能够优化(虽然不少状况是带有冗余信息,方便调整)算法

  • 是否有作gzip等压缩处理。

对于网页的请求、响应是一大堆信息流,能够利用一些压缩算法进行处理。好比一些服务器支持gzip压缩。压缩比很高。sql

  • 是否有作缓存。

针对于前端资源的话,有cdn缓存。也能够配置nginx对一些图片、js\css等资源进行缓存配置。也能够减小一些服务器的压力。数据库

  • 网络带宽是否不够。

就像直径 2cm的洞,怎么容得下直径10cm的管子。访问量越大,越容易出现缓慢加载的状况。后端

1MB的宽带,可能实际只有 100多k。 单个用户访问一个页面可能要加载10k的资源。若是
超过10个用户同时访问,就会变得缓慢,由于它要下载资源。

后端

后端的话,通常来讲是先分析日志。看看是否有一些超时、异常、死循环等问题。

  • 运行缓慢排查

能够经过SkyWalking来检查分布式服务中的哪一个链路节点最耗时;能够经过Arthas检查某个方法的调用链路最耗时。根据具体状况分析。

  • JVM调优

能够经过jvm自带的工具, jstat\jstack\jvisualvm等分析。使用可查看(!这里)

固然,使用工具的目的是为了检查程序的GC状况, 若是是MinorGC频繁,没有晋升到old区,说明建立了大量生命周期短的对象(启动项目时,由于要初始化不少对象,因此可能会频繁GC,若是项目运行中;频繁GC,可能当前有大量建立对象的任务在运行(常见于循环),能够检查业务代码优化)。

经过PrintGCDetails日志(-XX:+PrintGCDetails -XX:+PrintGCTimeStamps),发现 若是是一次GC时间过长,多是STW(全局中止:stop the word)引发的【包括线程到达安全点时间,经过GC Root标记无用对象时间,GC时间等】,更详细的状况能够经过增长 safepoint相关参数进行分析,判断是在哪些环节出现了问题。 

优化实例参考:https://hllvm-group.iteye.com/group/topic/38232

针对于特定业务缓慢,能够在业务链条上增长日志输出时间,经过分析业务每一段的执行时间,进行排查。 
若是是sql方面的能够优化sql,代码层面的优化代码,能够经过增长缓存,异步处理,消息队列等方式进行处理逻辑问题。

找出存在大量for循环、数据库操做频繁、大文件操做的地方进行排查。

数据库方面

首先是否有慢查询,开启mysql慢查询日志,使用日志分析工具mysqldumpslow。能够经过优化sql,增长索引,优化表结构等处理。

## 是否开启慢查询
show variables like '%slow_query_log%'
返回的slow_query_log = OFF是关闭 ON 是开启
返回的slow_query_log_file 是日志所在位置路径
## 开启慢查询
set global slow_query_log=1
## 显示慢查询的设置时间
show variables like 'long_query_time%'
## 设置慢查询时间
set global long_query_time=4
## 是否未使用索引的查询放到慢查询日志中
show variables like 'log_queries_not_using_indexes'
## 开启
set global log_queries_not_using_indexes=1
## 查询有多少慢查询记录
show global status like '%Slow_queries%';
## mysqldumpslow 慢日志分析工具 
命令:
-s 按照那种方式排序
    c:访问计数
    l:锁定时间
    r:返回记录
    al:平均锁定时间
    ar:平均访问记录数
    at:平均查询时间
-t 是top n的意思,返回多少条数据。
-g 能够跟上正则匹配模式,大小写不敏感。
## 获得返回记录最多的20个sql
mysqldumpslow -s r -t 20 sqlslow.log
## 获得平均访问次数最多的20条sql
mysqldumpslow -s ar -t 20 sqlslow.log
参考官网:https://dev.mysql.com/doc/refman/8.0/en/mysqldumpslow.html

若是是I/O问题, 能够设置主从模式(读写分离),或多个数据库服务(但要保证数据一致性)。

若是是网络问题, 能够提升网速

若是数据库服务器内部有多个程序竞争资源。 优化服务器。

碰到了问题,仍是须要具体的去作分析。说不定是哪一个人写了 Thread.sleep(3 *1000)。以下:

代码优化


欢迎补充其余的优化点!!!