记 Spring Cloud 的首次请求卡住问题

首先这不是 Spring Cloud 的锅,只是我遇到时是在用 Spring Cloud。为了之后大家排查问题比较方便,我决定加上这个关键字。

解决方案
  • 启动参数加上:-Djava.security.egd=file:/dev/./urandom
问题描述
  • 在一个微服务启动之后,有些接口会在首次请求的时候卡住,需要三到四分钟才会返回,然后会有 Broken pipe 报错。调试发现,本机不会有这个问题,用 WSL的Ubuntu也不会有这个问题,只有在线下测试机器 Centos 上会有这个问题。然后发第二次以及之后的请求都不会有这个问题。

  • 首先这是个非常严重的问题,问题不解决是意味着几个月的努力全部白费。甚至没有什么好的绕过去的办法,我不可能重启的时候先发一个请求,等几分钟恢复正常再切流量。

  • 然后去百度了一下,有各种各样的超时案例,一开始没发现匹配的。依照经验,我用 jstack xxxx 把线程堆栈打出来,看一下线程都在做什么,但是经验不足,不知道怎么看。真的很尴尬,然后去几个 Spring Cloud 群问了一下,好像也没有人遇到这个问题,并且有解决方案。

  • 最终强大的谷歌帮助我找到了前人的经验:Spring Boot应用首次启动慢的问题,完全一样的现象,写得也很详细。是熵源的问题:原来,Java随机数生成依赖熵源(Entropy Source),默认的阻塞型的 /dev/random熵源可能导致阻塞,而换一个非阻塞的 /dev/urandom 的熵源就可以了。(引自原文),解决方案就是启动参数加上:-Djava.security.egd=file:/dev/./urandom

  • 同时(敲黑板,重点!):

    • 看 jstack 堆栈 hang 住问题,优先看 RUNABLE
    • 看 jstack 堆栈 hang 住问题,优先看 RUNABLE
    • 看 jstack 堆栈 hang 住问题,优先看 RUNABLE
    • 如果一开始我就看 RUNABLE,可能就没有这么折腾,这么靠运气,终究自己还是学艺不精,要好好修炼!
结束语
  • 这是我程序员生涯遇到的第一个JDK的bug。要好好修炼,真的自己有点过于学艺不精了。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值