`

tomcat cpu占用过高,系统负载高问题跟踪

 
阅读更多

线上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占用cpu高的原因

    8. **第三方库问题**:有些第三方库可能存在CPU密集型操作,如加密解密、图形处理等,未优化的库可能导致CPU占用过高。 9. **JVM优化不当**:JVM的默认配置可能并不适用于所有场景,如错误的垃圾收集器选择、新生代...

    tomcat cpu high

    标题 "Tomcat CPU 高" 描述了在运行Apache Tomcat服务器时遇到的一个常见问题,即CPU使用率过高。这通常意味着服务器正在处理大量请求,或者存在资源浪费、内存泄漏、线程阻塞等问题,导致性能瓶颈。让我们深入探讨...

    Nginx+Tomcat负载均衡

    最近学习Nginx+tomcat实现 负载均衡。 首先大家注意: 本文章中没有session共享,关于session共享我会在下一篇中讲解,先实现Nginx+tomcat负载均衡再实现session共享。 从网上查了好多资料,多走了很多弯路,现在把...

    nginx+tomcat+ssl实现负载均衡

    2. **高性能**:Nginx采用内核Poll模型,能够承受高并发连接数,官方测试显示可支持高达50,000个并发连接,且CPU和内存占用率极低。 3. **高稳定性**:由于Nginx的分阶段资源分配技术,即使在维持大量无活动连接时...

    一次因Java应用造成CPU过高的排查实践过程

    本文将深入探讨一次由于Java应用导致CPU占用过高的排查实践过程。 首先,当发现应用CPU使用率异常时,第一步是确认是否真的是计算密集型任务导致的。在大多数情况下,CPU高负荷往往是由于程序中的逻辑错误,如死...

    linux下配置tomcat集群的负载均衡.zip

    同时,应设置监控系统,如Prometheus和Grafana,以便实时查看集群状态,如CPU使用率、内存占用、请求处理时间等。 7. **故障转移与扩展**:如果某个Tomcat实例出现故障,负载均衡器应能够自动将流量重定向到其他...

    Tomcat6的负载均衡配置.doc

    - 监控各个worker的性能指标,如CPU使用率、内存占用、请求数等,及时发现并解决问题。 - 记录和分析日志,有助于诊断错误和性能瓶颈。 通过上述配置,可以实现基于Tomcat6的简单负载均衡,有效分散服务器压力,...

    容器编排系统在Tomcat高可用性管理中的优势.pptx

    - **弹性扩展和缩减**:Swarm支持动态服务发现和故障检测,能够自动调整负载均衡策略以适应Tomcat实例的增减,确保系统的高可用性。 - **高级负载均衡算法**:Swarm提供了多种负载均衡算法供选择,如轮询、最少连接...

    tomcat7集群

    当单个Tomcat服务器无法满足高并发、高可用性或负载均衡的需求时,我们通常会采用集群的方式来提升系统的性能和可靠性。本篇文章将深入探讨如何配置Tomcat7集群。 【描述】:Tomcat7集群的搭建涉及到多个环节,包括...

    loadrunner监控tomcat脚本

    总的来说,通过LoadRunner监控Tomcat,我们可以全面了解服务器在高负载下的行为,优化系统性能,预防可能出现的性能问题,提高应用的稳定性和用户体验。而提供的文件列表暗示了具体实施这一过程所需的脚本和配置文件...

    APR based Apache Tomcat Native library 1.1.14.

    1. **性能优化**:通过使用APR,Tomcat Native库可以利用操作系统级别的多线程、内存管理和网络I/O,从而实现更高效的并发处理,降低CPU占用率,并提高整体吞吐量。 2. **SSL加速**:APR库提供了本机SSL支持,这...

    winserver2008下apahce连多个tomcat下效率问题

    标题“winserver2008下apahce连多个tomcat下效率问题”涉及的是在Windows Server 2008操作系统环境下,如何高效地配置Apache HTTP服务器与多个Tomcat应用服务器进行连接。Apache通常作为前端服务器,通过代理(如mod...

    jconsole监控 tomcat

    - **线程**:列出了当前运行的线程,可以查看每个线程的状态,查找死锁或CPU占用高的线程。 - **类**:展示了已加载的类数量和加载、卸载的类统计。 - **Garbage Collector**:监控垃圾收集器的工作状态,包括Minor ...

    优化提高tomcat性能.Tomcat参数调优

    - `connectionTimeout`: 定义了Tomcat等待请求结束的超时时间,过长可能导致资源占用,过短可能使正常请求被中断,一般设置为`20000`(20秒)。 - `keepAliveTimeout`: 设置了HTTP连接保持活动状态的超时时间,...

    tomcat9.zip

    通过集成第三方监控工具(如JMX、Prometheus、Grafana),可以实时监控服务器状态,包括CPU使用率、内存占用、线程池状态等,及时发现并解决问题。 7. **集群与负载均衡**:为了提高可用性和扩展性,Tomcat9支持...

    TOMCAT的启动.rar

    - 硬件资源:根据预期的负载和并发用户数量,配置合适的内存和CPU资源。 3. **Tomcat安装** 下载Tomcat的zip或tar.gz格式的压缩包,解压到指定目录,如在Windows上,通常选择`C:\Program Files`或自定义路径。...

    Tomcat优化相关问题.pdf

    Tomcat 优化相关问题 Tomcat 优化是指对 Apache Tomcat 服务器进行性能调整和优化,以提高其处理请求的速度和效率。下面是 Tomcat 优化相关问题的详细知识点: 一、JVM 参数调优 在 Tomcat 中,JVM 参数调优是...

    TOMCAT架构服务器优化指南

    3. 部署配置:合理分发负载,使用负载均衡器如Nginx或Apache,避免单点压力过大。优化应用部署,比如减少war文件大小,使用thin wars或微服务架构。 4. 数据库连接池:选择高效且稳定的数据库连接池,如HikariCP,...

    上传war文件大小超过Tomcat7最大文件限制报错

    - 需要注意的是,除了Tomcat内部的配置之外,可能还需要检查操作系统层面或其他中间件(如防火墙或负载均衡器)是否也有限制上传文件大小的设置。 #### 进一步分析 - **配置理解** `max-file-size`和`max-...

Global site tag (gtag.js) - Google Analytics