告警

正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误。查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%。

赶紧从会上下来,SSH登录服务器,使用 top 命令查看,几个Java进程CPU占用达到180%,190%,这几个Java进程对应同一个业务服务的几个Pod(或容器)。

定位

  1. 使用 docker stats 命令查看本节点容器资源使用情况,对占用CPU很高的容器使用 docker exec -it <容器ID>bash 进入。
  2. 在容器内部执行 top 命令查看,定位到占用CPU高的进程ID,使用 top -Hp <进程ID> 定位到占用CPU高的线程ID。
  3. 使用 jstack <进程ID> > jstack.txt 将进程的线程栈打印输出。
  4. 退出容器, 使用 docker cp <容器ID>:/usr/local/tomcat/jstack.txt ./ 命令将jstack文件复制到宿主机,便于查看。获取到jstack信息后,赶紧重启服务让服务恢复可用。
  5. 将2中占用CPU高的线程ID使用 pringf '%xn' <线程ID> 命令将线程ID转换为十六进制形式。假设线程ID为133,则得到十六进制85。在jstack.txt文件中定位到 nid=0x85的位置,该位置即为占用CPU高线程的执行栈信息。如下图所示,
  1. 与同事确认,该处为使用一个框架的excel导出功能,并且,导出excel时没有分页,没有限制!!!查看SQL查询记录,该导出功能一次导出50w条数据,并且每条数据都需要做转换计算,更为糟糕的是,操作者因为导出时久久没有响应,于是连续点击,几分钟内发起了10多次的导出请求。。。于是,CPU被打满,服务崩溃了,我也崩溃了。。

解决

对于此类耗资源的操作,一定要做好相应的限制。比如可以限制请求量,控制最大分页大小,同时可以限制访问频率,比如同一用户一分钟内最多请求多少次。

再发

服务重启后恢复。到了下午,又一台服务器节点CPU告警,依前面步骤定位到占用CPU高的线程,如下

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fa114020800 nid=0x10 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fa114022000 nid=0x11 runnable 

使用命令 jstat -gcutil <进程ID> 2000 10 查看GC情况,如图

发现Full GC次数达到1000多次,且还在不断增长,同时Eden区,Old区已经被占满(也可使用jmap -heap <进程ID>查看堆内存各区的占用情况),使用jmap将内存使用情况dump出来,

jmap -dump:format=b,file=./jmap.dump 13

退出容器,使用 docker cp <容器ID>:/usr/local/tomcat/jmap.dump ./ 将dump文件复制到宿主机目录,下载到本地,使用 MemoryAnalyzer(下载地址:www.eclipse.org/mat/downloa… )打开,如图

如果dump文件比较大,需要增大MemoryAnalyzer.ini配置文件中的-Xmx值

发现占用内存最多的是char[], String对象,通过右键可以查看引用对象,但点开貌似也看不出所以然来,进入内存泄露报告页面,如图

该页面统计了堆内存的占用情况,并且给出疑似泄露点,在上图中点开“see stacktrace”链接,进入线程栈页面,

似曾熟悉的画面,还是跟excel导出有关,数据太多,导致内存溢出。。。于是GC频繁,于是CPU爆了。根源还是同一个。

总结

本文以处理一次线上服务CPU 100%的实战过程示例了在遇到Java服务造成服务器CPU消耗过高或内存溢出的一般处理方法,希望对大家定位线上类似问题提供参考。同时,开发实现功能时需要考虑的更深远一些,不能停留在解决当前的场景,需要考虑数据量不断增大时,你的实现是否还能适用。俗话说,初级程序员解决当前问题,中级程序员解决两年后的问题,高级程序员解决五年后的问题,^_^。

作者:雨歌

正在导出系统过程对象和操作 卡住_开会时CPU 飙升100%同事们都手忙脚乱记一次应急处理过程相关推荐

  1. 记一次线上cpu飙升100%的排查过程

    大家好,我是烤鸭: 最近没怎么写技术文章,还是得回归下初心,正好前几天出现个线上问题,记录下排查过程. 问题描述 某个时间点,接收到接口响应慢报警. 过一会收到服务器cpu可用率低(<10%)报 ...

  2. 织梦php重新安装教程,织梦CMS系统后台重装的操作教程

    原标题:织梦CMS系统后台重装的操作教程 网站在线运行,不可能一点问题都不存在,或者当初的网站设计.架构.功能已经不能满足现在用户的需求,所以我们会对网站做出相应的改动.网站除了前端的改版,还会有后台 ...

  3. 已有Win10基础上安装Ubuntu双系统(含BIOS操作)

    参考:[Linux安装]Win10安装Ubuntu双系统(含BIOS操作)_百里飞洋的博客-CSDN博客_win10安装ubuntu双系统 一个16G的空U盘,台式机 U盘引导盘制作工具(Rufus) ...

  4. 点晴oa系统搭服务器,点晴OA系统安装后提示:操作对象无效错误101,您没有ASPEncodeDLL.AspCoding对象的操作权限或该对象不存在请联系服务器管理员...

     点晴OA系统安装后提示:操作对象无效错误101,您没有ASPEncodeDLL.AspCoding对象的操作权限或该对象不存在请联系服务器管理员 :安装的时候遇到一个问题,安装完之后出现:您没有 A ...

  5. linux 重启_四步见证linux系统重启过程,小心操作,防止后悔!

    linux小白到大神的成长之路:四步见证linux系统重启过程,小心操作,防止后悔! 本经验由宗龙龙原创,全文共880多字,阅读需要14分钟! 记得上篇文章给大家讲述linux系统的重启与关机操作,但 ...

  6. Linux系统下I/O操作讲解,深入了解实战高级I/O编程

    Linux系统下I/O 一.I/O简介 I/O(输入/输出)是在主存和外部设备(磁盘驱动器.网络.终端)之间复制数据的过程.输入是从外部设备复制到主存,输出是从主存复制到外部设备. 在Linux系统中 ...

  7. Oracle的系统和对象权限 查看用户包含的各类权限

    Oracle数据库用户权限查询和一些查看操作(汇总) 2018年07月22日 20:32:38 茶木君 阅读数:1222 标签: oracle 更多 个人分类: oracle dba权限:user为有 ...

  8. win7系统未响应卡住_系统经常假死怎么办|win7系统经常无响应|win10系统经常未响应怎么解决...

    2016-12-09 10:51:44 电脑安装windows7操作系统后,难免会遇到一些故障问题,这不有位用户说打开应用程序经常出现未响应的情况,每次都要等待很久的时间,这可怎么办呢?有些用户尝试启 ...

  9. mysql word_mysql导出word的表结构操作

    mysql导出word的表结构操作 1.首先准备好mysql的相关插件mysql-connector-odbc和DBExportDoc 百度网盘地址: 2安装驱动 打开DBExportDoc V1.0 ...

最新文章

  1. Linux - 收藏集 - 掘金
  2. 转代码判断邮箱是否合法
  3. 在ISA 2006标准版上定制带宽和限制流量(测试)
  4. tp5 日期范围查询_VB实战应用 | 如何巧妙解决日期范围查询问题
  5. 使用双栈实现一个队列
  6. Mr.J--初识Ajax
  7. php无法清除缓冲区怎么解决,php – 无法删除缓冲区 没有缓冲区要删除
  8. Linux下Gcc生成和使用静态库和动态库详解(转)
  9. Object.preventExtensions()使用技巧
  10. [转载] 《python程序设计应用教程》第一章 python语言概述
  11. [笔试面试题] 10-C和C++区别相关
  12. DoIP协议:通用DoIP首部否定确认码02和03的区别
  13. 【软件工程导论题型大总结】画图题总结
  14. 贴片晶振的焊接方法和注意事项
  15. Java---(SpringBlade框架)后台从数据库读取所有点的经度和纬度,传输到前端显示在地图上
  16. 实例详解ISA防火墙策略元素:ISA2006系列之五
  17. Windows 10新功能
  18. ibm服务器 产品型号对应表,IBM服务器配件型号及编号列表
  19. 那些打印对称图形的题
  20. Java 字节码技术:不积细流,无以成江河

热门文章

  1. 为什么代码正确却没有爬虫的信息_一位一年多工作经验的程序员问我,为什么545行代码没有执行到?...
  2. == 和 equals方法的区别
  3. this关键字 和 private关键字
  4. eclipseEE连接mysql_mysql-eclipseEE连接MySQL出现问题,哪位大神可以帮我看看*^__^*,非常感谢...
  5. python不定参数的函数实现_python传入不定参数是什么
  6. gfs mysql_linux搭建gfs系统--iscsi+GFS实现网络存储
  7. 矩阵计算的理论与方法_钢筋焊接网片实际重量与理论重量相差多少以及计算方法...
  8. c语言810除以1000,【答题】C语言程序设计问题与解释实验
  9. java 集合操作_Java 集合的操作 个人方法总结
  10. c语言递归求n的阶乘之和,c语言用递归的方法实现1!+2!+3!+4!+.....+n!=?阶乘之和...