在Linux主機上遠程登陸,執行一個簡單的Oracle的JDBC鏈接程序(jar包),結果硬生生的卡在了鏈接創建驗證階段,而後等上幾分鐘後由於鏈接超時,鏈接被遠端的Oracle服務器reset,因而報了connection reset exceptionphp
緣由:java
參考:http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/linux
如參考材料中所述,oracle JDBC在創建鏈接時須要一些隨機數據用以加密session token之類的東西,而這個隨機數據源默認用的是/dev/random,若是不是,反正也是一個能讓人慢的抓狂的發生源。Linux有個內核熵池(感受太裝B了),經過蒐集鍵盤,鼠標,中斷,磁盤操做來產生隨機數據,能夠經過如下命令查看當前的熵值:服務器
cat /proc/sys/kernel/random/entropy_availsession
因爲執行程序的主機沒有圖形界面只是經過遠程ssh進行鏈接,那麼熵值來源就少了兩個,若是機器比較空閒則後面兩個來源也少了,結果就是等半天來不了一個隨機數,能夠經過一下命令體驗一下,用/dev/random憋出個隨機數是多難oracle
dd if=/dev/random of=rnd_file bs=1 count=64dom
若是僥倖執行的很快,能夠多試幾回把積累起來的熵值用掉,能夠經過前面所述的方法查看當前熵值數目ssh
Linux中還有個隨機數發生器,/dev/urandom,如其名字所述,不那麼隨機的隨機發生器,就是僞隨機的,固然會快不少。參考資料中給出的把隨機源修改成/dev/urandom的方法,即在執行java程序加入命令行參數:ide
-Djava.security.egd=file:///dev/urandom測試
但是彷佛不起做用。那麼手工來增大熵值吧,能夠執行一下命令
for i in {1..100000};do cat /proc/sys/kernel/random/entropy_avail;done;
就是反覆打印當前熵值10萬次,固然根據本身測試的結果當熵值到達240+時,能夠按ctrl+c終止這個命令,此時再去執行Oracle JDBC程序,就能夠鏈接成功了(保險一點能夠等熵值更大時終止命令)。雖然不是實用的解決方案,但至少肯定了問題所在。爲了這個事,人都快奔潰了。
解決方案:
安裝一個爲提供提供熵的程序包
sudo apt-get install haveged
熵池減小緣由:
因爲linux內核2.4升級到2.6後減小噪源獲取,致使隨機數生成量減小,經過使用rngd服務獲取硬件噪源,生成隨機數,補充熵池。
解決方案:
熵池配置:
查看是否安裝 rng-tools(默認系統已經安裝)
# echo 'EXTRAOPTIONS="--rng-device /dev/urandom"' >/etc/sysconfig/rngd
啓動服務:
# service rngd start
配置開機啓動:
# chkconfig rngd on
驗證信息:
# chkconfig --list rngd
rngd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
測試是否成功
# dd if=/dev/random of=rnd_file bs=1 count=64
記錄了64+0 的讀入
記錄了64+0 的寫出
64字節(64 B)已複製,0.00069313 秒,92.3 kB/秒