昨天接到生产 SkyWalking 链路监控告警: 服务的百分位数响应时间在过去的 10 分钟内超过 2000 毫秒的次数达到 3 次。
经过不断的优化,将接口从 9000ms 优化到 180ms,先看结果
优化前:
![alt](https://i-blog.csdnimg.cn/blog_migrate/76313b19ec8d78c30765dd5c0ad5bbd7.png)
优化后:
![alt](https://i-blog.csdnimg.cn/blog_migrate/d5f4992c907e41a8c3e393c1bc3da126.png)
废话不多我们开始
一、定位性能差的代码
我用的阿里的 Arthas,下载地址:https://arthas.aliyun.com/doc/download.html
简单说下步骤:
打开命令窗口,执行 jps 查看 Java 进程号 pid
在命令窗口执行
as.bat pid
回车会打开一个页面,页面即 arthas 命令窗口
在 arthas 命令窗口,执行
trace com.PublicController login
可以看方法耗时
二、性能优化方案
-
根据业务优化,业务上只需要 1 条数据,代码中却查了所有
![alt](https://i-blog.csdnimg.cn/blog_migrate/89c292122509d1f8cce8cf49b110d4ce.png)
-
减少不必要的 RPC 调用,如果必须查,通过一组条件查,加缓存
![alt](https://i-blog.csdnimg.cn/blog_migrate/4454a3249a73b99ee12e29bb3bef31d6.png)
-
不要在循环中查库,可以把符合条件的数据查出来放 map 中,以空间换时间
![alt](https://i-blog.csdnimg.cn/blog_migrate/7ae5f62db75910885242e74283eb5488.png)
-
事务失效,每次查询获取新连接。同样要避免长事务。
![alt](https://i-blog.csdnimg.cn/blog_migrate/3aca94d3e381a05ec9ee55c6a424ea06.png)
-
增加数据库索引(覆盖索引),减小锁粒度,防止后面并发大导致死锁问题
-
修改打开文件符数量,支持高并发
-
使用连接池,重用连接,避免重复创建的性能损耗
-
异步化
-
批量存储
总结
总的来说,接口性能优化是一个不断迭代的过程,我将继续努力,不断提升系统的性能,为用户提供更加流畅、高效的使用体验。希望我的经验能够对大家在项目中遇到类似问题时提供一些启示。
本文由 mdnice 多平台发布