深坑:SecureRandom.getInstanceStrong() next方法阻塞啦
Posted RockyPeng3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深坑:SecureRandom.getInstanceStrong() next方法阻塞啦相关的知识,希望对你有一定的参考价值。
背景
我遇到的场景是,我们有个生成随机数的场景,采用的便是 SecureRandom.getInstanceStrong() 获取Random 实例。在windows电脑以及在docker环境中都运行正常,所以没发现问题。直到我们把代码部署到centos系统中时发现了问题(没有采用docker)。就发现这个方法执行时间很长,导致前端接口504 time out 错误。
最开始感觉很纳闷,一样的代码怎么会这样子。经过排查才发现是next方法执行时间很长导致的。
深究原因可以参考: https://blog.csdn.net/weixin_45244678/article/details/106137948
我的情况和这篇博文的情况很相似。
总结下来导致这个问题的原因是
SecureRandom.getInstanceStrong() 在linux环境下会读取操作系统的 /dev/random 文件来生成随机数,
而这个文件的数据来源于系统的扰动,比如键盘的输入、鼠标点击等等操作。当系统产生扰动很少的时候,就会导致读取这个文件的线程阻塞(和采用的代码语言无关)。操作系统产生的这个扰动可以通过 cat /proc/sys/kernel/random/entropy_avail 查看(即系统熵值)。
解决办法
- 采用 new SecureRandom() 实例化,这个实例化底层是读取的是操作系统的 /dev/urandom文件,这个是伪随机,相比 SecureRandom.getInstanceStrong() 方式,它的随机性稍微弱一些,但大多数场景够用了。
- 仍然采用 SecureRandom.getInstanceStrong() 方式,这种方式适合对随机性要求高的场景。采用这种方式为了避免阻塞问题,就需要系统产生足够的扰动。于是可以安装 haveged 并启动 haveged,启动haveged后可以发现 cat /proc/sys/kernel/random/entropy_avail 返回的值变大了,所以不再阻塞。也可以安装rng-tools这个来达到这个目的
实战
查看本机熵值
安装rng-tools
yum install rng-tools -y
启动rng-tools
systemctl enable rngd --now
再次查看本机熵值
以上是关于深坑:SecureRandom.getInstanceStrong() next方法阻塞啦的主要内容,如果未能解决你的问题,请参考以下文章