线上8核 linux服务器,负载为8为正常情况,目前CPU负载过高,最高负载30多,平均负载在20左右,已经持续近一周,具体占用CPU资源的服务是tomcat_sc,占用CPU资源高达:720%
- 使用jconsole去跟踪
更改catalina.sh 启动设置:
$ CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8933 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=$server_ip";
hostname -i 为127.0.0.1
测试服务器配置完后,在本机使用jconsole连接,输入测试服务器帐号密码即可连上。网上资料说要改hostname,没有更改hostname也可行
线上先开了服务器端口,又开了 本机端口,telnet可以连上,但jconsole无法连接,查google,说:
the jvm you're trying to connect to actually exposes *two* ports, the one specified via -Dcom.sun.management.jmxremote.port, and some other one. The 2nd one is random, but jconsole wants to connect to it, so if you have a firewall, and you've only opened up the above port, you're hosed.
只开放了一个端口就不可以?必须外网服务器所有端口都对内网开放?继续跟踪。
jmap jconsole jstack都是java自带的jmx 问题跟踪工具, 可以学习一下帮助分析定位内存溢出 程序死锁之类的程序问题
使用 jmap 查看内存状况
jmap -histo:live pid
服务自建类的数量并不多
jstack 跟踪堆栈也没看出个所以然
继续jconsole调查 google “jconsole remote set random port to certain” 找到一篇像样的文章:
http://www.componative.com/content/controller/developer/insights/jconsole3/
于是写了servlet去注册指定端口 未果
在测试机上先试试 写java文件:
import java.rmi.registry.LocateRegistry;
import javax.management.MBeanServer;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
public class JmxTest {
public static void main(String[] args) {
MBeanServer mbeanServer =
ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = null;
try {
url = new JMXServiceURL(
"service:jmx:rmi://localhost:12199/jndi/rmi://localhost:8933/jmxrmi");
} catch (MalformedURLException e) {
e.printStackTrace();
}
JMXConnectorServer connectorServer =
null;
try {
connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbeanServer);
} catch (IOException e) {
e.printStackTrace();
}
try {
System.setProperty("java.rmi.server.randomIDs", "true");
LocateRegistry.getRegistry(8933);
connectorServer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
出现 java.rmi.AccessException: Cannot modify this registry 错误
注释掉 catalina.sh的启动设置 -Dcom.sun.management.jmxremote.port=8933 也不行
最终放弃了jconsole
-
使用 java.lang.management..ThreadMXBean
用焱哥转发 新阳提供的 jsp页面 分析性能问题,主要是看线程阻塞情况
主要代码:
ThreadMXBean tm = ManagementFactory.getThreadMXBean();
tm.setThreadContentionMonitoringEnabled(true);
<%
long [] tid = tm.getAllThreadIds();
ThreadInfo [] tia = tm.getThreadInfo(tid, Integer.MAX_VALUE);
long [][] threadArray = new long[tia.length][2];
for (int i = 0; i < tia.length; i++) {
long threadId = tia[i].getThreadId();
long cpuTime = tm.getThreadCpuTime(tia[i].getThreadId())/(1000*1000*1000);
threadArray[i][0] = threadId;
threadArray[i][1] = cpuTime;
}
检测到如下线程问题:
Thread ID: 89
Thread Name: http-6080-Processor73
Thread State: RUNNABLE
Thread Lock Name: null
Thread Lock Owner Name: null
Thread CPU Time: 35678 sec
Stack Info: (depth:31)
+java.util.HashMap.get(HashMap.java:303)
+com.netqin.baike.server.nqrs.CloudSecurityCommand.writePkgsLog(CloudSecurityCommand.java:466)
+com.netqin.baike.server.nqrs.CloudSecurityCommand.execute(CloudSecurityCommand.java:153)
+com.netqin.baike.server.BaikeServer.service(BaikeServer.java:64)
+sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
CPU占用时间达到 35678秒 ,到下午到了50000秒左右,tomcat的CPU占用达到了200%
分析代码,发现是单例bean中使用了 hashmap 作为类对象,多线程访问时 类成员hashmap并不是线程安全的 非单例,引起了问题。更正代码后,截至目前 12小时以后没有发现问题,继续监控
相关推荐
本文主要记录一次tomcat进程,因TCP连接过多导致CPU占用过高的问题排查记录。 问题描述 linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%。请求无法响应。反复重启依然同一个现象。 问题...
分析tomcat占用cpu高的原因
tomcat+apache实现集群/负载均衡,只配置负载均衡还不行,还要session复制,也就是说其中任何一个tomcat的添加的session,是要同步复制到其它tomcat, 集群内的tomcat都有相同的session1. 修改tomcat1, tomcat2的...
windows平台下查询tomcatCPU100%工具(附教程) 注:通过tomcat的windows服务启动的tomcat是无法使用此命令获取线程栈的内容(如下图),必须通过startup.bat来启动。
超详细Nginx+Tomcat+Redis搭建高性能负载均衡集群Session共享搭建说明,按文档步骤可轻松搭建并实现session共享
apache tomcat负载集群,appache负载,tomcat负载
非常经典nginx-1.11.3+apache-tomcat-7.0.47搭建高性能负载均衡集群适合初学者、入门手册。
nginx1.8+tomcat8轻量级占用内存少集群负载均衡配置,抗并发强,最多支持5万并发。
jdk-8u151-linux-x64.tar.gz apache-tomcat-7.0.42.tar.gz apache-tomcat-9.0.1.tar.gz jspgouV6-ROOT.zip
解压后启动tomcat,nginx服务器,输入localhost:8888即可运行
Apache+Tomcat+Linux集群和均衡负载(Session同步复制
Nginx+Tomcat搭建高性能负载均衡集压缩文件包含:tomcat8-1,tomcat8-2,Nginx1.8.1,使用说明书案例word文档一份
由于Tomcat自身对内存的占用有控制,当对内存的占用达到最大值时便会出现内存溢出,对网站的访问严重超时等现象,这时便需要重新启动Tomcat以释放占用的内存,这样做便会阻断网站运行。 所以对Tomcat做负载均衡便很...
tomcat cpu hightomcat cpu high
tomcat集群_负载平衡
Tomcat集群和负载均衡.txt 有关使用tomcat服务器的集群配置和负载均衡说明
RedHat_linux+apache+tomcat+mod_jk_负载均衡安装说明
最近学习Nginx+tomcat实现 负载均衡。 首先大家注意: 本文章中没有session共享,关于session共享我会在下一篇中讲解,先实现Nginx+tomcat负载均衡再实现session共享。 从网上查了好多资料,多走了很多弯路,现在把...