程序员不小心把服务器CPU打到100%,展示教科书排查过程

新闻 前端
大家写的时候也要注意很多小坑,这次我就给个demo顺便带大家温习一下线上故障的排查,下次我可能搞点内存泄露,集群宕机什么的故障,这样就有素材了呀。

[[320932]]

 你们没发现我最近的原创原创少了很多嘛,一是最近花了很多时间做视频,本来我写文章就是利用周末的两天时间,但是现在基本上两天都要拍摄剪辑了,尽管请了小伙伴做字幕,还是得耗费大量时间在拍摄和剪辑上。

所以我只能利用工作日熬一下才能写出来了,这周因为要发布,本来是没排期写文章的,你们也看到了我发了两个视频嘛。

但是今天我一发布就吓尿了….

事情是这样的…..

我和小组伙伴最近负责的系统今天上线了,因为涉及到的业务特别多所以选择白天发布,怕出问题找不到对应的负责人。

看到3点25那个full gc没,我发布上去一分钟不到就疯狂GC,我当时就吓尿了,马上点了回滚按钮。

阿里程序员不小心把服务器CPU打到100%,展示教科书排查过程

而且我发现cpu几乎在我发布的瞬间,直接打到了峰值。

阿里程序员不小心把服务器CPU打到100%,展示教科书排查过程

所幸只发布了一台,我紧张的望向了周围,发现周围的同事没注意到我,我顿时没那么紧张了,拿起桌上用剩下的纸巾搽掉了我鬓角马上留下的汗水。

我其实已经知道大概是什么问题了,无非就是死循环,或者大对象什么的。

但是我还是想找个人承担这个锅。

[[320935]]

我马上找到三歪,我问他:你刚才是不是点过我的系统?

他说:对啊,我刚才点了,我本来就经常使用你的系统,咋了?(刚好正中下怀嘻嘻)

我说过多少次啊,叫你不要乱点,这已经不是第一次了,现在把我的系统点坏了,怎么办?都怪你。

他:委屈巴巴一副要哭的样子。

[[320936]]

我:诶,算了算了,下次注意哈,我去排查下什么情况,看看你点坏了哪里。

他:丙哥真好,丙哥真棒,丙哥我爱你。

总算是找到背锅侠了,我就开始排查问题吧。

注:以下代码都是伪代码,为了还原排查过程

一般CPU100%疯狂GC,都是死循环的锅,那怎么排查呢?

先进服务器,用top -c 命令找出当前进程的运行列表

按一下 P 可以按照CPU使用率进行排序

显示Java进程 PID 为 2609 的java进程消耗最高

阿里程序员不小心把服务器CPU打到100%,展示教科书排查过程

然后我们需要根据PID 查出CPU里面消耗最高的进程

使用命令 top -Hp 2609 找出这个进程下面的线程,继续按P排序

可以看到 2854 CPU消耗最高

阿里程序员不小心把服务器CPU打到100%,展示教科书排查过程

2854是十进制的,我们需要转换为十六进制,转换结果:b26

接下来就需要导出我们的进程快照了,看看这个线程做了啥

  1. jstack -l 2609 > ./2609.stack 

再用grep查看一下线程在文件里做了啥

  1. cat 2609.stack |grep 'b26' -C 8 

我这里就随便定位一个,基本上这样查都可以定位到你死循环的那个类,那一行,这里你还可以在jstack出来的文件中看到很多熟悉的名词,至于是啥,你们留言告诉我好了,就当是个课后作业了。

阿里程序员不小心把服务器CPU打到100%,展示教科书排查过程

我写了个伪代码,看看当时我为啥会写出这个死循环,对了当时我上线的是预发,也是后台系统非线上的,虽然都是自己在玩,但是大家还是要引以为戒。

阿里程序员不小心把服务器CPU打到100%,展示教科书排查过程

我当时写了个代码准备去查出数据库的数据,订正下日期,仔细看没问题,但是我忘了数据库的偏移值自己去计算了,因为以前都是框架,自己临时写的就没管。

导致每次都能查出10个数据,在最后判断的时候就一直true不退出了,其实最后会退出,但是得循环很多次。

我这里退出的逻辑比较取巧,就是想着最后一次查询肯定跟我的页数不一样,那就是最后一页了,那我就处理完退出。

结果没想到也是个坑了。

大家写的时候也要注意很多小坑,这次我就给个demo顺便带大家温习一下线上故障的排查,下次我可能搞点内存泄露,集群宕机什么的故障,这样就有素材了呀。

如果真出问题,第一时间找个三歪这样的背锅侠,排查过程自己去电脑上操作一下,最近有点忙,准备写个分布式锁的文章,如何?

我是敖丙,一个在互联网苟且偷生的工具人。

责任编辑:张燕妮 来源: 今日头条
相关推荐

2021-06-21 07:44:07

程序员面试职场

2021-03-03 00:02:47

服务器电源消息

2021-04-30 08:21:22

Linux管道设计

2021-10-07 16:45:06

MySQL数据库

2022-10-25 17:53:09

Java线程池

2021-01-08 09:36:23

程序员比特币黑客

2019-07-29 14:38:35

服务器开发工具

2021-01-30 09:50:54

MySQL密码服务器

2019-06-10 15:20:18

2020-10-28 15:07:01

Arthas

2021-03-26 06:14:26

Hashcode项目排查

2018-11-13 10:44:23

Linux服务器双网卡网络

2021-01-05 22:49:37

Python编程语言Java

2016-10-17 19:14:28

2023-03-10 08:27:07

for循环项目线性结构

2021-07-28 05:01:29

Lombok前端测试

2019-08-01 14:12:49

Linuxrm命令lsof命令

2015-05-05 16:33:38

Easyrecover

2020-05-19 08:30:33

kill -9命令Linux

2020-10-26 08:56:32

技术总监程序员
点赞
收藏

51CTO技术栈公众号