oracle连接耗尽,多数据源连接Oracle报错,linux熵池耗尽问题

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

The error occurred while executing a query

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

在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

5c2d68c1c5bcb8c4cc0267c61145b086.png

接着是报错的那台机器:

adf2963ceace48fd86ada9cd784f13a9.png

为什么entropy_avail就只有189呢?是这个原因吗? 为什么只有189就不能用了呢? 再来看看这篇文章

再回来看看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

1c27c0a4044c8ff72d8b0b20e1fb367c.png

只有100多。

yum install rng-tools -y

启动rngd服务

service rngd start

再看下熵池

ad45754e8311b44da4a7972866e7d1e9.png

飙升到3000多。

哈哈,搞定收工。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值