0

0

我去,Linux 系统 CPU 100% 打满了!

WBOY

WBOY

发布时间:2024-02-13 23:27:12

|

1215人浏览过

|

来源于良许Linux教程网

转载

昨天下午,我突然收到了运维部门的邮件报警,显示数据平台服务器的cpu利用率高达98.94%。最近一段时间,这个利用率一直持续在70%以上。乍一看,似乎是硬件资源到达了瓶颈,需要扩容。但仔细思考后,我发现我们的业务系统并不是一个高并发或cpu密集型的应用。这个利用率实在太夸张了,硬件瓶颈不可能这么快就到达。肯定是某处的业务代码逻辑出现了问题。

2、排查思路

2.1 定位高负载进程 pid

首先登录到服务器使用top命令确认服务器的具体情况,根据具体情况再进行分析判断。

我去,Linux 系统 CPU 100% 打满了!

通过观察load average,以及负载评判标准(8核),可以确认服务器存在负载较高的情况;

我去,Linux 系统 CPU 100% 打满了!

观察各个进程资源使用情况,可以看出进程id为682的进程,有着较高的CPU占比

2.2 定位具体的异常业务

这里咱们可以使用 pwdx 命令根据 pid 找到业务进程路径,进而定位到负责人和项目:

我去,Linux 系统 CPU 100% 打满了!

可得出结论:该进程对应的就是数据平台的web服务。

2.3 定位异常线程及具体代码行

传统的方案一般是4步:

1、top oder by with P:1040 // 首先按进程负载排序找到 maxLoad(pid)

2、top -Hp 进程PID:1073 // 找到相关负载 线程PID

3、printf “0x%x ”线程PID: 0x431 // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备

4、jstack 进程PID | vim +/十六进制线程PID – // 例如:jstack 1040|vim +/0x431 –

但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,之前介绍过淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh,可以很方便的定位线上的这类问题:

我去,Linux 系统 CPU 100% 打满了!

可得出结论:是系统中一个时间工具类方法的执行cpu占比较高,定位到具体方法后,查看代码逻辑是否存在性能问题。

※ 如果线上问题比较紧急,可以省略 2.1、2.2 直接执行 2.3,这里从多角度剖析只是为了给大家呈现一个完整的分析思路。

3、根因分析

经过前面的分析与排查,最终定位到一个时间工具类的问题,造成了服务器负载以及cpu使用率的过高。

  • 异常方法逻辑:是把时间戳转成对应的具体的日期时间格式;
  • 上层调用:计算当天凌晨至当前时间所有秒数,转化成对应的格式放入到set中返回结果;
  • 逻辑层:对应的是数据平台实时报表的查询逻辑,实时报表会按照固定的时间间隔来,并且在一次查询中有多次(n次)方法调用。

那么可以得到结论,如果现在时间是当天上午10点,一次查询的计算次数就是 106060n次=36,000n次计算,而且随着时间增长,越接近午夜单次查询次数会线性增加。由于实时查询、实时报警等模块大量的查询请求都需要多次调用该方法,导致了大量CPU资源的占用与浪费。

4、解决方案

定位到问题之后,首先考虑是要减少计算次数,优化异常方法。排查后发现,在逻辑层使用时,并没有使用该方法返回的set集合中的内容,而是简单的用set的size数值。确认逻辑后,通过新方法简化计算(当前秒数-当天凌晨的秒数),替换调用的方法,解决计算过多的问题。上线后观察服务器负载和cpu使用率,对比异常时间段下降了30倍,恢复至正常状态,至此该问题得已解决。

![昨天下午,我突然收到了运维部门的邮件报警,显示数据平台服务器的cpu利用率高达98.94%。最近一段时间,这个利用率一直持续在70%以上。乍一看,似乎是硬件资源到达了瓶颈,需要扩容。但仔细思考后,我发现我们的业务系统并不是一个高并发或cpu密集型的应用。这个利用率实在太夸张了,硬件瓶颈不可能这么快就到达。肯定是某处的业务代码逻辑出现了问题。

PhotoScissors
PhotoScissors

免费自动图片背景去除

下载

2、排查思路

2.1 定位高负载进程 pid

首先登录到服务器使用top命令确认服务器的具体情况,根据具体情况再进行分析判断。

我去,Linux 系统 CPU 100% 打满了!

通过观察load average,以及负载评判标准(8核),可以确认服务器存在负载较高的情况;

我去,Linux 系统 CPU 100% 打满了!

观察各个进程资源使用情况,可以看出进程id为682的进程,有着较高的CPU占比

2.2 定位具体的异常业务

这里咱们可以使用 pwdx 命令根据 pid 找到业务进程路径,进而定位到负责人和项目:

我去,Linux 系统 CPU 100% 打满了!

可得出结论:该进程对应的就是数据平台的web服务。

2.3 定位异常线程及具体代码行

传统的方案一般是4步:

1、top oder by with P:1040 // 首先按进程负载排序找到 maxLoad(pid)

2、top -Hp 进程PID:1073 // 找到相关负载 线程PID

3、printf “0x%x ”线程PID: 0x431 // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备

4、jstack 进程PID | vim +/十六进制线程PID – // 例如:jstack 1040|vim +/0x431 –

但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,之前介绍过淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh,可以很方便的定位线上的这类问题:

我去,Linux 系统 CPU 100% 打满了!

可得出结论:是系统中一个时间工具类方法的执行cpu占比较高,定位到具体方法后,查看代码逻辑是否存在性能问题。

※ 如果线上问题比较紧急,可以省略 2.1、2.2 直接执行 2.3,这里从多角度剖析只是为了给大家呈现一个完整的分析思路。

3、根因分析

经过前面的分析与排查,最终定位到一个时间工具类的问题,造成了服务器负载以及cpu使用率的过高。

  • 异常方法逻辑:是把时间戳转成对应的具体的日期时间格式;
  • 上层调用:计算当天凌晨至当前时间所有秒数,转化成对应的格式放入到set中返回结果;
  • 逻辑层:对应的是数据平台实时报表的查询逻辑,实时报表会按照固定的时间间隔来,并且在一次查询中有多次(n次)方法调用。

那么可以得到结论,如果现在时间是当天上午10点,一次查询的计算次数就是 106060n次=36,000n次计算,而且随着时间增长,越接近午夜单次查询次数会线性增加。由于实时查询、实时报警等模块大量的查询请求都需要多次调用该方法,导致了大量CPU资源的占用与浪费。

4、解决方案

定位到问题之后,首先考虑是要减少计算次数,优化异常方法。排查后发现,在逻辑层使用时,并没有使用该方法返回的set集合中的内容,而是简单的用set的size数值。确认逻辑后,通过新方法简化计算(当前秒数-当天凌晨的秒数),替换调用的方法,解决计算过多的问题。上线后观察服务器负载和cpu使用率,对比异常时间段下降了30倍,恢复至正常状态,至此该问题得已解决。

我去,Linux 系统 CPU 100% 打满了!

5、总结

  • 在编码的过程中,除了要实现业务的逻辑,也要注重代码性能的优化。一个业务需求,能实现,和能实现的更高效、更优雅其实是两种截然不同的工程师能力和境界的体现,而后者也是工程师的核心竞争力。
  • 在代码编写完成之后,多做 review,多思考是不是可以用更好的方式来实现。
  • 线上问题不放过任何一个小细节!细节是魔鬼,技术的同学需要有刨根问题的求知欲和追求卓越的精神,只有这样,才能不断的成长和提升。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

3

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号