共计 1072 个字符,预计需要花费 3 分钟才能阅读完成。
springboot 应用基于 k8s 部署 pod 启动缓慢排查的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
在 k8s 集群中部署 springboot 应用,应用启动较慢,如图:
如果基于 kubelet log -f pod 查看日志时,日志打印同样较慢
调试改动后:
Linux 系统上的设备 /dev/random 和 /dev/urandom 是不同的。
/dev/random 设备提供的不是伪随机数据,而是基于环境中的真实随机因素(即背景噪声作为熵源)的随机数据。
所以,/dev/random 不像设备 /dev/urandom。后者是一个伪随机数据生成器,能按照请求快速生成所需数量的数据。/dev/random 能生成多少内容由环境中的噪声决定。数据不足时,/dev/random 只能等待。
所以,在内容不足时,/dev/random 会将读操作阻塞,直至收集到足够的随机数据。这就是测试结果差异产生的原因,/dev/random 阻塞第二次的读操作将近 1 分钟时间。
所以,对于使用了 /dev/random 设备的而言,都有被阻塞的可能。被阻塞时,上层应用可能表现为启动慢或者执行耗时不正常。因为 /dev/random 行为与环境背景有关,行为随机。所以也导致上层应用因之引发的问题表现随机,不易排查。
比如,在 Java 社区,/dev/random 设备引致的问题早在 jdk-1.4 版本时就已经有 bug 报告。但是还是有客户不知道类似问题的致因和解决方案。
解决方案简单说,就是除非有明确的理由,必须要使用 /dev/random 设备。否则,使用 /dev/urandom 设备即可。
对于 jdk 而言,需要的是把配置文件中 $JAVA_HOME/jre/lib/security/java.security 中的 securerandom.source=file:/dev/random 改为 securerandom.source=file:/dev/urandom
排查建议
对于 Java 程序启动慢,或者进程耗时不正常,请优先排查是不是 /dev/random 的问题。步骤如下
确认是不是使用的是设备 /dev/random。这只要检查 $JAVA_HOME/jre/lib/security/java.security 对应的配置就好。
如果是,则变更配置。
重启 Java 程序确认是否问题解决。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。