专业的JAVA编程教程与资源

网站首页 > java教程 正文

妈呀,一个随机数把系统干崩了......

temp10 2024-09-08 09:28:53 java教程 13 ℃ 0 评论

小明看着面前的这盘10块钱的豪华番茄鸡蛋浇头餐,心里狠狠地想:“就算这个月超预算,明天也要加个鸡腿,升级成极品帝王餐,解解馋”。

妈呀,一个随机数把系统干崩了......

正要开动,一阵急促的铃声从手机上传来,他低头一看,是项目经理打来的,顿时就是一惊,一股不好的预感从心头升起。刚点了接听键,大吼声就从听筒里传了出来:“赶快回来,系统崩了,立刻,马上......”。

小明看着那一点没动的豪华餐,不禁一阵心疼,无奈的狠狠地扒拉了一大口,火急火燎的就往回赶。一进办公室,就看见项目经理黑着脸,看着一群人手忙脚乱的忙活。小明顾不上打招呼,赶紧坐上自己的座位,开始鼓捣。

经过两个小时的奋战,小明担心的事情终于发生了,问题真的出在自己这儿,他不禁一阵头晕目眩。但现在还不是晕倒的时候,必须找出真正的原因,为什么自己写的这个接口,竟然会莫名其妙的总是时不时的超时呢?

SecureRandom,小明看着这个接口里唯一的另类,“罪魁祸首会不会就是它”。但是他实在不知道错在哪里,项目经理也不知道。他灵机一动,面向百度编程,就求助于百度吧。

“熵”,他看到这个字,一头雾水,“这是个什么玩意?熵池又是什么玩意?”

“熵指混乱程度。熵池是一种计算机系统内部的状态,或者说计算机系统内部的混乱程度,包含所有可能的随机性的来源。它是随机数生成器的核心。linux系统通过收集计算机系统的各种噪音,如鼠标移动,键盘敲击,网络数据传输等,把这些因素产生的熵存入熵池,为随机数生成器提供更加高质量的随机数。”

“但由于linux服务器所处的环境太安静了,比如没有用户活动,导致熵产生的不够,熵池中的熵值不足,随机数生成器需要等待足够的熵值才能产生随机数。”

“随机数有两种,一种是伪随机数,一种是安全随机数。java的SecureRandom就是安全随机数,它需要使用linux系统的熵池。当熵池中的熵值不足时,会阻塞,长达5、6分钟。可以用cat /proc/sys/kernel/random/entropy_avail查看linux的熵池。”

小明恍然大悟,赶紧到服务器上执行了一下命令,乖乖不得了,只有23。怪不得!他的接口每次调用都会因此阻塞,时间长了,服务器资源不足就挂了,波及了其他服务器,整个系统就崩溃了。那怎么办呢?小明赶紧继续往下看。

“解决办法有3种:一种是加java启动参数,-Djava.security.egd=file:/dev/./urandom;一种是修改jvm参数,找到$JAVA_PATH/jre/lib/security/java.security,将其中的securerandom.source=file:/dev/urandom替换成securerandom.source=file:/dev/./urandom,当然更好的方法是补熵,安装增熵服务haveged或rng-tools。”

小明看到这里,赶紧到服务器上安装haveged,当haveged服务启动之后,他再次查看熵池,发现值已经在1000以上了。整个系统也正常了。

小明长长的吁了一口气,终于搞定了,他这时才发现身上的衣服都已经被汗浸透了。他偷偷地看了眼项目经理,居然发现他不再生气了,反而露出了欣喜的笑容。“走,还愣着干什么,知道你中午没吃饭,我请你吃鸡腿”。

“耶......”



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表