离谱!CPU狂飙900%,这怎么处理?

开发 前端
为了找出问题的根源,我先用ps -ef | grep java命令找到Java进程的PID。然后使用top -H -p [PID]命令查看该进程下所有线程的CPU使用情况。经过一番查找,我发现有一个线程的CPU使用率特别高,肯定是它搞的鬼!

大家好,今天给大家分享一个线上服务器突然cpu狂飙到900%的一个生产事故案例,相信对大家一定会有一定的用处!因为我们平时开发好的系统部署到线上服务器后基本上就不用怎么管了,系统自己会不停地运行,无非就是数据库里积累的数据会越来越多而已。

但是有的时候,如果因为系统开发的时候遗留下来的一些bug或者漏洞,然后线上生产环境下运行的时候万一在某些特殊的额情况下触发了这个bug或者漏洞,就可能导致我们开发好的线上系统无法正常运行,此时就优可能导致线上服务器cpu负载狂飙到百分之几百!下面,我们就正式开始分析这个生产案例。

话说,有一天下午,我正坐在工位上悠闲地喝着咖啡,突然接到运维一个紧急电话,说线上的Java系统部署的服务器CPU使用率突然飙升到了900%!我的第一反应是:“啥?CPU使用率还能超过100%?这不是在开玩笑吧!”但事实摆在眼前,由不得我不信。

一、问题初现:CPU使用率离奇飙升

我迅速登录到服务器上,使用top命令查看CPU使用情况。妈呀,CPU使用率确实快爆表了!一般来说,CPU使用率超过100%就意味着有多个核心都在满负荷运行,但飙到900%简直是前所未闻。

我开始怀疑是不是自己眼花看错了,或者是系统出了什么bug。但经过多次确认,CPU使用率确实稳稳地保持在900%左右。这下我彻底懵了,这到底是什么鬼情况?

二、初步分析:可能的原因

我冷静下来,开始分析可能导致CPU使用率飙升的原因:

1、多线程疯狂:Java应用是个多线程的大家伙,是不是某个线程池里的线程数设置得太多了,导致线程爆炸?这些线程可能在疯狂地执行某些操作,导致CPU使用率飙升。

2、死循环或高复杂度算法:代码里是不是有死循环,或者某个算法的时间复杂度太高,把CPU给榨干了?这种情况在之前也发生过,某个开发人员不小心写了个死循环,导致CPU使用率一直居高不下。

3、外部攻击:系统是不是被黑客攻击了,比如DDoS攻击,导致CPU使用率异常?虽然我们的系统安全性一直做得不错,但也不能完全排除这种可能性。

4、资源争抢:是不是多个应用部署在同一台服务器上,互相抢资源,把CPU给抢爆了?我查看了一下服务器的部署情况,发现确实有几个其他的应用也在运行。

三、深入调查:一步步定位问题

1. 查看Java进程

为了找出问题的根源,我先用ps -ef | grep java命令找到Java进程的PID。然后使用top -H -p [PID]命令查看该进程下所有线程的CPU使用情况。经过一番查找,我发现有一个线程的CPU使用率特别高,肯定是它搞的鬼!

2. 线程Dump分析

接下来,我用jstack [PID]命令生成了Java进程的线程Dump文件。然后找到那个CPU使用率高的线程的线程ID,转换成16进制,在Dump文件里搜索。嘿,还真找到了!我一看线程栈,原来是在执行某个复杂的数据库查询操作!

3. 代码审查与SQL优化

拿到这个线索后,我赶紧去审查对应的代码。一看,果然发现了一个问题:查询语句里有个地方使用了笛卡尔积,导致数据量一大,查询就特别慢,CPU也跟着飙高。我赶紧把这个问题反馈给了这部分代码的负责同学,并让他们优化SQL语句。经过一番努力,他们重写了查询语句,确保了查询效率。改完后,本地测试一下,查询速度果然快多了。

4. 检查线程池配置

在解决数据库查询问题的同时,我也开始检查线程池的配置。我发现线程数确实设置得有点多,根据服务器的核心数和业务需求,我调整了一下线程数,避免线程过多导致资源争抢。

5. 监控与日志分析

在解决问题的过程中,我还加强了监控和日志分析。我配置了系统监控工具,实时监控服务器的CPU、内存、磁盘等性能指标。同时,我也增加了日志记录的详细程度,以便在出现问题时能够更快地定位问题。

四、解决问题:综合施策,彻底根治

经过一系列的调查和分析,我终于找到了问题的根源,并采取了相应的措施来解决问题:

1、优化SQL语句:开发团队重写了复杂的数据库查询语句,避免了笛卡尔积的使用,提高了查询效率。

2、调整线程池配置:我根据服务器的核心数和业务需求,合理设置了线程池的线程数,避免了线程过多导致的资源争抢。

3、加强监控和日志分析:我配置了系统监控工具,并增加了日志记录的详细程度,以便在出现问题时能够更快地定位问题。

4、分离部署:为了避免多个应用互相抢资源导致的问题,我将部分应用迁移到了其他服务器上,确保了资源的合理分配。

改完代码和配置后,我重新部署了应用,并密切监控CPU使用情况。过了一会儿,CPU使用率终于降下来了,回到了正常的水平。我心里的一块大石头也终于落地了。

五、总结与反思:经验教训与未来规划

这次事件虽然惊心动魄,但也给了我们一些宝贵的教训和启示:

1、代码审查要严格:定期对代码进行审查,及时发现并修复潜在的性能问题。这次事件就是由于一个不经意的笛卡尔积导致的。

2、监控要到位:建立完善的监控系统,实时监控服务器的各项性能指标,一旦发现异常立即处理。这次我们能够迅速定位问题并解决,很大程度上得益于监控系统的帮助。

3、资源规划要合理:根据业务需求合理分配服务器资源,避免资源争抢导致性能问题。这次我们将部分应用迁移到其他服务器上,就是出于这个考虑。

4、多线程使用需谨慎:在使用多线程时,要特别注意线程数的设置和线程的管理,避免线程爆炸导致性能问题。这次事件就是由于线程数设置过多导致的。

通过这次事件的处理,我们不仅解决了CPU使用率飙升的问题,还对整个系统的性能和稳定性进行了一次全面的检查和优化。同时,我们也意识到自己在系统运维和代码审查方面还有待加强。未来,我们将继续加强这方面的工作,确保系统的稳定运行和业务的顺利发展。希望以后不会再遇到这么离谱的问题了!

责任编辑:武晓燕 来源: 石杉的架构笔记
相关推荐

2023-03-26 00:48:14

CPUSQL性能

2024-10-21 00:00:01

Linux服务器CPU

2023-03-05 22:30:25

JavaCPU

2021-01-27 05:46:56

CPU占用率命令

2021-01-28 09:28:47

CPU Linux安全

2022-09-16 08:16:25

策略模式算法

2021-04-26 08:16:18

CPU 语言编写

2023-03-20 00:00:00

2017-02-16 19:39:29

Windows 10System进程CPU

2023-03-02 07:49:38

2021-12-30 09:40:08

运行 Linux虚拟机

2023-03-29 08:41:44

ChatGPT转换器人工智能

2012-04-05 12:30:36

Lumia 900

2020-10-12 14:18:15

CPU技巧代码

2017-04-06 08:13:51

SPARC64

2023-02-09 15:28:19

鸿蒙编译速度

2012-03-17 21:05:36

Lumia

2023-04-26 07:16:25

游戏掉帧CPU

2018-09-30 15:30:44

CPU涨价主机

2021-07-07 10:05:38

进程CPULinux
点赞
收藏

51CTO技术栈公众号