tomcatcpu配置(Tomcat进程占用CPU过高的解决方法)
tomcatcpu配置
Tomcat进程占用CPU过高的解决方法目录
- 案例
- 上下文切换开销?
- 总结
CPU经常会成为系统性能的瓶颈,可能:
- 内存泄露导致频繁GC,进而引起CPU使用率过高
- 代码Bug创建了大量的线程,导致CPU频繁上下文切换
通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如
- JVM在峰值负载下的平均CPU利用率40%
- CPU使用率飙到80%就可认为不正常
JVM进程包含多个Java线程:
- 一些在等待工作
- 另一些则正在执行任务
最重要的是找到哪些线程在消耗CPU,通过线程栈定位到问题代码
如果没有找到个别线程的CPU使用率特别高,考虑是否线程上下文切换导致了CPU使用率过高。
程序模拟CPU使用率过高 - 在线程池中创建4096个线程
在Linux环境下启动程序:
java -Xss256k -jar demo-0.0.1-SNAPSHOT.jar
线程栈大小指定为256KB。对于测试程序来说,操作系统默认值8192KB过大,因为需要创建4096个线程。
使用top命令,我们看到Java进程的CPU使用率达到了961.6%,注意到进程ID是55790。
用更精细化的top命令查看这个Java进程中各线程使用CPU的情况:
#top -H -p 55790
可见,有个叫“scheduling-1”的线程占用了较多的CPU,达到了42.5%。因此下一步我们要找出这个线程在做什么事情。
为了找出线程在做什么,用jstack生成线程快照。
jstack输出较大,一般将其写入文件:
jstack 55790 > 55790.log
打开55790.log,定位到第4步中找到的名为 scheduling-1 的线程,其线程栈:
看到AbstractExecutorService#submit这个函数调用,说明它是Spring Boot启动的周期性任务线程,向线程池中提交任务,该线程消耗了大量CPU。
上下文切换开销?经历上述过程,往往已经可以定位到大量消耗CPU的线程及bug代码,比如死循环。但对于该案例:Java进程占用的CPU是961.6%, 而“scheduling-1”线程只占用了42.5%的CPU,那其它CPU被谁占用了?
第4步用top -H -p pid命令看到的线程列表中还有许多名为“pool-1-thread-x”的线程,它们单个的CPU使用率不高,但是似乎数量比较多。你可能已经猜到,这些就是线程池中干活的线程。那剩下的CPU是不是被这些线程消耗了呢?
还需要看jstack的输出结果,主要是看这些线程池中的线程是不是真的在干活,还是在“休息”呢?
发现这些“pool-1-thread-x”线程基本都处WAITING状态。
- Blocking指的是一个线程因为等待临界区的锁(Lock或者synchronized关键字)而被阻塞的状态,请你注意的是处于这个状态的线程还没有拿到锁
- Waiting指的是一个线程拿到了锁,但需等待其他线程执行某些操作。比如调用了Object.wait、Thread.join或LockSupport.park方法时,进入Waiting状态。前提是这个线程已经拿到锁了,并且在进入Waiting状态前,os层面会自动释放锁,当等待条件满足,外部调用了Object.notify或者LockSupport.unpark方法,线程会重新竞争锁,成功获得锁后才能进入到Runnable状态继续执行。
回到我们的“pool-1-thread-x”线程,这些线程都处在“Waiting”状态,从线程栈我们看到,这些线程“等待”在getTask方法调用上,线程尝试从线程池的队列中取任务,但是队列为空,所以通过LockSupport.park调用进到了“Waiting”状态。那“pool-1-thread-x”线程有多少个呢?通过下面这个命令来统计一下,结果是4096,正好跟线程池中的线程数相等。
grep -o 'pool-2-thread' 55790.log | wc -l
剩下CPU到底被谁消耗了?
应该怀疑CPU的上下文切换开销了,因为我们看到Java进程中的线程数比较多。
下面通过vmstat命令来查看一下操作系统层面的线程上下文切换活动:
cs那一栏表示线程上下文切换次数,in表示CPU中断次数,我们发现这两个数字非常高,基本证实了我们的猜测,线程上下文切切换消耗了大量CPU。
那具体是哪个进程导致的呢?
停止Spring Boot程序,再次运行vmstat命令,会看到in和cs都大幅下降,这就证实引起线程上下文切换开销的Java进程正是55790。
遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。
其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。
到此这篇关于Tomcat进程占用CPU过高的解决方法的文章就介绍到这了,更多相关Tomcat进程占用CPU过高内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- tomcat需要修改哪几个端口参数(详解tomcat各个端口的作用)
- 用idea设置tomcat(Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法)
- idea项目中tomcat的配置(tomcat部署项目以及与IDEA集成的实现)
- 如何认识服务器(关于Nginx、Apache、Tomcat三个WEB服务器的区别和认知)
- tomcat环境配置教程(Tomcat服务器的安装配置图文教程推荐)
- tomcat运行中找不到路径(Tomcat将配置文件放在外部的解决方法)
- idea如何搭建tomcat(IDEA2020.1.2创建web项目配置Tomcat的详细教程)
- docker容器如何更改tomcat端口(Docker方式启动tomcat访问首页出现404错误)
- tomcat反向代理单(阿里云安全组规则配置及Tomcat外网访问)
- 如何让tomcat启动更快(快速解决Tomcat启动慢的问题,超简单)
- 如何使用docker启动tomcat(简述Docker安装Tomcat镜像并部署web项目)
- tomcat 多线程并发cpu(Tomcat使用线程池处理远程并发请求的方法)
- idea中tomcat快速部署(IDEA编辑器整合Apache Tomcat的详细教程)
- tomcat配置jmx监控(Tomcat配置JNDI数据源的三种方式)
- tomcatweb 管理(Tomcat源码解析之Web请求与处理)
- apache连接tomcat配置(Apache结合Tomcat实现动静分离的方法)
- 新闻周刊 青岛网红 赵厂长 编段子一箩筐输出快乐,陪父亲十二载勇斗病魔(新闻周刊青岛网红)
- 44岁夏雨演谋女郎爸,大其24岁却看不出,互动不怕袁泉吃醋(44岁夏雨演谋女郎爸)
- 全椒人,你还记得吗 那年,那人,那网,那些我们的青春记忆(全椒人你还记得吗)
- 全椒人在苏州10周年联谊会在苏州举办(全椒人在苏州10周年联谊会在苏州举办)
- 这个全椒人被通报表彰,看看你认识吗(这个全椒人被通报表彰)
- 全椒人,38年集体回忆 1980-2018 ,看完不要哭(全椒人38年集体回忆)
热门推荐
- vue3函数详解(手把手教你用vue3开发一个打砖块小游戏)
- phpStudy启动失败时的解决方法 提示缺vc9运行库(phpStudy启动失败时的解决方法 提示缺vc9运行库)
- mysql慢日志查询会输出插入语句吗(MySQL三种日志有啥用?如何提高MySQL并发度?)
- sql server案例(SQL Server作业报错特殊案例分析)
- js原型链的理解(浅谈JS的原型和原型链)
- 关闭ssl证书验证模块(开启OCSP提升https证书验证效率解决Let’s Encrypt SSL证书访问慢的问题)
- docker只有localhost可用(浅谈Docker如何自定义host文件)
- python线程安全队列(Python 限制线程的最大数量的方法Semaphore)
- mysql mvcc 隔离级别(详解MySQL事务的隔离级别与MVCC)
- html5移动app开发实战(html5启动原生APP总结)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9