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

(2014-07-21 17:17:36)

转载▼
标签:

cpu

优化

jstack

dump

性能

分类: 高可用

平时项目中有时遇到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

java web服务器cpu占用过高的处理 (2014-07-21 17:17:36)相关推荐

  1. Java项目服务器cpu占用过高怎么办?

    借用汤师爷的一句话:"麻匪一定要缴---没有麻匪的日子才是好日子". 作为程序员,bug一定是要处理的,没有bug的日子才是好日子!你想想,你正吃着火锅唱着歌,突然收到生产环境异常 ...

  2. 高频面试题:服务器CPU占用过高怎么办?搞定只需简单7步

    一. 前言 在Java开发岗位的面试中,时不时会出现一些运维类的题目,其实这也反映了后端面试的一种趋势.现在企业对后端开发的要求越来越全面,不仅要求我们会写代码,还要我们能够进行部署和运维. 今天九哥 ...

  3. 线上服务器CPU占用过高?7步带你搞定

    一. 前言 在Java开发岗位的面试中,时不时会出现一些运维类的题目,其实这也反映了后端面试的一种趋势.现在企业对后端开发的要求越来越全面,不仅要求我们会写代码,还要我们能够进行部署和运维. 今天壹哥 ...

  4. Java 线上cpu占用过高分析

    转载于:https://blog.csdn.net/ch999999999999999999/article/details/113151519 感谢作者:ch999999999999999999 J ...

  5. 服务器CPU占用过高和哪些因素有关呢

    服务器CPU占用过高和哪些因素有关呢 硬件因素 以下分别从CPU温度,CPU超线程,硬件配置,硬件驱动和待机方面分析. 1.CPU温度过高 如果CPU风扇散热不好,会导致CPU温度太高,使CPU自动降 ...

  6. java 一次CPU占用过高问题的排查及解决,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  7. win10服务器cpu占用过高,完美解决:Win10资源管理器占用CPU过高

    Windows10资源管理器占用CPU过高该怎么办?因为Windows7系统结束了支持,所以现在很多朋友都升级更新了Windows10系统.在使用Win10系统的过程中,发现Windows资源管理器占 ...

  8. win10服务器cpu占用过高,Win10 CPU占用率100%怎么办 Win10 CPU占用率过高解决方法

    Win10 CPU占用率100%怎么办 ?Win10系统CPU占用率过高的问题比较常见,下面为大家带来 Win10 CPU占用率过高解决方法 ,一起来看看. 方法1: 导致CPU占用的另一个原因可能是 ...

  9. Linux中JAVA服务器CPU占用过高(分析解决方法)

    当发现生产环境CPU使用非常高,并且居高不下,导致服务器报警,需要快速定位,分析是什么地方占用CPU过高,推荐步骤如下: 1. 首先服务器查看占用cpu高的进程是哪一个,查出进程号 top 2.查询该 ...

  10. mc服务器cpu占用过高怎么办,我的世界崩服无报错 传送导致CPU爆满

    我的世界崩服无报错 传送导致CPU爆满.服务器如果崩服报错了,这其实并不是很可怕的,最可怕的是崩服了米有任何报错数据产生,这是服主们应该时刻注意的.据统计,不少的服主会发现地图中有玩家传送就会导致CP ...

最新文章

  1. pthread相关介绍
  2. make编译工具使用
  3. 浏览器怎么清理缓存_Mac系统浏览器缓存清理工具
  4. Asp.net开发之旅--简单的引用母版页
  5. Linux网络协议栈:网络包接收过程
  6. Unity Js与C#脚本通信
  7. 【BZOJ-1090】字符串折叠 区间DP + Hash
  8. url编码 java_java中的url 编码与解码
  9. gulp-sass 使用报错Error:gulp-sass no longer has a default Sass compiler; please set one yourself
  10. HTML+CSS大作业——水果介绍-橙子之家(6页) HTML+CSS+JavaScript 学生dreamweaver网页设计作业成品
  11. 考研408.计算机网络.特殊IP地址的记忆方法
  12. C#调用系统蜂鸣,警报声
  13. python判断以什么开头_Python中用startswith()函数判断字符串开头的教程
  14. Linux sed按行遍历文件内容,并删除匹配成功的行
  15. 欧拉回路 欧拉通路 欧拉回路图
  16. usc@1113:奖学金
  17. 期货市场价格发现功能的含义和特点是什么(如何理解期货市场具有价格发现经济功能)
  18. 每天小练笔10-小和尚挑水(回溯法)
  19. Ethereum Core Devs Meeting #83以太坊核心开发者会议纪要
  20. 循环中频繁查询数据库优化

热门文章

  1. log4cpp 详解及使用操作
  2. kb931125—rootsupd_kb931125补丁下载
  3. linux内核线程详解,Linux内核线程
  4. 菜鸟学习C++之Console Application
  5. ASP.NET 页面双向静态化
  6. JAVA项目-学生成绩管理系统
  7. VMware Cloud Director 10.4 发布 (含下载) - 云计算调配和管理平台
  8. 安装Veritas Backup Exec v20.3
  9. easyui酷黑风格主题模板组件html
  10. 分享一个外泌体数据库