谈谈Tomcat占用cpu高的问题
目录
问题现场
测试环境tomcat进程占用CPU一直持续99%,但是通过jstack查看log,也没有任何线程死锁的情况。
此时通过$catalina_home/bin/shutdown.sh脚本无法正常停止tomcat。
这是什么原因?
线程死锁 vs 线程死循环
验证线程死锁不会导致CPU持续高负载
// 验证线程死锁是否会导致CPU占用率一直居高不下
public class LockTest {
private Object alock = new Object(); // a锁
private Object block = new Object(); // b锁
public static void main(String[] args) {
new LockTest().start();
}
private void start() {
new Thread(new ThreadA()).start();
new Thread(new ThreadB()).start();
}
private void sleepOfSeconds(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 在线程A中先获取a锁,再获取b锁
class ThreadA implements Runnable {
private String name = "ThreadA";
@Override
public void run() {
synchronized (alock) {
System.out.println(name + " get alock");
sleepOfSeconds(50);
}
System.out.println(name + " release alock");
System.out.println(name + " waiting block");
synchronized (block) {
System.out.println(name + " get block");
}
System.out.println(name + " release block");
}
}
// 在线程B中先获取b锁,再获取a锁
class ThreadB implements Runnable {
private String name = "ThreadB";
@Override
public void run() {
synchronized (block) {
System.out.println(name + " get block");
sleepOfSeconds(10);
}
System.out.println(name + " release block");
System.out.println(name + " waiting alock");
synchronized (alock) {
System.out.println(name + " get alock");
}
System.out.println(name + " release alock");
}
}
}
线程进入死锁状态时,不会导致CPU持续高负载,实际上当线程进入死锁之后是等待获取对象所被执行,此时CPU是空闲的。
导致CPU负载持续高的原因是线程进入了死循环,导致CPU持续在工作,此时线程的状态应该是Runnable,而不是Blocked。
排查Java进程导致CPU持续高的方法
整体思路:
1.先找到占用CPU比较高的进程ID
2.再找出该进程下CPU占用比较高的线程ID,并输出该线程ID的十六进制值
3.使用jstack命令查看并过滤出第2步中得到的线程ID对应堆栈信息,从而确定CPU占用高的地方在哪里
在Linux环境下,通过如下步骤可以实现对Java进程CPU持续高负载的问题排查:
- 通过
jps命令找到Java进程ID,并使用top命令确定CPU占用高的进程是否为jps命令找到的Java进程。 - 通过
ps -mp pid -o THREAD,tid,time命令查看进程的线程列表,找到CPU占用最高的线程ID,并使用printf "%x\n" tid命令输出线程ID的16进制格式:tid_hex 。 - 通过
jstack pid |grep tid_hex -A 30查看线程堆栈信息,找到处于Runnable状态的线程中执行的代码片段,就可以分析出对应导致线程死循环的原因了。
可以将上述命令整理成一个脚本工具,用于临时排查CPU高的问题,详见:https://raw.githubusercontent.com/nuccch/iToolBox/master/shell/show_java_process_thread_stack.sh 。
Tomcat的CPU占用高的原因总结
- 线程死锁和线程死循环不是一个概念,千万不要弄错。
- 通常来讲,对于部署到Tomcat中的应用程序,排除程序代码进入死循环的原因之外,会导致Tomcat进程CPU持续高负载的可能因素是存在大量的TCP连接请求(并发很大)。
- 由于应用程序出现堆内存空间不够用导致频繁GC,也会导致CPU使用率高。
- 如果应用日志输出非常频繁,也会导致CPU使用率持续高。
【参考】
https://www.jianshu.com/p/3160ba8e150d 记一次tomcat cpu占用率过高的问题排查
http://www.blogjava.net/hankchen/archive/2012/05/09/377735.html 线上应用故障排查之一:高CPU占用
谈谈Tomcat占用cpu高的问题的更多相关文章
- 查看JAVA占用CPU高的线程日志
# . 查看主进程占用cpu高 top # java # . 按照线程占用cpu由高到低进行排查: -o THREAD,tid, # USER %CPU PRI SCNT WCHAN USER SYS ...
- tomcat占用cpu过高解决办法
在工作中经常遇到tomcat占用cpu居高不下,针对这种情况有以下处理办法进行排查. jps --> 查看java的进程 top -Hp pid --> 根据jps得到的进程号(pid), ...
- 查看tomcat项目中,具体占用cpu高的线程。
1.查看主进程占用cpu高: 此处主进程:27823 ~]# top top - :0: up days, :, 3 users, load average: 13.12, 13.31, 13.23 ...
- 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法,有人在暴力破解
关于csrss.exe和winlogon.exe进程多.占用CPU高的解决办法 最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要好半天才反映过来,看到任务管理器有多个 ...
- TortoiseSVN status cache占用CPU高
进程占用CPU高 每次从SVN上更新资源时,电脑都会卡死,直到资源更新完.当要Commit资源时,SVN也会卡死资源管理器,如下图所示: 解决占用CPU高的问题 1.禁用图标缓存 2.排除路径和包含路 ...
- 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法
原地址 http://blog.sina.com.cn/s/blog_912e77480101nuif.html 最近VPS的CPU一直处在100%左右,后台管理上去经常打不开,后来发现上远程都要 ...
- linux c++应用程序内存高或者占用CPU高的解决方案_20161213
对于绝大多数实时程序来说,实时处理相关程序中的循环问题所带来的对机器的损耗和自身的处理速度的平衡,以及与其他程序的交互以及对其他功能的影响难免会成为程序设计中最大的障碍同时也是最大的突破点. 在所有这 ...
- 利用jstack命令定位占用cpu高的java线程及具体错误代码信息
1.先用top查询某进程的线程CPU占用情况,定位到cpu占用高的进程pid 2.根据pid定位具体的线程top -p PID -H ,找出占用cpu最大的pid,此处占用cpu比较平均,我们随便选择 ...
- 记一次mogodb占用cpu高问题
公司服务器上安装了contly,是一个开源的node.js项目,用于统计手机app使用情况,后端数据储存使用的mongodb,使用的时候经常发现mongodb占用cpu非常高,打到了210%的爆表值 ...
- tomcat占用cpu比较多
在Linux中当Tomcat启动后,我们只是去查看应用是否能够正常访问来判断Tomcat启动是否正常.一般情况下这样看是没有问题的,但是有时候我们会发现当Tomcat使用了一段时间后,开始出现CPU或 ...
随机推荐
- [转帖]煮饺子与 docker、kubernetes 之间的关系
前言:云原生的概念最近非常火爆,企业落地云原生的愿望也越发强烈.看过很多关于云原生的文章,要么云山雾罩,要么曲高和寡. 所以笔者就有了写<大话云原生>系列文章的想法,期望用最通俗.简单 ...
- [转帖]一本正经的八卦一下CPU的自主可控
https://zhuanlan.zhihu.com/p/36391482 (2018年的4月16日,美国商务部发布对中兴通讯出口权限禁令,禁止美国企业向其出售零部件,史称"中兴禁运事件&q ...
- ST 表并查集小记🐤
ST 表维护并查集,在 $O(n \log n)$ 时间内处理 $[l_1,r_1]$ 内每个点依次向 $[l_2,r_2]$ 中的点连边(共连 $r_1-l_1+1$ 条边) 首先变成对于 $l_1 ...
- vue3关于.sync的用法
场景描述 我们都知道,子组件是不能够去修改父组件传递过来的数据. 因为如果子组件去修改父组件件传递过来的数据. 会导致数据的应用流向变得难以理解. 但是有些时候,我们需要当子组件的数据变化后,父组件的 ...
- Fabric网络升级(一)
原文来自这里. 本章节主要介绍如何从之前的版本或其他长期支持版本升级至最新版. 从2.1升级到2.2 Fabric v2.1和v2.2都是稳定版,以bug修复和其它形式的代码加固位置.因此,升级不需要 ...
- 解锁数据潜力:信息抽取、数据增强与UIE的完美融合
解锁数据潜力:信息抽取.数据增强与UIE的完美融合 1.信息抽取(Information Extraction) 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务,其目的在于从一段自然文 ...
- parser.add_argument()用法——命令行选项、参数和子命令解析器
argparse是一个Python模块:命令行选项.参数和子命令解析器.通过使用这种方法,可以在使用 1.argparse简介: argparse 模块是 Python 内置的一个用于命令项选项与参数 ...
- 7.3 C/C++ 实现顺序栈
顺序栈是一种基于数组实现的栈结构,它的数据元素存储在一段连续的内存空间中.在顺序栈中,栈顶元素的下标是固定的,而栈底元素的下标则随着入栈和出栈操作的进行而变化.通常,我们把栈底位置设置在数组空间的起始 ...
- STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...
- 从嘉手札<2023-11-18>
随便补一个~ 1.我也不是不快乐,我其实挺快乐的,和朋友出去玩,看电影,刷搞笑视频,我都能表现的很好,但这些都不是真正让我感受到快乐的东西,它就像膝跳反应一样,碰我一下我就会笑,但笑完就结束了.甚至在 ...