记录一次CPU过高引起的服务不可用事件

2024-08-23 07:20

本文主要是介绍记录一次CPU过高引起的服务不可用事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.前言

二.程序日志定位

三.Mysql事务定位

四.程序代码定位

五.微服务注册异常定位

六.异常进程定位

6.1.进程的线程信息分析

6.2.进程的堆内存分析

七.总结


一.前言

系统收到客户大面积反馈,登系统反应慢,打不开,登录不上等问题,随即展开排查。

二.程序日志定位

通过程序日志定位,数据库连接池出现连接超时异常,排查对象转到mysql数据库。

三.Mysql事务定位

通过对mysql事务,锁的监控,发现大量事务挤压,随即排查程序代码中对事务的控制是否不合理。

四.程序代码定位

经过全局搜索代码中对事务提交和回滚的控制,没有疏漏点,并对个别逻辑进行缩小事务控制范围的的代码优化,对一些查询量较大和频繁的表增加索引,计划择时重启服务。

程序重启后,事务并没有消失,依然有挤压,随即对程序代码进行版本回退,排除近期新上线代码可能造成的影响。

五.微服务注册异常定位

在版本回退过程中,发现注册到nacos上的四个order服务,逐步”死掉”,直至order服务不可用。

并在order所在的服务器上发现,在order服务启动后,order服务CPU占用率逐步升高,程序日志无异常,进程存活。

通过分析,推断可能服务因为CPU资源占用问题向注册中心nacos心跳请求失败,注册中心把服务下线,排除掉代码中可能存在的死循环,线程阻塞的大方向后,随即对异常进程进行分析。

六.异常进程定位

6.1.进程的线程信息分析

  • top命令列出当前服务器所有进程,并按cpu占用大小排序
  • 根据第一步获取的进程号,查询进程里线程最占用cpu,使用命令:top -p 4001893 -H
  • 把线程堆栈信息dump到本地存储,使用命令:jstack  4001893 > /home/app_oper/jstack.log
  • 使用IBM的Thread and Monitor Dump Analyzer For Java工具对线程堆栈信息分析

在thread dump中,要留意下面几种状态 

死锁,Deadlock(重点关注) 
等待资源,Waiting on condition(重点关注) 
•  等待获取监视器,Waiting on monitor entry(重点关注) 
阻塞,Blocked(重点关注) 
•  执行中,Runnable 
•  暂停,Suspended 
•  对象等待中,Object.wait() 或 TIMED_WAITING 
•  停止,Parked 
下面有详细的例子讲这种分析,大家参考原著 
http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 

6.2.进程的堆内存分析

可能存在内存泄漏,GC频繁执行的情况

  • 执行jmap -dump:format=b,file=/home/app_oper/heap.bin 4001893
  • 使用IBM的HeapAnalyzer工具对生成的heap.bin进行分析

通过分析,发现对report_org_second_daily机构日报表的插入脚本过大。

定位到代码中,发现存在批量插入,数据量过大且组装成了单独的sql插入语句,并处在定时任务中,执行频率为5分钟。

对定时任务临时处理后重新部署上线,观察上述三种异常(事务,nacos,CPU)均未再出现。

七.总结

近期商城订单数量激增,定时任务在处理大数据量时出现性能问题,后续将对此类场景下可能存在的问题进行全面优化,排查线上问题,多使用相关工具,比如Java 命令行工具,可视化软件(HeapAnalyzer等),第三方插件(arthas,spring boot admin等),并做好日常系统巡检工作。

其他:

内存占用程序排序前10
ps aux --sort=-%mem | awk 'NR<=11{print $4,$11,$12,$13,$14,$15}'
磁盘占用文件排序前10
find . -type f -exec du -Sh {} + | sort -rh | head -n 11

参考:

springboot应用cpu飙升的原因排除_springboot cpu占用太高-CSDN博客

linux中java项目cpu高

MySQL执行状态查看与分析_查看mysql运行状态-CSDN博客

这篇关于记录一次CPU过高引起的服务不可用事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098721

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,