最近碰到了个很有意思的问题,springboot加载多数据源,遇到了在启动时数据库连接报错的问题。

报错信息:

The error occurred while executing a query

然后找到了一篇文章,linux熵池耗尽

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

在jvm启动参数里加上

-Djava.security.egd=file:/dev/./urandom

就ok了。

可是这是为什么呢?

因为相同环境的多台机器,有些机器有问题,有些机器没问题,排查这个问题耗费了很长时间。

是虚拟机导致的吗?

可以看到,上面那篇博文里是怎么说的:

在无头服务器中,用于(java)应用程序连接的11g JDBC驱动程序可能会造成麻烦。

原因是JDBC 11g需要大约40个字节的安全随机数,从/ dev / random收集,以加密其连接字符串。

为什么这个神秘的“熵池”耗尽了随机数?

我们先去看看。

首先是正常的服务器,执行如下命令:

    cat /proc/sys/kernel/random/entropy_avail
cat /proc/sys/kernel/random/poolsize

接着是报错的那台机器:

为什么entropy_avail就只有189呢?是这个原因吗?

为什么只有189就不能用了呢?

再来看看这篇文章

https://jarfield.iteye.com/blog/1739834

再回来看看oracleJDBC,原来默认情况下,Oracle JDBC 11g似乎会使用/ dev / random。而使用/dev/random生成随机数时,依赖熵池。如果熵池空了或不够用,对/dev/random的读取就会堵塞,直到熵池够用为止。

但是上面这篇文章中说,有得必有失,urandom的随机性弱于random。

这点我也找到了一篇文章,来反驳这种说法,大家可自行围观。

那怎么让熵池增加呢?熵池小会有什么其他后果吗?

jarfield老兄上面那篇文章中说到

熵池本质上是若干字节。/proc/sys/kernel/random/entropy_avail中存储了熵池现在的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量,单位都是bit。如果entropy_avail的值小于要产生的随机数bit数,那么/dev/random就会堵塞。

熵斥怎么增加?

只有少数驱动程序会填充熵池,首先是键盘和鼠标。

实际上是从各种noice source中获取数据,noice source可能是 键盘事件、鼠标事件、设备时钟中等。

linux内核从2.4升级到2.6时,处于安全性的考虑,废弃了一些source。source减少了,熵池补给的速度当然也变慢,进而不够用。

熵斥堵塞会有什么后果?

其实,通过消耗熵池,可以构造DOS攻击。原理很简单,熵池空了,依赖随机数的业务(SSL,加密等)就不能正常进行。

怎么补充熵池?

Linux服务器在运行时,既没有键盘事件,也没有鼠标事件,如何快速积累熵池呢?

在上面那篇文章中有说到:

例如rngd或rng-tools。

先观察rngd启动前的熵池大小:

    watch cat /proc/sys/kernel/random/entropy_avail

只有100多。

安装rng-tools,参考文章 https://blog.csdn.net/tiantao2012/article/details/78792046。

    yum install rng-tools -y

启动rngd服务

    service rngd start

再看下熵池

飙升到3000多。

哈哈,搞定收工。

最后,是我的星球,哈哈。

最新文章

  1. Double Checked Locking 模式
  2. SharedPreferences保存数据
  3. 转-Spring单例模式与线程安全
  4. C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)
  5. 前端优化:RequireJS Optimizer 的使用和配置方法
  6. zoj 1648 判断线段是否相交
  7. 【转】使用junit4进行单元测试(高级篇)
  8. [Guava官方文档翻译] 6. 用Guava辅助Throwable异常处理 (Throwables Explained)
  9. Nginx高性能服务器安装、配置、运维 (6) —— Nginx日志及日志分割
  10. 可以让PHP编程事半功倍的类库
  11. javascript实现倒计时-------Day28
  12. python socketserver监听多端口多进程
  13. java使用Websocket获取HttpSession出现的问题与解决
  14. spark-遇到问题小结
  15. HTML中的上下标标签的演示
  16. JavaScript变量转换
  17. h5内容初探
  18. solr的随机排序 【转载】
  19. JPA(七):映射关联关系------映射双向多对一的关联关系
  20. 设置jade高亮

热门文章

  1. C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
  2. lightoj1062【几何(二分)】
  3. java读取properties文件的配置信息
  4. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)
  5. IT兄弟连 JavaWeb教程 JSP经典面试题
  6. pgsql如何重启
  7. PAT甲级——1135 Is It A Red-Black Tree (30 分)
  8. PyAudio 实现录音 自动化交互实现问答
  9. Flask (二) cookie 与 session 模型
  10. DWR+Spring配置使用