Author: phanx
Updated: 2016-6-16
2017-6-18
转载请保留作者信息
=========================
在Weblogic中创建了一个简单的域,只有AdminServer,开启了SSL。
登录Admin Console的时候,输入了用户名和密码后就一直卡住不动了,要等很久才能进入。
开始以为是配置了DNS的问题,抓包看了一下根本没有DNS请求。
于是用JSTACK做了一下DUMP看了看。先启动Weblogic Server后,做一次DUMP。
点击(此处)折叠或打开
- 2016-06-16 17:27:22
- Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.95-b03 mixed mode):
- "[STANDBY] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007fa638001000 nid=0x41b1 in Object.wait() [0x00007fa709544000]
- java.lang.Thread.State: WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <0x00000000feb8a140> (a weblogic.work.ExecuteThread)
- at java.lang.Object.wait(Object.java:503)
- at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:205)
- - locked <0x00000000feb8a140> (a weblogic.work.ExecuteThread)
- at weblogic.work.ExecuteThread.run(ExecuteThread.java:233)
- .
- .
- .
- .
- .
- .
- "[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007fa725125800 nid=0x419e in Object.wait() [0x00007fa70b6ca000]
- java.lang.Thread.State: WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <0x00000000ff419fc8> (a weblogic.work.ExecuteThread)
- at java.lang.Object.wait(Object.java:503)
- at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:205)
- - locked <0x00000000ff419fc8> (a weblogic.work.ExecuteThread)
- at weblogic.work.ExecuteThread.run(ExecuteThread.java:233)
- "Timer-1" daemon prio=10 tid=0x00007fa725121800 nid=0x419d in Object.wait() [0x00007fa70b7cb000]
- java.lang.Thread.State: TIMED_WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <0x00000000feb88c60> (a java.util.TaskQueue)
- at java.util.TimerThread.mainLoop(Timer.java:552)
- - locked <0x00000000feb88c60> (a java.util.TaskQueue)
- at java.util.TimerThread.run(Timer.java:505)
-
.
. - .
- .
- .
- .
- .
- Heap
- PSYoungGen total 164352K, used 158559K [0x00000000f5500000, 0x0000000100000000, 0x0000000100000000)
- eden space 153600K, 96% used [0x00000000f5500000,0x00000000fe55e530,0x00000000feb00000)
- from space 10752K, 99% used [0x00000000feb00000,0x00000000ff5797f0,0x00000000ff580000)
- to space 10752K, 0% used [0x00000000ff580000,0x00000000ff580000,0x0000000100000000)
- ParOldGen total 175104K, used 53506K [0x00000000e0000000, 0x00000000eab00000, 0x00000000f5500000)
- object space 175104K, 30% used [0x00000000e0000000,0x00000000e3440af0,0x00000000eab00000)
- PSPermGen total 131072K, used 74753K [0x00000000d0000000, 0x00000000d8000000, 0x00000000e0000000)
- object space 131072K, 57% used [0x00000000d0000000,0x00000000d4900798,0x00000000d8000000)
然后,登录,卡住了,再用JSTACK做一次DUMP。
点击(此处)折叠或打开
- 2016-06-16 17:28:19
- Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.95-b03 mixed mode):
- "[STANDBY] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007fa638001000 nid=0x41b1 in Object.wait() [0x00007fa709544000]
- java.lang.Thread.State: WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <0x00000000feb8a140> (a weblogic.work.ExecuteThread)
- at java.lang.Object.wait(Object.java:503)
- at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:205)
- - locked <0x00000000feb8a140> (a weblogic.work.ExecuteThread)
- at weblogic.work.ExecuteThread.run(ExecuteThread.java:233)
- .
- .
- .
- .
- .
- "[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007fa725125800 nid=0x419e runnable [0x00007fa70b6c9000]
- java.lang.Thread.State: RUNNABLE
- at java.io.FileInputStream.readBytes(Native Method)
- at java.io.FileInputStream.read(FileInputStream.java:272)
- at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:202)
- at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:219)
- - locked <0x00000000e09aacb0> (a java.lang.Object)
- at sun.security.provider.NativePRNG$RandomIO.access$300(NativePRNG.java:125)
- at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:119)
- at java.security.SecureRandom.generateSeed(SecureRandom.java:528)
- at com.bea.security.utils.random.AbstractRandomData.ensureInittedAndSeeded(AbstractRandomData.java:91)
- - locked <0x00000000fe7c5ef0> (a com.bea.security.utils.random.SecureRandomData)
- at com.bea.security.utils.random.AbstractRandomData.getRandomBytes(AbstractRandomData.java:105)
- - locked <0x00000000fe7c5ef0> (a com.bea.security.utils.random.SecureRandomData)
- at com.bea.security.utils.random.AbstractRandomData.getRandomBytes(AbstractRandomData.java:100)
- at weblogic.security.Salt.getRandomBytes(Salt.java:18)
- at weblogic.servlet.security.internal.SecurityModule.generateNewId(SecurityModule.java:397)
- at weblogic.servlet.security.internal.SecurityModule.setupAuthCookie(SecurityModule.java:355)
- at weblogic.servlet.security.internal.SecurityModule.login(SecurityModule.java:316)
- at weblogic.servlet.security.internal.FormSecurityModule.processJSecurityCheck(FormSecurityModule.java:300)
- at weblogic.servlet.security.internal.FormSecurityModule.checkUserPerm(FormSecurityModule.java:211)
- at weblogic.servlet.security.internal.FormSecurityModule.checkAccess(FormSecurityModule.java:94)
- at weblogic.servlet.security.internal.ChainedSecurityModule.checkAccess(ChainedSecurityModule.java:79)
- at weblogic.servlet.security.internal.ServletSecurityManager.checkAccess(ServletSecurityManager.java:82)
- at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2219)
- at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
- at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1491)
- at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
- at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
- "Timer-1" daemon prio=10 tid=0x00007fa725121800 nid=0x419d in Object.wait() [0x00007fa70b7cb000]
- java.lang.Thread.State: TIMED_WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <0x00000000feb88c60> (a java.util.TaskQueue)
- at java.util.TimerThread.mainLoop(Timer.java:552)
- - locked <0x00000000feb88c60> (a java.util.TaskQueue)
- at java.util.TimerThread.run(Timer.java:505)
- .
- .
- .
- .
- .
- Heap
- PSYoungGen total 164352K, used 162488K [0x00000000f5500000, 0x0000000100000000, 0x0000000100000000)
- eden space 153600K, 98% used [0x00000000f5500000,0x00000000fe934830,0x00000000feb00000)
- from space 10752K, 99% used [0x00000000feb00000,0x00000000ff5797f0,0x00000000ff580000)
- to space 10752K, 0% used [0x00000000ff580000,0x00000000ff580000,0x0000000100000000)
- ParOldGen total 175104K, used 53506K [0x00000000e0000000, 0x00000000eab00000, 0x00000000f5500000)
- object space 175104K, 30% used [0x00000000e0000000,0x00000000e3440af0,0x00000000eab00000)
- PSPermGen total 131072K, used 74808K [0x00000000d0000000, 0x00000000d8000000, 0x00000000e0000000)
- object space 131072K, 57% used [0x00000000d0000000,0x00000000d490e1d0,0x00000000d8000000)
从红色的部份应该就可以看出是卡在生成随机数这步了。 在Linux平台用Weblogic的基本都遇到过生成随机数慢的这个问题。
办法也很简单,要么改 $JAVA_HOME/jre/lib/security/java.security 中的securerandom.source改为
点击(此处)折叠或打开
- securerandom.source=file:/dev/./urandom
或者直接export JAVA_OPTIONS="-Djava.security.egd=file:/dev/./urandom"。
Update 2017-6-18:
另外,如果是 Intel Ivy Bridge 核心以后的的CPU(Xeon E5-2600 v2/E7-4800 v2/8800 v2这些,具体可参考 ),那么可以用CPU提供的硬件随机数加速功能。
需要RHEL 6 Update 7 以上的RNG-TOOLS才支持。 默认情况下,启动rngd服务会报 Unable to open file: /dev/tpm0 ,需要在 /etc/sysconfig/rngd 中配置 EXTRAOPTIONS="--rng-device=drng --no-tpm=1"
点击(此处)折叠或打开
- [root@localhost ~]# grep --color rdrand /proc/cpuinfo
- flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
- [root@localhost ~]# grep Xeon /proc/cpuinfo
model name : Intel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHz
点击(此处)折叠或打开
- [root@localhost ~]# rpm -qa|grep rng
- rng-tools-5-2.el6_7.x86_64
- [root@localhost ~]# cat /etc/sysconfig/rngd
- # Add extra options here
- EXTRAOPTIONS="--rng-device=drng --no-tpm=1"
- [root@localhost ~]# chkconfig rngd on
- [root@localhost ~]# service rngd start
-
[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail
3202