记录一次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

相关文章

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%