正在导出系统过程对象和操作 卡住_开会时CPU 飙升100%同事们都手忙脚乱记一次应急处理过程
告警
正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误。查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%。
赶紧从会上下来,SSH登录服务器,使用 top 命令查看,几个Java进程CPU占用达到180%,190%,这几个Java进程对应同一个业务服务的几个Pod(或容器)。
定位
- 使用 docker stats 命令查看本节点容器资源使用情况,对占用CPU很高的容器使用 docker exec -it <容器ID>bash 进入。
- 在容器内部执行 top 命令查看,定位到占用CPU高的进程ID,使用 top -Hp <进程ID> 定位到占用CPU高的线程ID。
- 使用 jstack <进程ID> > jstack.txt 将进程的线程栈打印输出。
- 退出容器, 使用 docker cp <容器ID>:/usr/local/tomcat/jstack.txt ./ 命令将jstack文件复制到宿主机,便于查看。获取到jstack信息后,赶紧重启服务让服务恢复可用。
- 将2中占用CPU高的线程ID使用 pringf '%xn' <线程ID> 命令将线程ID转换为十六进制形式。假设线程ID为133,则得到十六进制85。在jstack.txt文件中定位到 nid=0x85的位置,该位置即为占用CPU高线程的执行栈信息。如下图所示,
- 与同事确认,该处为使用一个框架的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%同事们都手忙脚乱记一次应急处理过程相关推荐
- 记一次线上cpu飙升100%的排查过程
大家好,我是烤鸭: 最近没怎么写技术文章,还是得回归下初心,正好前几天出现个线上问题,记录下排查过程. 问题描述 某个时间点,接收到接口响应慢报警. 过一会收到服务器cpu可用率低(<10%)报 ...
- 织梦php重新安装教程,织梦CMS系统后台重装的操作教程
原标题:织梦CMS系统后台重装的操作教程 网站在线运行,不可能一点问题都不存在,或者当初的网站设计.架构.功能已经不能满足现在用户的需求,所以我们会对网站做出相应的改动.网站除了前端的改版,还会有后台 ...
- 已有Win10基础上安装Ubuntu双系统(含BIOS操作)
参考:[Linux安装]Win10安装Ubuntu双系统(含BIOS操作)_百里飞洋的博客-CSDN博客_win10安装ubuntu双系统 一个16G的空U盘,台式机 U盘引导盘制作工具(Rufus) ...
- 点晴oa系统搭服务器,点晴OA系统安装后提示:操作对象无效错误101,您没有ASPEncodeDLL.AspCoding对象的操作权限或该对象不存在请联系服务器管理员...
点晴OA系统安装后提示:操作对象无效错误101,您没有ASPEncodeDLL.AspCoding对象的操作权限或该对象不存在请联系服务器管理员 :安装的时候遇到一个问题,安装完之后出现:您没有 A ...
- linux 重启_四步见证linux系统重启过程,小心操作,防止后悔!
linux小白到大神的成长之路:四步见证linux系统重启过程,小心操作,防止后悔! 本经验由宗龙龙原创,全文共880多字,阅读需要14分钟! 记得上篇文章给大家讲述linux系统的重启与关机操作,但 ...
- Linux系统下I/O操作讲解,深入了解实战高级I/O编程
Linux系统下I/O 一.I/O简介 I/O(输入/输出)是在主存和外部设备(磁盘驱动器.网络.终端)之间复制数据的过程.输入是从外部设备复制到主存,输出是从主存复制到外部设备. 在Linux系统中 ...
- Oracle的系统和对象权限 查看用户包含的各类权限
Oracle数据库用户权限查询和一些查看操作(汇总) 2018年07月22日 20:32:38 茶木君 阅读数:1222 标签: oracle 更多 个人分类: oracle dba权限:user为有 ...
- win7系统未响应卡住_系统经常假死怎么办|win7系统经常无响应|win10系统经常未响应怎么解决...
2016-12-09 10:51:44 电脑安装windows7操作系统后,难免会遇到一些故障问题,这不有位用户说打开应用程序经常出现未响应的情况,每次都要等待很久的时间,这可怎么办呢?有些用户尝试启 ...
- mysql word_mysql导出word的表结构操作
mysql导出word的表结构操作 1.首先准备好mysql的相关插件mysql-connector-odbc和DBExportDoc 百度网盘地址: 2安装驱动 打开DBExportDoc V1.0 ...
最新文章
- Linux - 收藏集 - 掘金
- 转代码判断邮箱是否合法
- 在ISA 2006标准版上定制带宽和限制流量(测试)
- tp5 日期范围查询_VB实战应用 | 如何巧妙解决日期范围查询问题
- 使用双栈实现一个队列
- Mr.J--初识Ajax
- php无法清除缓冲区怎么解决,php – 无法删除缓冲区 没有缓冲区要删除
- Linux下Gcc生成和使用静态库和动态库详解(转)
- Object.preventExtensions()使用技巧
- [转载] 《python程序设计应用教程》第一章 python语言概述
- [笔试面试题] 10-C和C++区别相关
- DoIP协议:通用DoIP首部否定确认码02和03的区别
- 【软件工程导论题型大总结】画图题总结
- 贴片晶振的焊接方法和注意事项
- Java---(SpringBlade框架)后台从数据库读取所有点的经度和纬度,传输到前端显示在地图上
- 实例详解ISA防火墙策略元素:ISA2006系列之五
- Windows 10新功能
- ibm服务器 产品型号对应表,IBM服务器配件型号及编号列表
- 那些打印对称图形的题
- Java 字节码技术:不积细流,无以成江河
热门文章
- 为什么代码正确却没有爬虫的信息_一位一年多工作经验的程序员问我,为什么545行代码没有执行到?...
- == 和 equals方法的区别
- this关键字 和 private关键字
- eclipseEE连接mysql_mysql-eclipseEE连接MySQL出现问题,哪位大神可以帮我看看*^__^*,非常感谢...
- python不定参数的函数实现_python传入不定参数是什么
- gfs mysql_linux搭建gfs系统--iscsi+GFS实现网络存储
- 矩阵计算的理论与方法_钢筋焊接网片实际重量与理论重量相差多少以及计算方法...
- c语言810除以1000,【答题】C语言程序设计问题与解释实验
- java 集合操作_Java 集合的操作 个人方法总结
- c语言递归求n的阶乘之和,c语言用递归的方法实现1!+2!+3!+4!+.....+n!=?阶乘之和...