转载

Spring Boot重启后服务第一次访问时间慢的一次调优记录

背景

今天和分子公司合并服务接口(降低成本),对方反应我这边有个服务慢,搞了一天,就顺便记录下

服务调优

1. 网络

由于生产机和测试机在机房处于不同网段,网络环境质量有差异,最开始怀疑的是网络导致的。分别在几个环境中跑相同代码,发现是网络影响的调用三方服务返回时间波动。

2.调优

基于业务需求,更改调用三方服务方法为异步调用。嗯!应该没问题了。

3.验证

进行优化验证,发现调用平均时长有明显降低(废话)。但是,但可是,发现了新问题,在 spring boot 启动后第一次调用本服务,耗时仍旧远远高于后续调用,正常在20ms/次,第一次平均在600ms/次,于是开始google

于是看到了这个提问

https://segmentfault.com/q/10...

修改项目

在查看Dockerfile后,发现启动脚本中有加如下参数

JAVA_ALL_OPTS=" -Djava.security.egd=file:/dev/./urandom "

继而想修改docker基础镜像中jre的java.security文件

遂在Dockerfile中增加如下shell

sed -i "117csecurerandom.source=file:/dev/./urandom" /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/java.security

就是用shell 替换了文本的内容

结论

其实,也没有明显的效率提升,服务首次加载还是比之后慢。所以考虑,是不是文件是不是没有改全(待完成,还没验证)

最后,通过验证发现一个规律,假设有A B两个服务,在Spring Boot 启动后,

如果先首次访问A,那么B的首次访问时间会缩短,但是还是会高于第二次及以后的访问时间

如果先首次访问B,那么A的首次访问时间会缩短,但是还是会高于第二次及以后的访问时间

因此,在Spring boot启动后,第一个被访问的服务耗时一定大于第二个被访问的服务,且每个服务之后的访问时间一定小于本服务第一次被访问的时间。

暂时就这么多,这是个记录。

之后会对基础镜像中jdk里面的java.security进行修改,如果有效果 会再更新。

刚才又找了一下,发现jdk目录里没有java.security,是我秀逗了

原文  https://segmentfault.com/a/1190000018822451
正文到此结束
Loading...