记一次线上服务器load高问题定位和解决
2018-02-23 15:05
1381 查看
1.top 查看load free空间还很大 应该不是GC导致的分析下面的进程,发现java进程占用了100%的CPU
2.查找java进程下面的哪个线程占用CPU高ps -ef|grep java 获取PID 4381
top -H -p 4381通过这个命令发现有一个线程占用了100%的CPU,所以导致load很高,一般占用100%CPU大部分原因是进程阻塞了。下一步跟踪一下这个线程 线程PID 4529
3.strace追踪线程(root用户才有权限 sudo su 切换)strace -p 4529
通过日志分析 可以发现有一个线程一直处于等待苏醒的状态,锁一直在同步,判断分析 某个线程出了问题4.通过jstack命名分析具体代码printf "%x\n" 4529 转换为16进制11b1
[root@xxxx spring-boot]# jstack 4381|grep llbl
"AchievementEvent-Consumer-Thread-2" #60 daemon prio=5 os_prio=0 tid=0x00007f689161c000 nid=0x11b1 runnable [0x00007f680326b000] java.lang.Thread.State: RUNNABLE at com.lmax.disruptor.BlockingWaitStrategy.waitFor(BlockingWaitStrategy.java:56) at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56) at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:124) at java.lang.Thread.run(Thread.java:748)
"AchievementEvent-Consumer-Thread-2" #64 daemon prio=5 os_prio=0 tid=0x00007f6891630000 nid=0x11b5 waiting on condition [0x00007f6803067000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000758dbc510> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at com.lmax.disruptor.BlockingWaitStrategy.waitFor(BlockingWaitStrategy.java:45) at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56) at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:124) at java.lang.Thread.run(Thread.java:748)
通过判断是一个消费者线程一直处于阻塞状态。最后成功找到原因,由于一个异常捕捉之后又重新抛出,导致某个消费者线程B直接挂了,而消费者C一直要等B处理完才能处理,所以C一直处于阻塞状态,并且不断轮询。
2.查找java进程下面的哪个线程占用CPU高ps -ef|grep java 获取PID 4381
top -H -p 4381通过这个命令发现有一个线程占用了100%的CPU,所以导致load很高,一般占用100%CPU大部分原因是进程阻塞了。下一步跟踪一下这个线程 线程PID 4529
3.strace追踪线程(root用户才有权限 sudo su 切换)strace -p 4529
通过日志分析 可以发现有一个线程一直处于等待苏醒的状态,锁一直在同步,判断分析 某个线程出了问题4.通过jstack命名分析具体代码printf "%x\n" 4529 转换为16进制11b1
[root@xxxx spring-boot]# jstack 4381|grep llbl
"AchievementEvent-Consumer-Thread-2" #60 daemon prio=5 os_prio=0 tid=0x00007f689161c000 nid=0x11b1 runnable [0x00007f680326b000] java.lang.Thread.State: RUNNABLE at com.lmax.disruptor.BlockingWaitStrategy.waitFor(BlockingWaitStrategy.java:56) at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56) at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:124) at java.lang.Thread.run(Thread.java:748)
"AchievementEvent-Consumer-Thread-2" #64 daemon prio=5 os_prio=0 tid=0x00007f6891630000 nid=0x11b5 waiting on condition [0x00007f6803067000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000758dbc510> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at com.lmax.disruptor.BlockingWaitStrategy.waitFor(BlockingWaitStrategy.java:45) at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56) at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:124) at java.lang.Thread.run(Thread.java:748)
通过判断是一个消费者线程一直处于阻塞状态。最后成功找到原因,由于一个异常捕捉之后又重新抛出,导致某个消费者线程B直接挂了,而消费者C一直要等B处理完才能处理,所以C一直处于阻塞状态,并且不断轮询。
相关文章推荐
- 一次线上故障问题定位和解决
- Pentaho BI 服务器 每天重启一次的问题解决
- 记录一次Elasticsearch线上部署后出现:org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []的问题解决
- 记一次网站无法访问解决过程,服务器80端口问题解决过程
- 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题
- 线上问题排查(1)——java服务器load飚高排查思路
- 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题
- 解决一次ESX上的数据库服务器的审计问题
- 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题
- 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题
- 以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good
- 定位问题解决问题-记录一次事件
- 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题
- (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错) 问题解决啦 O(∩_∩)O哈哈~
- 记Hadoop2.5.0线上mapreduce任务执行map任务划分的一次问题解决
- 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题
- MySQL通过添加索引解决线上数据库服务器压力大问题
- 记一次线上Groovy导致的OOM的问题解决过程
- 一次线上机器load负载过高报警问题排查及其后续处理
- 线上问题:如何定位解决CPU高占有率