一、问题现象
在使用 NC 过程中发现,系统时不时就不可用,一直在转圈。
通过浏览器访问系统时,页面长时间无法加载。
二、环境信息
系统为 NC 单点环境,在线人数为 30 人左右。
JDK版本如图也是正常的。
三、问题分析
在发现问题时观察 NMC,发现有一段时间的 NC 内存表现异常。
检查服务器的堆的进程内存使用状况,发现已经使用了 5.7G。
在 NMC 中发现了堵塞的线程。
但实际分析后发现与线程无关。
java.lang.Object.wait(Native Method)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1304)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1207)
org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:805)
org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)
org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1172)
... ...
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
java.io.InputStreamReader.read(InputStreamReader.java:184)
java.io.BufferedReader.fill(BufferedReader.java:161)
java.io.BufferedReader.readLine(BufferedReader.java:324)
java.io.BufferedReader.readLine(BufferedReader.java:389)
nccloud.framework.web.container.Request.readJsonAndConvertVO(Request.java:345)
nccloud.framework.web.container.Request.readSysParam(Request.java:322)
nccloud.framework.core.filter.LoginFilter.doFilter(LoginFilter.java:159)
sun.reflect.GeneratedMethodAccessor1130.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Method.java:498)
... ...
java.security.AccessController.doPrivileged(Native Method)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
... ...
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:311)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:253)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:188)
... ...
java.security.AccessController.doPrivileged(Native Method)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
nccloud.ws.opm.core.filter.OpenCloudOAuthFilter.doFilter(OpenCloudOAuthFilter.java:168)
sun.reflect.GeneratedMethodAccessor1130.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Method.java:498)
org.apache.catalina.security.SecurityUtil.lambda$execute$0(SecurityUtil.java:280)
org.apache.catalina.security.SecurityUtil$$Lambda$136/1104480242.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:549)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:311)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:253)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:188)
org.apache.catalina.core.ApplicationFilterChain.lambda$doFilter$0(ApplicationFilterChain.java:146)
org.apache.catalina.core.ApplicationFilterChain$$Lambda$385/1565205587.run(Unknown Source)
... ...
在sysconfig中增加了 -XX:+HeapDumpOnOutOfMemoryError参数,以便在系统发生内存溢出时生成堆转储文件。
在系统又发生异常时发现相关宕机文件生成
一开始用IBM分析工具ha457.jar打开了相关的宕机文件。实际hprof文件大小为4.8G。
但是在IBM分析工具中发现最大对象为400M。也没有看到有效的信息。
后续用visual分析,打开直接能看到线程发现发生问题的线程信息
查看线程信息(关键信息已隐藏)
nc.impl.xxx.xxx.xxx.xxx(TodoMsgServiceImpl.java:122)
查看了相关代码这块发生的问题。
四、解决方案
联系对应模块研发,出具相关补丁修复。