21
回答
我的cpu这经常出现99.9%,一旦出现就下不来了,大家帮我出出主意,求助
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

先说一下我的线上环境(就是在线上才发现问题):

我的server是redhat linux  enterprseAS release 4,

  4个4核志强cpu,每个都是Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz,内存4G

我的jdk :java -version
java version "1.6.0_19"
tomcat 6-0-14 ,struts2, spring2.5,hibernate3.2

问题如下:

我启动的时候,一切都比较正常,可能跑很多天都问题不大,从监控来看,偶尔也有cpu使用很高的情况,就是瞬间(单核)99.9%,然后又下来,不过再过一段时间,cpu还是会忽然间逐渐升高,到99.9%不再下降,但是不影响使用,内存也正常,我的cpu是4个,每个cpu是4核,现在jvm单磕一个核,尽管系统能正常运行,但是我想把问题解决,当然绝大部分的性能问题基本属于程序的问题,我的情况就是程序太多,排查工作量太大,我想通过服务器监控分析的办法直接切入病灶,希望大家能帮我出出主意。

CPU
举报
王树兵
发帖于8年前 21回/1K+阅
共有21个答案 最后回答: 4年前

以前用过一个性能监控软件 Actional可以觖问题, 它通过在app server 上面部署一些agent ,可以监控到每一个调用所用的时间,以查找瓶颈。 

不过比较贵,可以找个试用版来暂时搞一下。 

开源的产品也有,不过没有认真研究过 。 

查看top,我的内存吃得也非常厉害
top - 11:59:06 up 438 days, 23:56,  4 users,  load average: 1.04, 1.04, 1.00
Tasks: 105 total,   2 running, 103 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.1% us, 11.4% sy,  0.0% ni, 73.5% id,  0.1% wa,  0.0% hi,  0.0% si
Mem:   4148856k total,  3624380k used,   524476k free,    46408k buffers
Swap:  2097144k total,      144k used,  2097000k free,  2381472k cached

  PID   USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                       
  XXX   XXXXX       16   0 1476m 887m  43m S 99.9 21.9   3315:20 java

查看log,发现日期已经4G多,我清空后,内存一下子释放了1.2G

top - 12:17:40 up 439 days, 14 min,  5 users,  load average: 1.01, 1.18, 1.16
Tasks: 117 total,   1 running, 115 sleeping,   0 stopped,   1 zombie
Cpu(s): 16.9% us, 10.7% sy,  0.0% ni, 72.4% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4148856k total,  2382188k used,  1766668k free,     7572k buffers
Swap:  2097144k total,      144k used,  2097000k free,  1173608k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                      
 XXXX XXXX   16   0 1476m 906m  43m S 99.9 22.4   3334:44 java  

不过cpu依然没有能下来,下一步看看jvm的线程

问题终于解决

把所有线程的堆栈跟踪信息打出来,监视了一会,发现一个一直存在的线程,是一个jsp有双层循环展示,可能存在死循环,把此线程stop后,世界一下子清静了,cpu终于下来了,内存也恢复了至少800M回来

Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4148856k total,  1669540k used,  2479316k free,    45008k buffers
Swap:  2097144k total,      144k used,  2097000k free,   518672k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                      
  XXXX XXXXX    16   0 1481m 823m  43m S  0.0 20.3   4769:27 java 

引用来自#6楼“王树兵”的帖子

问题终于解决

把所有线程的堆栈跟踪信息打出来,监视了一会,发现一个一直存在的线程,是一个jsp有双层循环展示,可能存在死循环,把此线程stop后,世界一下子清静了,cpu终于下来了,内存也恢复了至少800M回来

Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4148856k total,  1669540k used,  2479316k free,    45008k buffers
Swap:  2097144k total,      144k used,  2097000k free,   518672k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                      
  XXXX XXXXX    16   0 1481m 823m  43m S  0.0 20.3   4769:27 java 

哈哈,我说什么来着,以后可别冤枉人家 Tomcat 了。

--- 共有 1 条评论 ---
13123123 这是code写的太不负责任了。。 4年前 回复

恩,是啊,tomcat6其实还是不错的,我现在一直想再重现一下cpu 99.9的状态,不过我执行了很多遍,并不能出现cpu满载的情况。

看来那个有struts2 两层<s:iterator>标签的jsp 还需要某种条件才能导致cpu满载

我是LINUX 新手,

目前也有个应用碰到这个问题,

麻烦各位大哥给我详细指导下 “你把所有线程的状态和调用的堆栈都打印出来”啊

谢谢

引用来自#10楼“李求孟”的帖子

我是LINUX 新手,

目前也有个应用碰到这个问题,

麻烦各位大哥给我详细指导下 “你把所有线程的状态和调用的堆栈都打印出来”啊

谢谢

 Thread.getAllStackTraces()

得到一个map 之后打印map里的各个值就OK了

顶部