linux random问题 - Wangxiaoman/tech-note GitHub Wiki
问题描述
recom-job在运行小物料召回的定时任务异常
时间
4月10日早上2点左右
现象
- 定时任务在2点开始执行
- 日志中没有异常日志
- 保底文件生成这一步非常慢,一分钟才能保存一个文件(正常2分钟会保存10w个左右文件)
排查问题
- jmap -heap,无异常
- jstat -gcutil,gc无异常
- netstat -apn,redis、mysql连接无异常
- /proc/pid/fd,发现服务打开fd一直包含几个 /dev/random 随机数文件(已经在启动参数上增加了/dev/urandom)
- jstack -l,打印线程栈,发现卡在contextTools中加密位置(SecureRandom.getSeed(12)方法上),对应下面的文章
问题定位
-
在生成文件的时候,文件加密部分使用了SecureRandom,间接会调用linux的urandom,在调用/dev/urandom的时候,配置没有生效,而linux的/dev/random的random pool 的生成速度取决于linux的系统中断,如果获取不到,则会阻塞线程。
-
那么对于我的服务有两种解决方案: 1、替换SecureRandom; 2、在启动jar的参数上,将/dev/urandom替换为/dev/./urandom; 3、安装haveged包;
最终采用Common-lang-3xx中的RandomUtils.nextBytes(12)替换SecureRandom.getSeed(12)
参考文章
http://hongjiang.info/java8-nativeprng-blocking/