java web服务器cpu占用过高的处理

平时项目中有时遇到cpu过高的情况,在此基于自己有限的经验写个分享,此处的服务器都是基于linux平台。

cpu的占有线程类型总的来说分为两种:
us :用户空间占用CPU百分比
sy :内核空间占用CPU百分比
在linux下可以通过top命令查看详细,示例如下:

一般来讲CPU us高的解决方法:
CPU us 高的原因主要是执行线程不需要任何挂起动作,且一直执行,导致CPU 没有机会去调度执行其他的线程。
CPU sy高的解决方法:
CPU sy 高的原因主要是线程的运行状态要经常切换,对于这种情况,常见的一种优化方法是减少线程数。

我平时具体的步骤如下:

1.得到线程最高的几个id(ps- process state)

ps  -eLo pid,lwp,pcpu | grep  15285|sort -nk 3

2.导出JAVA线程栈信息

命令:kill -3 [PID] 或者 jstack

3.从栈信息中找到线程数多的几个

命令:sort  文件名 | uniq -c | sort -nk 1

4.分别分析线程数最多的前十个线程和线程占用cpu最高的前10个线程

这步是最关键的,找出这些异常点,比如某个业务功能点占用较高的cpu或者某种类型的线程数量比较多,这个和业务以及具体程序紧密关联的,在此就不多说了。

5.分析占用cpu最高的前10个线程,结果示例如下:

0x1a5:gc线程

"Concurrent Mark-Sweep GC Thread#0" prio=1 tid=0x0000002b29df1400 nid=0x1a5 runnable

0x35f:memcache线程

"memcache5-CacheThread" prio=1 tid=0x0000002b3d277de0 nid=0x35f runnable [0x0000000042755000..0x0000000042755c30]

0x35e:memcache线程

"memcache1-CacheThread" prio=1 tid=0x0000002b371212f0 nid=0x35e runnable [0x0000000042654000..0x0000000042654cb0]

0x14e9:RMI线程

"RMI TCP Connection(102)-10.23.241.59" daemon prio=1 tid=0x0000002b37e72790 nid=0x14e9 runnable [0x000000005103c000..0x000000005103deb0]

0x1be:memcache线程

"memcache5-CacheThread" prio=1 tid=0x0000002b3dba4790 nid=0x1be runnable [0x0000000041a48000..0x0000000041a48eb0]

0x1bd:memcache线程

"memcache1-CacheThread" prio=1 tid=0x0000002b3fb70340 nid=0x1bd runnable [0x0000000041947000..0x0000000041947b30]

0x1af:jdk编译线程

"CompilerThread1" daemon prio=1 tid=0x0000002b30e11620 nid=0x1af waiting on condition [0x0000000000000000..0x000000004123f7c0]

0x1ae:jdk编译线程

"CompilerThread0" daemon prio=1 tid=0x0000002b30e10280 nid=0x1ae waiting on condition [0x0000000000000000..0x000000004113e440]

0x1684:http请求线程,通过该线程栈可以看到此处调用的是hibernate查询

"http-8080-Processor123" daemon prio=1 tid=0x0000002b37dfd9d0 nid=0x1684 runnable [0x000000005afd7000..0x000000005afdcd30]

--------------------------------------------------------------------------------------------------------------------------------

6.系统优化

如果找出了哪些功能点占用cpu高,接下来就需要优化了,可以从业务和技术手段两方面来进行,平时工作中比较常用的技术手段:

弹性时间:对高使用率的请求,分散到不同的时间,比如采用队列或异步,减少同一时间处理的请求。

批处理或定时任务:把请求组合成批,这样可以使得时间真真的都有效的用在了处理上,而不是网络传输等准备工作上。(减少网络传输、数据库连接、socket连接)

缓存:将结果缓存起来,空间换时间

--------------------------------------------------------------------------------------------------------------------------------

7.如果是gc线程比较费时,则需要进一步的定位:

首先查看一下gc策略是否合理,然后用命令jmap -F -dump:live,file=jmap.hprof [PID] 导出内存dump文件,我一般每隔5s导一次,一共导出3次。用Eclipse Memory Analyzer分析导出来的文件,分析是哪个类占用内存比较多,分析出可能存在内存泄露的地方。

注意jvm分配内存时一个大对象的分配比多个小对象的分配效率要低,如果对象比较大,进行拆分能提高效率,具体原因如下:

Java对象所占用的内存主要从堆上进行分配,堆是所有线程共享的,因此在堆上分配内存时需要进行加锁,这导致了创建对象开销比较大。当堆上空间不足时,会触发GC,如果GC后空间仍然不足,则抛出OutOfMemory错误信息。Sun JDK为了提升内存分配的效率,会为每个新创建的线程在新生代的Eden Space上分配一块独立的空间,这块空间称为TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行情况计算而得,可通过-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden Space的百分比,默认值为1%。JVM将根据这个比率、线程数量及线程是否频繁分配对象来给每个线程分配合适大小的TLAB空间 。在TLAB上分配内存时不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配,如果对象过大或TLAB空间已用完,则仍然在堆上进行分配,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效

http://hi.baidu.com/i1see1you/blog/item/6438aecac4dd959bc917683d.html

时间: 2024-11-08 21:59:36

java web服务器cpu占用过高的处理的相关文章

Java项目服务器cpu占用100%解决办法

服务器cpu占用100% 项目上线后运行一段时间,突然发现cpu 8个逻辑核心都占用100%,心情很紧张,然后就在网上找了一些解决方法,具体如下:        1.查找哪些进程在耗cpu         进入服务器,top 命令看一下,发现进程6633占用了800%        [[email protected] ~]# top        2.把进程的栈dump到文件里,以便后面的分析       [[email protected] ~]# jstack 23812 >> java

性能测试问题-Mysql数据库服务器的CPU占用很高

MySQl服务器CPU占用很高 1.  问题描述 一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引 2.  问题原因 查询语句索引没有命中导致 开始时的select SELECT `province_name`, `city_name` FROM `phoneno_section` WHERE SUBSTRING(?, phoneno_section_len) = phoneno_section

一次java Cpu占用过高的排查

某一个项目CPU占用率一直很高,经常在40%-50%之间,最近比较闲,就开始了挂查工作. 1.通过 jstack命令输出进程的堆栈信息 jstack 2788 >C:\log.txt 将堆栈信息输出到log.txt "dubbo-remoting-client-heartbeat-thread-1" #46 daemon prio=5 os_prio=0 tid=0x000000005c53e000 nid=0x240c waiting on condition [0x00000

sqlserver 索引优化 CPU占用过高 执行分析 服务器检查

原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚没个正形,现在写的程序卡的跑不动.他说我本地 是好好的,跑的很快.我说别扯那么多没用的,服务器不比你的本子强得多.待洒家上去看看.不看不知道一看吓一跳,CPU占用在95上下.开个程序是不卡,可整点有些时间是卡的一匹.这就令人很难受了. 本来服务器上也没有什么,就一个网站和几个数据库.那一个个分析吧,

Hession反序列化导致CPU占用飙高

背景 今天发布一个线上服务,暂且称之为O,发布完后,依赖O服务的2个服务C和W大量Time报警,并且这两个服务的CPU占用都飙到了40%左右,平时只有10%的样子. 这时去看O服务的监控,Time并没有升高,QPS反倒降了一半.同时C和W服务器日志中出现了大量的WARNING,信息如下: java.lang.ClassNotFoundException: com.我是不可描述的信息.PropertyAo Dec 02, 2016 6:24:33 PM com.alibaba.com.caucho

从 kswapd0 进程CPU占用过高 到计算机内存详解

问题发现 操作系统都用分页机制来管理物理内存,操作系统将磁盘的一部分划出来作为虚拟内存,由于内存的速度要比磁盘快得多,所以操作系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中,由于内存持续不足,这个换页动作持续进行,kswapd0是虚拟内存管理中负责换页的,当服务器内存不足的时候kswapd0会执行换页操作,这个换页操作是十分消耗主机CPU资源的.如果通过top发现该进程持续处于非睡眠状态,且运行时间较长,可以初步判定系统在持续的进行换页操作,可以将问题转向内存不足的原因来

JVM探秘:线上CPU占用过高故障排查

线上系统突然变得卡顿或无法访问,排除网络异常的情况下,检查服务器资源占用情况,如果CPU.内存.磁盘IO等资源占用过高,就会导致无法继续处理HTTP请求. 如果是CPU占用飙高,有可能是程序中存在死循环.死锁导致的,也有可能是内存紧张从而频繁GC导致的,要具体问题具体分析. 排查过程 这里记录一次线上CPU占用过高的故障排查过程,重点会用到jstack命令. top命令 首先,使用top命令查看服务器资源使用情况,找到CPU占用过高的进程. 发现pid为29167的Java进程CPU占用很高,已

服务器CPU使用率过高的处理

最近发现公司服务器搭建的网站访问缓慢,服务器输入命令也反应慢,处理步骤如下: 1.通过top命令查看服务器CPU.内存.IO等使用情况 发现CPU基本在80%以上:内存还好,有富余:CPU平均加载率Load Average也是达到40左右 2.通过vmstat.iostat参看相关参数,确认是CPU占用很高,CPU不够用,当时以为服务器CPU被用完了,但是应用不是很多,两CPU是够用的 3.后来慢慢看进程和服务线程以及端口号占用和包发送,(w.procinfo.ps.uptime.netstat

“RESOURCE MONITOR“CPU占用特别高

背景: SQL Server 2008 R2 10.50.1600 没有设置页面文件,内存为64G,数据库分配50G cpu使用占了50%以上,平时只有10-20%,某台服务器“RESOURCE MONITOR“CPU占用特别高. 原因: 网上有说是虚拟内存不够,也有说升级版本就可以解决. 猜测,是因此资源不足,导致RESOURCE MONITOR一直在运行,从而导致cpu太高 解决方法: 设置更大到内存