LZ开发的一个公司内部应用供查询HIVE数据使用。部署上线后总是会出现CPU偏高的情况,而且本地测试很难重现。之前出现几次都是通过直接重启后继续使用,因为是内部使用,重启一下也没有很大影响(当然,每次重启都是顺带改改BUG,添加一些监控,或者修改了一些参数)。

今天再次发生占用CPU偏高的情况(机器是16核的),跑了几天后出现占用到200-300CPU的情况,之后快速升高,占用到700-1000。随机对应用状态状态尽兴了检查。

首先看了GC情况,看是否在进行FGC。

(在CPU刚开始飙高的时候FGC的次数是0,上图9次定位完问题才截的图,之前的没有保留)

发现应用并没有在进行FGC,而是进行频繁的YGC。

YGC也存在异常,S1和S0区域都是从0直接跳到99%

观察堆大小装太发现Young区内存都是不断的从0到99,而Old区在慢慢递增,还未达到FGC的状态。但预计后续会不停的上涨,导致FGC频道,应用无法提供服务。

在发现YGC频繁之后大约3个小时,终于开始了频繁的FGC,Old区满。

以下是堆大小和FGC的情况:

可以看到差不多10秒钟Old区就用满了导致一次FGC,而且Old区大小是10G(多么恐怖,10个G十来秒就用完了)

从内存和GC的角度只能看到YGC频繁导致了FGC频道(10秒一次)。但这样的情况应用还是能提供服务,只是占了较高的CPU(如果FGC在频繁一些应用应该是不能访问的)。

查完内存的状态确认并不是old区太小,被用满了导致了不停的FGC,因为old明显是够大的,如果10G不够,那应用肯定是有问题的。

之后去查了哪些线程占用了很高CPU(本应当在发现没有频繁FGC之后就入手查线程状态,经验不够)

查看进程的线程CPU使用情况:

拿到CPU占用较高的几个线程,转成16进制

使用jstack看进程内的线程堆栈信息(jstack 24820 > abc.log)

vim编辑abc.log,查找上面获取到的线程的16进制数

发现是使用了com.trilead.ssh2.StreamGobbler类的线程。这是一个ssh的第三方包。

后续查了其他CPU占用高的线程,除了GC占用,大部分都是SSH占用。

应用场景是每次使用HIVEQL进行查询的时候都会起一个线程,SSH到远程服务器,执行查询内容,返回结果。

如果有多个用户同时进行多个查询(一个用户也可以进行多次查询),就会出现多个线程多次SSH的情况。

后续处理的两个方案:

方案一,替换现有的第三方SSH工具,看有没有更好的

方案二,修改代码。考虑SSH后保持SESSION(查SSH SESSION的时效时间),统一账号,所有用户后台使用统一账号登录远程服务器执行查询。只使用一个SESSION,发现SESSION失效后进行一次重连。而不是每次查询都建一个登录一次获取session,用完后关闭,相信能减少SSH的引起的问题。

(PS:因为手头上还在进行其他项目,所以还是重启了应用先顶一阵,后面做完hive的权限控制,后台统一用户执行后优化SSH的处理)

OOM、CPU占用问题,JVM工具使用这些都是从菜鸟程序员不断提高要经历的,希望自己变的更好。

附JVM常用工具说明:http://my.oschina.net/feichexia/blog/196575

记一次Web应用CPU偏高的更多相关文章

  1. 记一次查内存异常问题(续《记一次Web应用CPU偏高》)

    继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了.上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致 ...

  2. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  3. 实际遭遇GC回收造成的Web服务器CPU跑高

    今天下午有段时间访问园子感觉不如以前那么快的流畅,上Web服务器一看,果然,负载均衡中的1台云服务器CPU跑高. 上图中红色曲线表示的是CPU占用率.正常情况下,CPU占用率一般在40%以下. 这台云 ...

  4. 记一次yarn导致cpu飙高的异常排查经历

    yarn就先不介绍了,这次排坑经历还是有收获的,从日志到堆栈信息再到源码,很有意思,下面听我说 问题描述: 集群一台NodeManager的cpu负载飙高. 进程还在但是看日志已经不再向Resourc ...

  5. 记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    项目上线以来一直存在一个比较揪心的问题,和一个没有信心处理的BUG,那就是在应用程序启动时有可能会导致cpu跑满99%或持续在一个值如50%左右,这样一来对服务器的压力是非常大的,经常出现服务器无法远 ...

  6. 正则表达式回溯-导致CPU偏高

    最近了解了下有关正则表达式回溯的内容,想想就写下来,方便自己. 正则表达式匹配算法是建立在正则表达式引擎的基础上的,目前有两种引擎:DFA(确定型有穷自动机)和NFA(不确定型有穷自动机).这两种引擎 ...

  7. java 快速定位线上cpu偏高

    1.top -c 加 大写P 查找高进程ID 2.top -Hp 加 大写 P 查找高线程ID 3.printf '%x\n' 线程ID 转成16进制 4.jstack 进程ID | grep 16进 ...

  8. w3wp占用CPU过高

    w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...

  9. 记一次 .NET 某电商交易平台Web站 CPU爆高分析

    一:背景 1. 讲故事 已经连续写了几篇关于内存暴涨的真实案例,有点麻木了,这篇换个口味,分享一个 CPU爆高 的案例,前段时间有位朋友在 wx 上找到我,说他的一个老项目经常收到 CPU > ...

随机推荐

  1. [CLR via C#]14. 字符、字符串和文本处理

    一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.System ...

  2. strcpy函数实现

    1,strcpy最简便实现 char * strcpy_to (char *dst, const char *src) { char *address = dst; assert((dst != NU ...

  3. git 给远程库 添加多个url地址

     目录[-] 前提 使用流程 原理解析 注意 Other 参考文章 作者:shede333主页:http://my.oschina.net/shede333 && http://blo ...

  4. mysqli连接数据库常见函数

    mysqli_free_result() 返回最后一次查询中使用的自动生成 id,如果是多表插入,返回的是第一个被插入的id. mysqli_query($con,"INSERT INTO ...

  5. NTFS碎片

    在Windows操作系统中查看各分区的文件系统: fsutil fsinfo ntfsinfo c: (查看C:盘的文件系统) fsutil fsinfo ntfsinfo d: (查看D:盘的文件系 ...

  6. linux下log4j乱码解决

    使用log4j的时候,在WIN系统的时候正常显示中文,但是发布到linux系统的时候中文就显示成乱码了 由于log4j配置文件中没有设置编码格式(encoding),所以log4j就使用系统默认编码. ...

  7. JavaScripts 基础详细笔记整理

    一.JS简介 JavaScript 是 Web 的编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理 ...

  8. hdu 2952 Counting Sheep

    本题来自:http://acm.hdu.edu.cn/showproblem.php?pid=2952 题意:上下左右4个方向为一群.搜索有几群羊 #include <stdio.h> # ...

  9. Play 可以做的 5 件很酷的事

    Play 可以做的 5 件很酷的事 本章译者:@Playframwork 通过 5 个实例,透视 Play 框架背后的哲学. 绑定 HTTP 参数到 JAVA 方法参数 用 Play 框架,在 Jav ...

  10. android Adapter剖析理解

    UI控件都是跟Adapter(适配器)打交道的 Adapter: 是用来帮助控件填充数据的中间桥梁 (在开发中大多数Textview控件的内容是依靠数据库传递并显示的如:新闻类) Adapter: 将 ...