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

相关文章

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题