2011-09-06

线上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";

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(); }

}}

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文件:

出现 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并不是线程安全的 非单例,引起了问题。更正代码后,几个月没有发现问题

转载于:https://www.cnblogs.com/shenguanpu/archive/2011/12/23/2299759.html

tomcat cpu占用过高,系统负载高问题跟踪相关推荐

  1. linux大io引起cpu使用率偏高,系统负载高, 但CPU使用率和IO都非常低

    ps aux USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root         1  0.0  ...

  2. centos7 gam_server进程导致CPU使用率100%,系统负载很高

    现象 gam_server的进程占用吃满cpu,导致系统负载很高,top命令卡死 作用 gam_server是gamin的二进制文件,作用是文件交替监控 方案 找到最高的进程PID top是Linux ...

  3. linux 系统负载高 如何检查

    1:load Average 1.1:什么是Load?什么是Load Average? Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measur ...

  4. linux 负载高 标准,linux 系统负载高 如何检查

    1:load Average 1.1:什么是Load?什么是Load Average? Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measur ...

  5. 转:[kipmi0]进程导致系统负载高

    最近一个用户这边服务器出现服务器负载很高的情况,原本正常是0.3~0.5左右  不正常的时候会达到3,重启机器就正常,开始以为是程序问题,后来在观察的时候把程序给杀掉了 然后重启,结果负载还是很高,于 ...

  6. linux tomcat cpu占用高,排查tomcat服务器CPU使用率过高

    tomcat要运行依赖于JDK,tomcat服务器的CPU使用率过高,大多都是由于部署的web程序的问题. 一.征象形貌 在一次线上环境,前台接见页面的速率越来越慢,从浏览器F12中看到发出的请求都是 ...

  7. 14.Linux rpm,brew软件安装包命令,zsh和bash,内置命令和外部命令,ps命令,top命令解析,swp,为什么cpu利用率很低,负载却很高?

    解释一下rpm, opt,opt-get, brew,brewhome rpm,apt,apt-get,brew,和homebrew都是与软件包管理有关的术语.它们分别用于不同的操作系统. rpm是一 ...

  8. Java 分析 程序CPU 占用高的原因

    Java 分析 程序CPU 占用高的原因 背景:最近突然发现线上测程序长时间CPU 占用过高.内存确没有什么消耗.这种情况下可以排除死锁(一般死锁之后,如果不是自旋锁的话,CPU 占用都不会很高),也 ...

  9. linux系统中的基础监控(硬盘,内存,系统负载,CPU,网络等)

    Linux系统常见日常监控 系统信息 查看 CentOS 版本号:cat /etc/redhat-release 综合监控 nmon 系统负载 命令:w(判断整体瓶颈) 12:04:52 up 16 ...

最新文章

  1. Github 年度最受欢迎的 TOP30 Python 项目,超值
  2. oracle00214,oracle添加控制文件,ORA-00214: 错误
  3. 面试官问我什么是扩展自适应机制
  4. 《Javascript高级程序设计》读书笔记之继承
  5. IT人员健康信号之颈椎病自疗
  6. Java面试题库,java核心技术第十版下载
  7. Linux系统编程25:基础IO之亲自实现一个动静态库
  8. 在c语言中定义共用型数据类型的关键字是,C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键...
  9. mysql query cache 查询缓存
  10. 刷题笔记(1) 一个序列是否为二叉搜索树的遍历结果
  11. 入门:Mac终端常用知识
  12. pycharm主题设置
  13. 个人博客网页设计作业
  14. 前奈飞 CTO 两年吃回扣上百万,将面临数十年监禁
  15. Export encrypted key
  16. linux发挥显卡性能,Sandy Bridge集成显卡总算支持Linux 开源性能实测
  17. npoi 将html导出word,使用NPOI将数据导出为word格式里的table
  18. 怎样录制gif动态图
  19. 数学速算法_小学数学必考应用题解题思路及方法大汇总(附各年级练习题及答案)...
  20. 原生js做无限弹窗(娱乐)

热门文章

  1. 浅析网站如何快速提升收录量?
  2. php 使用css乱码,分享CSS字符编码引起乱码快速解决的方法
  3. java 三个参数的运算符,java – 三个参数运算符:局部变量可能尚未初始化
  4. 拳皇重生服务器维护,《拳皇97 OL》3月24日更新维护公告
  5. python数据分析年薪百万_如何成为一个年薪 50 万以上的数据分析师?
  6. 格式化时间中HH:mm:ss与hh:mm:ss的区别
  7. 开发日记-20190910 Makefile相关(一)
  8. 关于Android加载的优化
  9. python 读取二进制文件 转为16进制输出
  10. 梯度下降法——得到的结果可能是局部最优值,如果凸函数则可保证梯度下降得到的是全局最优值...