本文說的是解決過程,可直接點擊本行略過探查內容,跳到最后的解決辦法!!
現象:
1、WEBLOGIC安裝在 CENTOSopenSUSE 等LINUX或者UNIX機器上,無論是虛擬機或者PC或者服務器
2、創建簡單domain,啟動后,第一次進入控制台輸入用戶密碼后出現管理界面,每次訪問控制台速度均正常。
3、重啟weblogicserver,訪問控制台,輸入用戶密碼后,無法出現管理界面,可能等待5-10分鍾,甚至更長。
嘗試:
1、捕捉 Thread dump未發現異常
2、編寫建檔應用部署,重啟weblogicserver 后,應用可正常訪問,無異常,說明問題在Admin console上
3、重啟SERVER服務器(操作系統)后,啟動weblogic正常
4、startWeblogic.sh 腳本中JAVA_OPTIONS中開啟-verbose:gc ,再次重啟weblogic server,輸入用戶密碼訪問控制台 ,未發現gc大量收集阻塞
5、startWeblogic.sh 腳本中JAVA_OPTIONS中開啟-verbose:class ,再次重啟weblogic server,輸入用戶密碼訪問控制台 ,觀察如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[Loaded com.bea.console.utils.CSRFUtils from file:/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/consoleapp/webapp/WEB-INF/lib/console.jar] [Loaded com.bea.security.utils.random.AbstractRandomData from file:/home/weblogic/Oracle/Middleware/modules/com.bea.core.common.security.utils_1.0.0.0_6-0-3-0.jar] [Loaded com.bea.security.utils.random.SecureRandomData from file:/home/weblogic/Oracle/Middleware/modules/com.bea.core.common.security.utils_1.0.0.0_6-0-3-0.jar] [Loaded java.security.ProviderException from /opt/jdk1.6.0_21/jre/lib/rt.jar]
HANG.....5-10分鍾
[Loaded weblogic.transaction.internal.ServerCheckpoint from file:/home/weblogic/Oracle/Middleware/modules/com.bea.core.transaction_2.6.1.0.jar] [Loaded sun.security.provider.NativePRNG$RandomIO$1 from /opt/jdk1.6.0_21/jre/lib/rt.jar] [Loaded weblogic.utils.Hex from file:/home/weblogic/Oracle/Middleware/modules/com.bea.core.utils_1.8.0.0.jar] [Loaded weblogic.management.mbeanservers.internal.JMXConnectorSubjectForwarder$35 from file:/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar] [Loaded weblogic.management.jmx.mbeanserver.WLSMBeanServerInterceptorBase$8 from file:/home/weblogic/Oracle/Middleware/modules/com.bea.core.management.jmx_1.4.0.0.jar] [Loaded com.sun.jmx.mbeanserver.Repository$ObjectNamePattern from /opt/jdk1.6.0_21/jre/lib/rt.jar] [Loaded weblogic.management.mbeanservers.domainruntime.internal.FederatedMBeanServerInterceptor$1 from file:/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar] [Loaded org.apache.taglibs.standard.tag.common.fmt.ParamSupport from file:/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/consoleapp/APP-INF/lib/standard.jar] ...... |
在輸入用戶密碼后,控制台輸出停止,等待5-10分鍾后,繼續。那么之前操作的值得懷疑的地方是加載了com.bea.console.utils.CSRFUtils、com.bea.security.utils.random.AbstractRandomData、com.bea.security.utils.random.SecureRandomData、java.security.ProviderException4個類,這4個類在控制台日志后面都跟有包名。
拿到包后,解壓,反編譯。大概邏輯就是為了避免CSRF(Cross-siterequest forgery),需要產生一個隨機實例以提供隨機字節、整數、長整數等
這里使用隨機數的代碼是:AbstractRandomData類中 的
| 1 |
this.random = SecureRandom.getInstance("SHA1PRNG"); |
然后再用random.nextXxxx()。
之前不覺得這句有問題,后來查了JDK才知道。這個是使用系統的隨機數設備(PRNG:偽隨機序列發生器pseudo-random number generator),當調用nextXxx方法時,系統提供一個隨機數使用。
正點來了
linux或者部分unix系統提供隨機數設備是/dev/random和/dev/urandom ,兩個有區別,urandom安全性沒有random高,但random需要時間間隔生成隨機數。jdk默認調用random。
再后來,終於在weblogic的官方文檔中Monitoring and Troubleshooting 找到了 Avoiding JVM Delays Caused By Random NumberGeneration 這樣一個標題。摘錄如下:
| The library used for random number generation in Sun's JVM relies on /dev/random by default for UNIX platforms. This can potentially block the Oracle WebLogic Communication Services process because on some operating systems /dev/random waits for a certain amount of "noise" to be generated on the host machine before returning a result. Although /dev/random is more secure, Oracle recommends using /dev/urandom if the default JVM configuration delays Oracle WebLogic Communication Services startup.
To determine if your operating system exhibits this behavior, try displaying a portion of the file from a shell prompt:
head -n 1 /dev/random Open the $JAVA_HOME/jre/lib/security/java.security file in a text editor.
Change the line:
securerandom.source=file:/dev/random to read:
securerandom.source=file:/dev/urandom Save your change and exit the text editor. |
其中說到:可通過 head -n 1/devrandom查看是否你的系統會出現偽隨機數提供等待。OK就這個,試了一下,果然,在服務器第一次啟動后,這個可以快速提供一個值,但當再次調用時發生等待。
解決辦法:
永久:oracle 說修改$JAVA_HOME/jre/lib/security/java.security 文件,替換securerandom.source=file:/dev/random 為securerandom.source=file:/dev/urandom。對所有使用JVM的應用生效。(這個永久的方法,這里面有個問題,就是設置時候實際應該設置為securerandom.source=file:/dev/./urandom,否則不生效)
DOMAIN臨時:修改startWeblogic.sh文件,JAVA_OPTIONS="${SAVE_JAVA_OPTIONS}-Djava.security.egd=file:/dev/./urandom"
后繼的SecureRandom 測試學習
編寫JAVA類如下,運行測試,第一次正常,第二次等待,重啟服務器后第一次又正常。啟動加入參數-Djava.security.egd=file:/dev/./urandom 正常
java-Djava.security.egd=file:/dev/./urandom Test
源碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.Security;
public class Test { public static void main(String[] args) { try { System.out.println("Begin to get SecureRandom Instance."); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); System.out.println("SR is ready for use...."); System.out.println("Next double is :" + sr.nextDouble());
} catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } } |
結束語:
唉,這些可能影響應用的東西應該在安裝文檔之前就應該執行的檢查啊,希望甲骨文這個地方效仿IBM,安裝文檔執行檢查,安裝包提供preInstallCheck腳本,以避免異常。
