WEBLOGIC啟動后,重啟后控制台進入緩慢、延遲,探查WEBLOGIC


本文說的是解決過程,可直接點擊本行略過探查內容,跳到最后的解決辦法!!

現象:

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腳本,以避免異常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM