linux熵池耗盡含潘,導(dǎo)致oracle數(shù)據(jù)庫連接失敗
今天接到某業(yè)務(wù)開發(fā)人員的報錯信息:
隨后又接到應(yīng)用運維人員的報錯信息:
連接失敗狠持,errorCode 17002, state 08006
兩位同學(xué)的反饋合是,問題都指向數(shù)據(jù)庫,應(yīng)用無法連接數(shù)據(jù)庫。
趕緊檢查數(shù)據(jù)庫狀態(tài)……
結(jié)果:
數(shù)據(jù)庫監(jiān)聽正常
集群狀態(tài)正常
數(shù)據(jù)庫日志沒有報錯
會話遠(yuǎn)沒達(dá)到配置上線
數(shù)據(jù)庫沒有死鎖
系統(tǒng)資源都比較空閑届垫,沒有壓力
數(shù)據(jù)庫一切正常……
根據(jù)錯誤代碼全释,進(jìn)行查詢装处,發(fā)現(xiàn)可能是linux系統(tǒng)熵池不夠,導(dǎo)致連接無法建立浸船,原因是oracle 11g JDBC在建立連接時需要大約40個字節(jié)隨機(jī)數(shù)據(jù)來加密session token之類的連接字符串妄迁,而這個隨機(jī)數(shù)據(jù)源默認(rèn)用的是/dev/random,通過搜集鍵盤李命,鼠標(biāo)登淘,中斷,磁盤操作來產(chǎn)生隨機(jī)數(shù)據(jù)封字,可以通過以下命令查看當(dāng)前的熵值:
cat /proc/sys/kernel/random/entropy_avail
結(jié)果發(fā)現(xiàn)黔州,熵值最低時為100多,最高時只有300多阔籽。
熵池上限大小
cat /proc/sys/kernel/random/poolsize
4096
明顯熵池不夠流妻,我們有以下幾種解決方法:
1)把隨機(jī)源由/dev/random修改為/dev/urandom,即在執(zhí)行java程序加入命令行參數(shù):
-Djava.security.egd=file:///dev/urandom
2)安裝一個提供熵的程序包
yum install haveged
service haveged start
chkconfig --level 2345 haveged on
或
yum install rng-tools
service rngd start
chkconfig --level 2345 rngd on
安裝后笆制,熵值飆升到3000多绅这,業(yè)務(wù)重啟后,連接數(shù)據(jù)恢復(fù)正常
那么在辆,究竟是什么程序頻繁消耗熵值呢君躺?
我們查看一下熵值隨時間的變化情況
cat /proc/sys/kernel/random/entropy_avail && date
發(fā)現(xiàn)每次在0秒時,下降比較大
想起前段時間部署了oracle數(shù)據(jù)采集腳本开缎,使用python+cx_oracle連接數(shù)據(jù)庫棕叫,每分鐘執(zhí)行一次。
linux熵池原理
Linux內(nèi)核采用熵來描述數(shù)據(jù)的隨機(jī)性奕删。熵(entropy)是描述系統(tǒng)混亂無序程度的物理量俺泣,一個系統(tǒng)的熵越大則說明該系統(tǒng)的有序性越差,即不確定性越大完残。在信息學(xué)中伏钠,熵被用來表征一個符號或系統(tǒng)的不確定性,熵越大谨设,表明系統(tǒng)所含有用信息量越少熟掂,不確定度越大。
計算機(jī)本身是可預(yù)測的系統(tǒng)扎拣,因此赴肚,用計算機(jī)算法不可能產(chǎn)生真正的隨機(jī)數(shù)素跺。但是機(jī)器的環(huán)境中充滿了各種各樣的噪聲,如硬件設(shè)備發(fā)生中斷的時間誉券,用戶點擊鼠標(biāo)的時間間隔等是完全隨機(jī)的指厌,事先無法預(yù)測。Linux內(nèi)核實現(xiàn)的隨機(jī)數(shù)產(chǎn)生器正是利用系統(tǒng)中的這些隨機(jī)噪聲來產(chǎn)生高質(zhì)量隨機(jī)數(shù)序列踊跟。
內(nèi)核維護(hù)了一個熵池用來收集來自設(shè)備驅(qū)動程序和其它來源的環(huán)境噪音踩验。理論上,熵池中的數(shù)據(jù)是完全隨機(jī)的商玫,可以實現(xiàn)產(chǎn)生真隨機(jī)數(shù)序列箕憾。為跟蹤熵池中數(shù)據(jù)的隨機(jī)性,內(nèi)核在將數(shù)據(jù)加入池的時候?qū)⒐浪銛?shù)據(jù)的隨機(jī)性拳昌,這個過程稱作熵估算袭异。熵估算值描述池中包含的隨機(jī)數(shù)位數(shù),其值越大表示池中數(shù)據(jù)的隨機(jī)性越好地回。
linux熵池與oracle數(shù)據(jù)庫的關(guān)系
默認(rèn)情況下扁远,Oracle JDBC 11g似乎會使用/dev/random俊鱼。而使用/dev/random生成隨機(jī)數(shù)時刻像,依賴熵池。如果熵池空了或不夠用并闲,對/dev/random的讀取就會堵塞细睡,直到熵池夠用為止。但是有文章中說帝火,urandom的隨機(jī)性弱于random(也有反對者)溜徙。
那怎么讓熵池增加呢?熵池小會有什么其他后果嗎犀填?
熵池本質(zhì)上是若干字節(jié)蠢壹。/proc/sys/kernel/random/entropy_avail 中存儲了熵池現(xiàn)在的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量九巡,單位都是bit图贸。如果entropy_avail的值小于要產(chǎn)生的隨機(jī)數(shù)bit數(shù),那么/dev/random就會堵塞冕广。
熵池怎么增加疏日?
只有少數(shù)驅(qū)動程序會填充熵池,首先是鍵盤和鼠標(biāo)撒汉。
實際上是從各種noice source中獲取數(shù)據(jù)沟优,noice source可能是 鍵盤事件、鼠標(biāo)事件睬辐、設(shè)備時鐘中等挠阁。
linux內(nèi)核從2.4升級到2.6時宾肺,處于安全性的考慮,廢棄了一些source鹃唯。source減少了爱榕,熵池補(bǔ)給的速度當(dāng)然也變慢,進(jìn)而不夠用坡慌。
具體方法參考文中前半部分
熵斥堵塞會有什么后果黔酥?
其實,通過消耗熵池洪橘,可以構(gòu)造DOS攻擊跪者。原理很簡單,熵池空了熄求,依賴隨機(jī)數(shù)的業(yè)務(wù)(SSL渣玲,加密等)就不能正常進(jìn)行。