`
wb284551926
  • 浏览: 551276 次
文章分类
社区版块
存档分类
最新评论

记一次线上Java程序导致服务器CPU占用率过高的问题排除过程(转载)

 
阅读更多

原文地址:传送门

 

1、故障现象

客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高。

2、CPU占用过高问题定位

2.1、定位问题进程

使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8%


[ylp@ylp-web-01 ~]$ top
top - 14:51:10 up 233 days, 11:40,  7 users,  load average: 6.85, 5.62, 3.97
Tasks: 192 total,   2 running, 190 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.3 us,  0.3 sy,  0.0 ni,  2.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16268652 total,  5114392 free,  6907028 used,  4247232 buff/cache
KiB Swap:  4063228 total,  3989708 free,    73520 used.  8751512 avail Mem 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                               

14063 ylp       20   0 9260488 4.627g  11976 S 776.1 29.8 117:41.66 java    

2.2、定位问题线程

使用ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况,发现该进程的多个线程占用率很高


[ylp@ylp-web-01 ~]$ ps -mp 14063 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
ylp       361   -    - -         -      -     - 02:05:58
ylp       0.0  19    - futex_    -      - 14063 00:00:00
ylp       0.0  19    - poll_s    -      - 14064 00:00:00
ylp      44.5  19    - -         -      - 14065 00:15:30
ylp      44.5  19    - -         -      - 14066 00:15:30
ylp      44.4  19    - -         -      - 14067 00:15:29
ylp      44.5  19    - -         -      - 14068 00:15:30
ylp      44.5  19    - -         -      - 14069 00:15:30
ylp      44.5  19    - -         -      - 14070 00:15:30
ylp      44.5  19    - -         -      - 14071 00:15:30
ylp      44.6  19    - -         -      - 14072 00:15:32
ylp       2.2  19    - futex_    -      - 14073 00:00:46
ylp       0.0  19    - futex_    -      - 14074 00:00:00
ylp       0.0  19    - futex_    -      - 14075 00:00:00
ylp       0.0  19    - futex_    -      - 14076 00:00:00
ylp       0.7  19    - futex_    -      - 14077 00:00:15

从输出信息可以看出,14065~14072之间的线程CPU占用率都很高

2.3、查看问题线程堆栈

挑选TID为14065的线程,查看该线程的堆栈情况,先将线程id转为16进制,使用printf "%x\n" tid命令进行转换


[ylp@ylp-web-01 ~]$ printf "%x\n" 14065
36f1

再使用jstack命令打印线程堆栈信息,命令格式:jstack pid |grep tid -A 30


[ylp@ylp-web-01 ~]$ jstack 14063 |grep 36f1 -A 30
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fa35001e800 nid=0x36f1 runnable 
"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fa350020800 nid=0x36f2 runnable 
"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fa350022800 nid=0x36f3 runnable 
"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fa350024000 nid=0x36f4 runnable 
"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007fa350026000 nid=0x36f5 runnable 
"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007fa350028000 nid=0x36f6 runnable 
"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007fa350029800 nid=0x36f7 runnable 
"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007fa35002b800 nid=0x36f8 runnable 
"VM Periodic Task Thread" prio=10 tid=0x00007fa3500a8800 nid=0x3700 waiting on condition 

JNI global references: 392

从输出信息可以看出,此线程是JVM的gc线程。此时可以基本确定是内存不足或内存泄露导致gc线程持续运行,导致CPU占用过高。
所以接下来我们要找的内存方面的问题

3、内存问题定位

3.1、使用jstat -gcutil命令查看进程的内存情况

[ylp@ylp-web-01 ~]$ jstat -gcutil 14063 2000 10

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00 100.00  99.99  26.31     42   21.917   218 1484.830 1506.747
  0.00   0.00 100.00  99.99  26.31     42   21.917   218 1484.830 1506.747
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   220 1505.439 1527.355
  0.00   0.00 100.00  99.99  26.31     42   21.917   220 1505.439 1527.355
  0.00   0.00 100.00  99.99  26.31     42   21.917   220 1505.439 1527.355

从输出信息可以看出,Eden区内存占用100%,Old区内存占用99.99%,Full GC的次数高达220次,并且频繁Full GC,Full GC的持续时间也特别长,平均每次Full GC耗时6.8秒(1505.439/220)。根据这些信息,基本可以确定是程序代码上出现了问题,可能存在不合理创建对象的地方

3.2、分析堆栈

使用jstack命令查看进程的堆栈情况


[ylp@ylp-web-01 ~]$ jstack 14063 >>jstack.out

把jstack.out文件从服务器拿到本地后,用编辑器查找带有项目目录并且线程状态是RUNABLE的相关信息,从图中可以看出ActivityUtil.java类的447行正在使用HashMap.put()方法

 
Paste_Image.png
3.3、代码定位

打开项目工程,找到ActivityUtil类的477行,代码如下:

 
Paste_Image.png

找到相关同事了解后,这段代码会从数据库中获取配置,并根据数据库中remain的值进行循环,在循环中会一直对HashMap进行put操作。

查询数据库中的配置,发现remain的数量巨大

 
Paste_Image.png

至此,问题定位完毕。

 

原文地址:传送门

分享到:
评论
1 楼 neusoft_jerry 2019-03-29  
好东西,mark下!感谢楼主!

相关推荐

    ideacpu占用率过高[造成cpu占用率过高的原因].pdf

    【CPU占用率过高】是许多计算机用户经常遇到的问题,尤其在使用IDE(集成开发环境)如Idea时,CPU资源的消耗可能导致系统运行缓慢甚至变得不可用。以下是一些可能导致CPU占用率过高的原因及其解决方案: 1. **防...

    【原创】java程序cpu占用过高问题分析

    在Java编程中,CPU占用过高是一个常见的性能问题,可能由多种因素引起,包括但不限于不当的算法选择、线程过多、循环优化不足、垃圾回收(GC)问题、内存泄漏或资源竞争等。这篇原创博客“【原创】java程序cpu占用过...

    用java获取CPU占用率

    使用Java获取CPU占用率的过程不仅考验了程序员对Java语言的掌握程度,更需要深入理解操作系统层面的原理和机制。通过上述步骤,我们可以有效地监控和分析系统性能,这对于优化应用性能、及时发现和解决系统瓶颈具有...

    CPU占用率高的九种可能

    例如,某些应用程序会在用户不知情的情况下启动多个进程,这些进程可能会持续占用CPU资源。清理不必要的后台进程可以帮助提高系统性能。 #### 九、多媒体播放器资源占用 使用多媒体播放器播放视频或音频文件时,...

    线上应用故障排查之一:高CPU占用

    本篇文章将探讨一个常见的问题——"线上应用故障排查之一:高CPU占用"。高CPU占用可能导致系统响应变慢,影响用户体验,甚至可能导致服务崩溃。解决这个问题需要深入理解应用程序的运行机制以及系统资源的管理。 ...

    Delphi CPU占用率

    "Delphi CPU占用率"这个话题正是关注这样一个关键指标:一个由Delphi编写的程序在运行时如何影响系统的中央处理器(CPU)资源。Delphi是一种强大的对象 Pascal 编程语言和集成开发环境(IDE),用于构建高性能的...

    解决过程Cpu占用率

    本案例展示了如何一步步诊断并解决服务器CPU占用率过高的问题。通过初步排除操作系统级问题,锁定到应用层面,再通过具体的性能监控工具和数据分析找到问题所在,并最终通过索引优化、定期维护计划等方式解决了问题...

    IIS应用程序池CPU占用率分析专家

    软件启动后, 将显示两个窗口,一个是,当前看到的窗口,IIS中所有应用程序池都显示出来了(包括未启动应用程序池),另一个是服务器活动应用程序池 CPU 占用率窗口。 首先在活动池中找出CPU占用率非常高的池,这...

    防止CPU占用率过高的软件

    标题中的“防止CPU占用率过高的软件”是指一类专门用于监控和管理计算机系统中处理器资源使用的工具。这类软件的主要目标是确保CPU的利用率保持在合理水平,以避免因单个或多个进程过度消耗CPU资源而导致的系统性能...

    程序控制cpu占用率

    在计算机编程领域,控制CPU占用率是一项常见的需求,特别是在资源管理、性能测试或者优化程序运行效率时。本文将深入探讨如何通过程序来控制CPU的占用率,并以标题中提到的"test_line_50%"为例,说明如何编写一个...

    AI导致CPU占用过高.rar

    AI导致CPU占用过高.rar 具体可以参考: https://geo-ai.blog.csdn.net/article/details/124564268?spm=1001.2014.3001.5502

    Java实现对系统CPU、内存占用率的控制

    背景:由于使用的业主的云资源,由于使用率低,会不持续的缩减服务器配置。...问题:怎样通过Java程序实现CPU、内存占用超过50%? 方案:详见我的博客:https://blog.csdn.net/taotao_guiwang?spm=1010.2135.3001.5343

    易语言取进程CPU占用率源码

    在IT领域,了解一个程序或进程的CPU占用率是非常重要的,这可以帮助我们分析系统的性能瓶颈,优化资源分配,以及诊断可能存在的问题。易语言是一种中国本土的编程语言,旨在简化编程过程,使得初学者也能快速上手。...

    电脑CPU占用率过高的分析.pdf

    此外,还有其他一些原因可能导致 CPU 占用率过高,例如 CPU 风扇的问题,风扇老化或灰尘过多都容易导致 CPU 温度过高 CPU 占用率过高。 CPU 占用率过高是电脑运行缓慢的常见原因之一。了解这些原因,可以帮助我们更...

    CPU占用率测试工具

    2. 分析:通过观察哪个进程占用CPU最多,可以定位导致系统性能下降的原因。 3. 调优:针对高CPU占用的进程,可以尝试优化代码,减少不必要的计算,或者调整系统设置以降低其对CPU的依赖。 4. 报告:记录一段时间内的...

    ideacpu占用率过高[造成cpu占用率过高的原因].docx

    【CPU占用率过高】是许多计算机用户经常遇到的问题,尤其对于使用IDE(集成开发环境)如Idea的程序员来说,高CPU使用率可能导致系统运行缓慢,影响编程效率。以下是关于CPU占用率过高的一些常见原因及解决方法: 1....

    linux服务器找到占用cpu高的java代码的办法

    在Linux服务器环境中,Java应用程序可能由于各种原因导致CPU使用率过高,这可能会影响系统的整体性能。要找到占用CPU高的Java代码,我们可以采取一系列步骤来诊断和优化问题。以下是一种详细的方法: 1. **查看系统...

    CPU性能占用率记录工具VB

    标题中的“CPU性能占用率记录工具VB”指的是一个使用Visual Basic (VB) 开发的应用程序,专门用于监控和记录服务器(SERVERPC)的中央处理器(CPU)使用情况。这个工具能够持续跟踪CPU的负载,帮助管理员了解服务器...

Global site tag (gtag.js) - Google Analytics