今天记录一下之前遇到的问题: 项目部署在 window 登录能很快完成, 部署到 linux 后, 第一次登录过程变得很慢.
通过查看系统日志, 发现时间主要消耗在了创建 session, 并且定位到是 SecureRandom 的初始化问题, 继续查看, 发现 session 的 id 创建方式为 uuid, 到这里, 熟悉 linux 的人就会明白问题在哪了.
Java 的 UUID 依赖于 SecureRandom.nextBytes 方法, 而 SecureRandom 又依赖于操作系统提供的随机数源. 在 Linux 系统下, 它的默认依赖是 / dev/random, 而这个源是阻塞的. 最可怕的是, 这个 nextBytes 方法还是一个 synchronized 方法, 也就是说, 如果多线程调用 UUID, 生成速率不升反降.
到这里, 只需要修改 java 的默认随机生成规则就可以了. 修改方法如下:
去到 $JAVA_PATH/jre/lib/security/java.security 这个文件, 找到下面的内容:
securerandom.source=/dev/random
替换成
securerandom.source=/dev/urandom
好了, 问题得到了解决!!
其实这也是分布式系统中, 不使用 uuid 作为 id 的一个重要原因.
来源: http://www.bubuko.com/infodetail-2678481.html