javaweb 请求一个接口,第一次请求特别慢在 20-40s,随后请求正常,这是什么问题?

2019-08-05 10:58:05 +08:00
 samples

问题详情:请求一个接口,在服务器上第一次请求特别慢在 20-40s,随后请求正常。本地测都是正常的,无论是不是第一请求,都可以在 2s 内响应。

下面贴出测出的一些数据

1.两个 service 都有事务,但应该与事务无关,去除事务后耗时是一样的 2.“保存耗时” 在 20-40s,其他耗时基本在 200ms 以内 3.环境:springboot spring-data-jpa

applyService

    @Override
    public Apply save(LawCase lawCase) {
        long l = System.currentTimeMillis();
        LawCase law = lawCaseService.save(lawCase);
        long l1 = System.currentTimeMillis();
        System.out.println("保存耗时" + (l1 - l));
        Apply apply = new Apply();
        // set 一些属性值
        applyRepository.save(apply);
        long l2 = System.currentTimeMillis();
        System.out.println("保存记录耗时" + (l2 - l1));
        return apply;
    }

lawCaseService

    @Override
    public LawCase save(LawCase lawCase) {
        // 处理关系和初始化标题顺序不可颠倒
        long l = System.currentTimeMillis();
        handleRelation(lawCase);
        long l1 = System.currentTimeMillis();
        initTitle(lawCase);
        long l2 = System.currentTimeMillis();
        lawCaseRepository.save(lawCase);
        long l3 = System.currentTimeMillis();
        System.out.println("处理关系" + (l1 - l));
        System.out.println("初始化标题" + (l2 - l1));
        System.out.println("保存 db" + (l3 - l2));
        return lawCase;
    }
6842 次点击
所在节点    程序员
36 条回复
blackboom
2019-08-05 11:58:09 +08:00
9 和 11 可能性不大,这种场景还是不要乱猜,用 Arthas 去 Trace Watch 一下就很清晰了。

https://github.com/alibaba/arthas

https://alibaba.github.io/arthas/
lff0305
2019-08-05 12:07:53 +08:00
@lff0305 忘说了直接用 JProfile 跟踪下就知道了,或者在卡的时候 jstack 下就知道卡在哪里了,我们当时是反复执行 jstack,发现 n 个线程都 block 在初始化数据库连接池 - 初始化 jdbc - 初始化 Oracle 连接 - 生成 SecureRandom 那里
samples
2019-08-05 12:12:39 +08:00
@Raymon111111
@gz911122
@Aresxue
@cheng6563
@BBCCBB
@Caballarii
@micean
@qqpkat2
@wysnylc
@hosaos
@Caballarii
@wangxiaoaer
@hellwys1
@jorneyr
@lff0305
@blackboom
谢谢老哥们。找到问题了,确实是生成 uuid 的方法出了问题。这个是 hutool 库的一个生成 id 的方法。至于具体原因我再分析下。
opengps
2019-08-05 12:18:05 +08:00
服务器是虚拟机的话,硬盘必然比本地慢一拍
再说首次访问确实需要很多组件都从硬盘添加到内存
lawler
2019-08-05 12:22:24 +08:00
移除 hutool 吧。这个库问题真的很多,之前拦截全局 cookies。会导致所有 http 相关的类受影响。
msg7086
2019-08-05 12:25:08 +08:00
可以装个虚拟随机数生成器试试。Debian 下有个 haveged 可以用,特别适合虚拟机。
nicoljiang
2019-08-05 13:44:37 +08:00
一般是云服务器的「熵」不足。
Java 需要调整一下生成随机数的方式。
samples
2019-08-05 14:04:36 +08:00
@lawler 嗯嗯有这个打算
liuxey
2019-08-05 14:09:01 +08:00
久闻 hutool 大名,就是一直没用过,楼主查出问题了能否 @ 我一下,让我继续放弃使用这个库
qqpkat2
2019-08-05 17:18:12 +08:00
@Caballarii 你连别人问题都没看清楚就来回复,认真审题好么
什么叫第一次调用接口,那是系统已经起来了去调用
lolizeppelin
2019-08-05 19:26:48 +08:00
看样子像是 linux 随机不够?
如果是的话, 有个命令能刷新这玩意的
srx1982
2019-08-05 19:37:13 +08:00
@nicoljiang 非常有可能
nickchenyx
2019-08-05 22:52:37 +08:00
@liuxey 这和 Hutool 又没关系,问题在于 JDK 自身的随机数生成问题,你这个赖到 Hutool 上不道义
CEBBCAT
2019-08-05 22:59:58 +08:00
随机数产生器这么热手的么……
liuxey
2019-08-05 23:02:25 +08:00
@nickchenyx 没仔细看,抱歉了
samples
2019-08-07 09:06:12 +08:00
@nickchenyx 这个怎么说呢,hutool 调用的也是 jdk 的 SecureRandom,jdk 的 UUID 也是用的 SecureRandom,但不知为何 hutool 的第一次调用就需要非常长的时间,难道它把一些随机数加再到内存了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/589114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX