linux: CentOS release 6.7 (Final)
jdk: openjdk version "1.8.0_91" (build 1.8.0_91-b14)
OK, 到此,准备工作做好了。
在方法中新建了一个线程池,并且在方法中没有关闭。这样会导致每个请求都会创建一个线程池,然后创建几个线程,运行完了后,线程就会处于等待状态,GC回收不了。这是一个很严重的BUG!!!
接下来压测,并使用jprofiler监测JVM运行状况, 拿到结果。
等待中心的线程达到了15679个,其它状态的线程都不够其零头。
其中有一个线程一直在耗CPU。另外说下,测试服务器是一个2核的cpu,但是只有一个核是跑满的, 这说cpu的利用率不均匀(有些cpu很忙,有些cpu并不是),这表明只有一条线程在努力的跑。
如果是多核cpu出现利用率不均匀的情况,那说明大多数计算工作都是由一小组线程完成的,应用程序并没有利用其它的处理器。通常有这几种原因:I/O密集、外部限制、锁竟争。
回到主话题,在docker运行的linux中使用命令找到jvm的pid,然后使用top -H -p {pid}找出耗cpu的线程。或者使用ps -mp {pid} -o THREAD,tid,time|sort -k1 -nr|head -15命令也可以。
打到jvm的pid为6
top -H -p 6
ps -mp 6 -o THREAD,tid,time|sort -k1 -nr|head -15
发现在耗cpu的线程id为25.
先使用jstack把线程的堆栈信息统计到文件中
jstack 6 >data.txt
运行命令将10进制转换为16进制
printf "0x%x\n" 25
输出 0x19
在data.txt中找到nid=0x19的线程。
也可以使用如下命令
jstack 6 | grep nid=0x19 -A 30
这行命令会找到nid=0x19的行,并将其下30输出打印出来
发现是metrics监控的线程,根据上面的运行栈去找
发现metrics有一个定时任务,是检查线程状态的,一万五千多个线程,六个状态,就是循环将近十万次 隔60秒循环一次,确实是很耗cpu了。
问题定位到,找到原因,将线程池从方法中移出来,放到类变量中, 初步解决。
首页竟然没用缓存,这是** !
后面还要对首页进行优化,使用缓存和管理缓存,不从库里取,不用线程池。
java-jvm-cpu (cpu)高问题排查
如何定位占用cpu过高的线程
背景公司新迭代了一个版本, 但是上线没多久,cpu就跑满,导致所有的请求都响应很慢, 大多数请求都超时,甚至有一次OOM。出现这样的情况,以前的负责人就叫运维重启。现在这个项目交给我来负责, 我需要把导致这个现象的原因找出来,并解决掉。前负责人说怀疑是首页接口的问题,看了代码,还真是。吐槽公司使用docker运行spring boot项目, docker运行的系统和jdk是非常
OtseaMaster为Eureka注册中心
OtseaUser为dubbo的provider 模块的spring服务运行在8101端口,dubbo provider运行在20880端口
OtseaContent为dubbo的consumer
使用zookeeper做为dubbo的协调工具
使用机器为window
cpu:i7-6500u
内存:8g
cpu表现
三个模块跑起来后cpu开始跑满打开任务管理器发现dubbo的两个模块和zookeeper的进程占用了大部分的cpu,同时两个模块占用的
文章目录前言一、cpu占用高排查问题二、解决办法使用AtomicLong 统计线程是否完成,再执行executor.submit()提交新的任务导队列中。三、多线程关闭与令牌限流:
情景:1000万表数据导入内存数据库,按分页大小10000查询,多线程,15条线程跑。
使用了ExecutorService executor = Executors.newFixedThreadPool(15)
本地跑了一段时间后,发现电脑CPU逐渐升高,最后CPU占用100%卡死,内存使用也高达80%
一、cpu
生产环境的程序
cpu占用率达到了100%,可以通过下面的命令进行查看堆栈信息的操作,从而定位问题代码的具体位置,从根本解决问题。
jstack -l 进程id >> jstackLog.out
* (1)判断核心
线程数是否已
满,核心
线程数大小和corePoolSize参数有关,未
满则创建
线程执行任务
* (2)若核心
线程池已
满,判断队列是否
满,队列是否
满和workQueue参数有关,若未
满则加入队列中
* (3)若队列已
满,判断
线程池是否已
满,
线程池是否已
满和maximumPoolSize参数有关,若未
满创建
线程执行任务
* (4)若
线程池已
满,则采用拒绝策略处理无法执执行的任务,拒绝策略和handler参数有关
吞吐量:系统在单位时间内处理请du求的数量。只不过是一个很宽泛的术zhi语,大家经常指的吞吐量dao的单位可能是:TPS/QPS、页面数/秒、人数/天、处理业务数/小时等等。几个相关的概念:TPS、QPS、RPS
TPS:Transactions Per Second(每秒事务处理数),指服务器每秒处理的事务次数。一般用于评估数据库、交易系统的基准性能。
QPS:Queries Per Second(...
Spring bean的生命周期能不能结合源码回答一下这个问题
Spring容器当中包含了哪些常用组件(至少说5个),作用是什么,场景是什么;
Spring自动注入的原理是什么?能不能从源码来说明一下这个问题;
我们常常说的自动注入,到底怎么注入的?有什么坑?
Spring源码当中如何来搞定循环依赖的?Spring支持循环依赖?
如何来二次扩展Spring,比如自定义一个实现自动注入的注解;
mybatis源码当中利用了Spirng的那些扩展?mybatis扩展Sp
多个线程的程序CPU跑满查原因
今天突然在讨论区看到这个帖子,想到了一个月前我在某东金融研发面试时被问到了同样的问题,我的回答是top一下,看服务器进程,然后就没有然后。。。面试官gg就把我挂了。。。现在总结一下:
只要是跑着的线程,那么都是占用CPU的线程,如果一个进程有多个线程在同时运行,那么cpu占满是不可能的,每个线程本来就是会被操作系统分配时间片的。举个栗子:如果3个线程同时运行,...
failed to launch process in the docker container on mac m2, and return message “could not launch pro
mac m2 编译dubbo3.1.x版本报Missing:com.google.protobuf:protoc:exe:osx-aarch_64
Idea remote debug