SecureRandom实例创建问题导致Spring Boot首次请求很慢
Creation of SecureRandom Instance is Slow in Spring Boot
今天,在Linux服务器上启动了一个Spring Boot项目后,第一次请求用了很长的时间,查看日志后发现一个关键内容:Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [155,058] milliseconds.
原因分析
从日志的内容我们基本可以知道,是服务接收到第一个请求时,需要为当前会话创建一个Session ID。而创建这个Session ID需要用到 java.security.SecureRandom
这个类来生成一个随机数。就是创建这个类的实例消耗了很长的时间。
在类UNIX的系统上,SecureRandom
会默认使用 /dev/random
文件来获取随机数,通过该文件获取随机数是可能会阻塞的。具体内容可参考维基百科:https://en.wikipedia.org/wiki//dev/random。
除了 /dev/random
文件,其实还可以通过另一个文件 /dev/urandom
来获取随机数,两者最主要的一个区别就是通过 /dev/urandom
文件来获取随机数是不会阻塞的:
解决办法
查明原因后,我们就可以通过以下办法来解决这个问题,我们只需要在启动Spring Boot项目时通过命令行指定获取随机数的文件为 /dev/urandom
即可: