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

作者: admin 分类: 异常处理 发布时间: 2020-07-23 16:25  阅读: 46 views

这个问题问的很泛,所以可以回答的点有很多。

可以从前端、后端、数据等方面进行回答。

前端

可以通过Chrome控制台、抓包工具等分析请求情况。

  • 请求资源是不是很多。

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

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

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

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

  • 响应信息的内容是不是很多。

我只想要一个头像信息,接口确返回了一大堆有关、无关数据,如果数据格式复杂,还需要对应的解析过程。所以响应体可以优化(虽然很多情况是带有冗余信息,方便调整)

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

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

  • 是否有做缓存。

针对于前端资源的话,有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)。如下:

代码优化


   原创文章,转载请标明本文链接: 问:如果项目运行变得越来越慢了,应该从哪些方面去考虑去优化?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读