linux random问题 - Wangxiaoman/tech-note GitHub Wiki

问题描述

recom-job在运行小物料召回的定时任务异常

时间

4月10日早上2点左右

现象

  • 定时任务在2点开始执行
  • 日志中没有异常日志
  • 保底文件生成这一步非常慢,一分钟才能保存一个文件(正常2分钟会保存10w个左右文件)

排查问题

  1. jmap -heap,无异常
  2. jstat -gcutil,gc无异常
  3. netstat -apn,redis、mysql连接无异常
  4. /proc/pid/fd,发现服务打开fd一直包含几个 /dev/random 随机数文件(已经在启动参数上增加了/dev/urandom)
  5. 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/

https://www.cnblogs.com/zhouhbing/p/5820899.html

https://cloud.tencent.com/developer/article/1087417