问题现象
顾问反馈系统卡顿,系统无法使用。所有节点打开都在转圈。
问题分析
排查了nmc,发现在master上有很多堵塞线程,都在做锁相关线程。
查看相关的线程信息发现是在做类加载。Master撑不住,需要把锁独立出来。
线程信息-1
java.io.WinNTFileSystem.getBooleanAttributes(Native Method)
java.io.File.exists(File.java:819)
sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:1334)
sun.misc.URLClassPath.getResource(URLClassPath.java:249)
java.net.URLClassLoader$1.run(URLClassLoader.java:366)
java.net.URLClassLoader$1.run(URLClassLoader.java:363)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:362)
java.lang.ClassLoader.loadClass(ClassLoader.java:424)
java.lang.ClassLoader.loadClass(ClassLoader.java:357)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:348)
java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)
nc.bs.framework.comn.NetObjectInputStream$NCObjectInputStream.resolveClass(NetObjectInputStream.java:98)
... ...
java.io.ObjectInputStream.readArray(ObjectInputStream.java:1975)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
nc.bs.framework.common.InvocationInfo.readExternal(InvocationInfo.java:207)
java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:2118)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
nc.bs.framework.comn.NetObjectInputStream.readObjectOverride(NetObjectInputStream.java:277)
... ...
线程信息-2
java.util.zip.ZipFile.getEntry(Native Method)
java.util.zip.ZipFile.getEntry(ZipFile.java:316)
java.util.jar.JarFile.getEntry(JarFile.java:240)
java.util.jar.JarFile.getJarEntry(JarFile.java:223)
sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1054)
sun.misc.URLClassPath.getResource(URLClassPath.java:249)
java.net.URLClassLoader$1.run(URLClassLoader.java:366)
java.net.URLClassLoader$1.run(URLClassLoader.java:363)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:362)
java.lang.ClassLoader.loadClass(ClassLoader.java:424)
java.lang.ClassLoader.loadClass(ClassLoader.java:357)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:348)
java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)
nc.bs.framework.comn.NetObjectInputStream$NCObjectInputStream.resolveClass(NetObjectInputStream.java:98)
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
java.io.ObjectInputStream.readClass(ObjectInputStream.java:1716)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1556)
java.io.ObjectInputStream.readArray(ObjectInputStream.java:1975)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
nc.bs.framework.common.InvocationInfo.readExternal(InvocationInfo.java:207)
... ...
Master请求是每秒1000多
解决方案
由于项目使用了Npart,通过Npart搭建了独立的PK锁服务器
后续问题
但是搭建完成后发现采购订单维护点击删除,发现报错如图。
排查相关数据库锁、PK锁都为空。
但是NMC中可以看到相关线程都存在PKlockServer的进程,说明已经创建了独立的PK锁。
排查相关线程发现有PK锁相关线程
导致的单据加锁。
删除单独的锁服务器,恢复master解锁后,单子可以删除。经过排查发现,在单独访问主机的server,直接做相关单子无异常现象。
单独访问从机上的服务做相同单据,显示被锁,nmc中也有相关线程出现。怀疑从机到主机PK锁服务网络不通导致PK锁服务未接收到相关请求的原因造成的。
查看服务防火墙发现端口未开放。开放相关PK锁服务的端口后,问题解决。