<server>
<name>app_server1</name>
<self-tuning-thread-pool-size-min>1000</self-tuning-thread-pool-size-min>
<self-tuning-thread-pool-size-max>1000</self-tuning-thread-pool-size-max>
需要注意的是,如果数值改得太大,启动时可能会出现以下错误:
[ERROR][thread ] Could not start thread [ACTIVE] ExecuteThread: '977' for queue: 'weblogic.kernel.Default (self-tuning)'. Resource temporarily unavailable
Attempting to allocate 8192M bytes
There is insufficient native memory for the Java
Runtime Environment to continue.
Possible reasons:
The system is out of physical RAM or swap space
In 32 bit mode, the process size limit was hit
Possible solutions:
Reduce memory load on the system
Increase physical memory or swap space
Check if swap backing store is full
Use 64 bit Java on a 64 bit OS
Decrease Java heap size (-Xmx/-Xms)
Decrease number of Java threads
Decrease Java thread stack sizes (-Xss)
Disable compressed references (-XXcompressedRefs=false)
java.lang.OutOfMemoryError: Resource temporarily unavailable in tsStartJavaThread (lifecycle.c:1097).
报错信息看起来像是内存不足,实际上不是内存不足,而是Linux系统默认情况下限制了最大线程数,需要进行修改。
如果使用CentOS 6或RHEL6,可以按照以下方法进行修改:
首先修改/etc/security/limits.conf,加入
* hard nofile 1048576
* soft nofile 1048576
然后修改/etc/security/limits.d/90-nproc.conf,加入
weblogic soft nproc 655350
最后修改/etc/pam.d/login,加入
session required /lib64/security/pam_limits.so
修改完成后不要马上退出shell,要开个新窗口测试各账号能否登进去。如果登不进去(例如提示could not open session
),说明参数改得太大,需要适当往小调。
另外如果线程数改大了,内存也应当适当调大,因为每个线程都会占一些内存空间。
启动报错“Assertion
ia_addressID' failed” 如果提示
java: Net.c:229:
Java_com_bea_wcp_sctp_Net_initIDs: Assertion 'ia_addressID'
failed.,可尝试删除
/u01/Oracle/Middleware/wlserver_10.3/sip/server/native/linux/x86_64/libsctpwrapper.so`文件。
改完文件之后要在控制台的“部署”里面进行更新,否则内容不会生效。改静态文件也是。
每次更新的时候,JVM会把Class信息保存到内存的永久保留区域中,而旧的内容不会释放。如果WebLogic启动参数中的-XX:MaxPermSize比较小,那么更新几次可能就会卡死挂掉,而且应用日志会显示java.lang.OutOfMemoryError: PermGen space
。在这种情况下,把WebLogic里面的服务器停掉然后再启动一次就好了。
建议每升两三次级就彻底重启一次受管节点,避免出现用一阵子之后莫名其妙死掉的问题。
在开始更新到更新结束,应用会出现短暂的中断,因此要注意选择合适的时间进行操作。另外在业务繁忙时进行更新,不但会影响用户,而且容易因为WebLogic繁忙而导致更新无响应或失败。
建议编写一份升级检查表,将准备工作、实施工作和收尾工作全部列入,以免因漏项导致升级出现问题。
如果更新时遭遇Error occurred while downloading files from admin server for deployment request "xxx,xxx,xxx". Underlying error is: "null"
,那么需要去检查AdminServer.log的日志(例如/u01/Oracle/Middleware/user_projects/base_domain/servers/AdminServer/logs/AdminServer.log
)。我碰到过两种会出现这种错误的情况,一种是文件名乱码,另一种是文件权限不正确(例如服务以weblogic用户运行,但是文件所有者是root,WebLogic访问不了)。假如权限不正确,可以chown -R weblogic:weblogic 存放程序的目录
。
我们部分应用服务器安装了WAF并配置了防篡改,如果升级之前忘记关闭防护功能,在控制台上激活时会报错,提示无法“remove
staged files”。
另外建议在系统中加入可配置参数的系统公告功能,这样在升级或者维护之前可以通知用户,使用户及时做好准备。
重启服务器
如果只是重启应用节点,操作就比较简单,直接在控制台上操作即可。不过,在WebLogic控制台重启服务的时候不要点完“启动”就不管了,一定要等到状态显示为“RUNNING”之后再收工。如果变成“ADMIN”,那么可能是有报错,需要去应用服务器日志检查一下。若确认不耽误事(例如java.lang.NoClassDefFoundError: com/ctc/wstx/stax/WstxInputFactory
)那么在控制台点一下“恢复”就好了。
有时观察服务器状态,可以看到状态是“RUNNING”,然而健康状况没有内容,这说明节点可能死了,你可以试一下重启复活。
如果不慎关掉AdminServer,或者打算整个重启,那么操作会比较麻烦,大体上要按以下思路操作:
在管理节点上启动AdminServer(startWebLogic.sh)。
在每个节点上都启动一遍NodeManager(startNodeManager.sh)。
进入管理控制台,启动各应用节点。
启动完成后确认“部署”里面各应用是否启动。
WebLogic打补丁速度比较慢,在打补丁过程中你需要干等,所以要多留一些操作时间。建议白天操作,晚上就可以少加班了。
安装补丁之前,必须先检查bsu.sh文件(例如/u01/Oracle/Middleware/utils/bsu/bsu.sh
),将其中的最大内存Xmx改大些,例如-Xmx2048m。因为打补丁实在太慢,等了半天出来的却是java.lang.OutOfMemoryError的话实在太憋屈。
打补丁对业务影响不大,可以随时操作,但是打完之后需要彻底重启WebLogic才能生效。AdminServer也要重启,否则后面容易碰到莫名其妙的问题。
搬家/迁移
尽量不要搬家,因为WebLogic安装和建域之后会产生很多已经写好了路径的配置文件。Middleware目录中有个registry.dat,此文件记录了WebLogic的安装情况,而且已经加密,如果贸然搬家会在升级等方面遇到麻烦。确实要进行迁移的话,新服务器WebLogic路径务必与旧服务器相同,想不同就去建立软链接。
WebLogic控制台密码
修改密码之前先观察系统有没有相关监控或管理软件,例如Oracle Enterprise
Manager。假如WebLogic控制台密码改了,依赖控制台的监控软件的密码没改,那么你可能会把自己锁在外面。
找个方便重启的时间来修改WebLogic控制台密码。在控制台修改完成之后,你需要试探性地重启各应用服务器节点,确保各节点不会因密码错误而无法启动。
假如应用节点真的因控制台密码错误而无法启动,你需要在WebLogic“服务器”页面中找到该节点,进入详细设置,在页面上方找到“服务器启动”页面,并在里面(最下方)输入正确的用户密码。
数据库/数据源密码
修改数据库密码会造成应用短暂停摆。你需要找个方便关停应用系统的时间来进行操作,或者提前通知系统维护。
在正式修改数据库密码之前,你需要确认数据库账户锁定阈值,或者能够以sysdba身份(Oracle数据库)操作。无论是先改WebLogic数据源密码,还是先修改数据库密码,只要WebLogic连接池尝试以旧密码建立连接,数据库账号就有可能会立刻锁定。
建议在服务器上面安装专门的监控软件。像我们项目组那种服务器由用户管理,应用由项目组自行运维的情况,更要有自己的监控程序,这样在出现问题时也好及时定位,以免一塌糊涂。
目前我们项目组自己写了一个监控脚本,在繁忙时期每隔10分钟、空闲时期每隔半小时把WebLogic控制台的一些常用指标记录到日志文件中(通过cron控制),代码见此。
莫名其妙白页(加载JSP页面时提示ClassNotFoundException)
系统运行一段时间之后,有用户反馈系统部分页面莫名其妙白页,没有任何内容,也没有错误信息。
查日志,发现报错信息类似:
<Jan 1, 2019 1:23:45 PM CST> <Error> <HTTP> <BEA-101249> <[ServletContext@1302345678[app:appname module:appname path:/appname spec-version:null]]: Servlet
class jsp_servlet._somepackage.__somejsppage for servlet /somepackage/somejsppage.jsp could not be loaded because the requested cl
ass was not found in the classpath /u01/Oracle/Middleware/user_projects/domains/app_domain/servers/app_server1/stage/appname/appname/WEB-INF/classes:/u01
/app/Oracle/Middleware/user_projects/domains/app_domain/servers/app_server1/stage/appname/appname/WEB-INF/lib/……(一大堆jar包的文件名):/u01/Oracle/Middleware/user_projects/domains/app_domain/servers/app_server1/tmp/_WL_user/appname/wekfjq.
java.lang.ClassNotFoundException: jsp_servlet._somepackage.__somejsppage.>
javax.servlet.ServletException: [HTTP:101249][ServletContext@1302345678[app:appname module:appname path:/appname spec-version:null]]: Servlet class jsp_servlet._somepackage.__somejsppage for servlet /somepackage/somejsppage.jsp could not be loaded because the requested class was not found in the classpath .
java.lang.ClassNotFoundException: jsp_servlet._somepackage.__somejsppage.
at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:551)
at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:283)
at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:218)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:244)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at com.xxx.xxx.xxx.XXXXXFilter.doFilter(XXXXXFilter.java:123)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:527)
at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
......(与我们应用完全无关的堆栈)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1499)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
因为我们的JSP页面是正常的,程序也未进行改动,最初认为是WebLogic内部错误,重启了WebLogic。重启之后,页面能够正常显示,然而过一段时间之后还是莫名其妙白页,而且本来已经变好的页面也坏掉了。重新部署应用、重新建域,甚至重装WebLogic之后仍然白页。
后来在WEB-INF目录放了一个weblogic.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd">
<context-root>appname</context-root>
<jsp-descriptor>
<keepgenerated>false</keepgenerated>
<precompile>true</precompile>
<precompile-continue>true</precompile-continue>
<page-check-seconds>-1</page-check-seconds>
<verbose>false</verbose>
<debug>false</debug>
</jsp-descriptor>
<container-descriptor>
<servlet-reload-check-secs>-1</servlet-reload-check-secs>
</container-descriptor>
</weblogic-web-app>
要求WebLogic对JSP预编译。重新部署之后,莫名其妙白页的问题解决了。