有没有发现我最近的原创少了很多?一是我最近花了很多时间制作视频。本来利用周末写文章需要两天的时间,现在基本上两天都要拍片和剪辑。虽然请了小伙伴做字幕,但还是要花很多时间在拍摄和剪辑上。所以我只能利用我的工作时间写出来。因为这周要发表,所以没安排写文章。您还看到我发布了两个视频。但是今天一放出来吓尿了...事情是这样的...我和队友最近负责的系统今天上线了。因为涉及到很多业务,所以选择白天发布。怕出问题,找不到对应的系统。主要的。3点25分看到fullgc不可用,我贴出来没一分钟GC就疯了。当时吓尿了,立马点了回退键。而且我发现cpu几乎在我释放的一瞬间就达到了峰值。幸运的是,只有一个被释放了。我紧张地环顾四周,发现周围的同事都没有注意到我。我突然不那么紧张了。我拿起桌上剩下的纸巾,擦了擦太阳穴留下的汗水。.其实我已经知道是什么问题了,无非就是死循环,或者大对象什么的。但我还是想找人来背锅。我马上找到三外,问他:你刚才是不是点了我的系统?他说:是的,我刚刚下单了,我也经常用你们的系统,怎么了?(就在胸口正中,呵呵)跟你说了多少次了,别乱来,这又不是第一次了,现在我的系统坏了,怎么办?都是你的错。他:委屈巴巴一副要哭的样子。我:哎,算了,下次注意点,我查查是怎么回事,看看你的订单哪里坏了。他:冰哥真好,冰哥好棒,冰哥我爱你。终于找到负责人了,我就开始排查问题了。注:以下代码均为伪代码。为了还原排查进程,一般CPU100%疯狂GC就是死循环的锅,那么怎么排查呢?在高级服务器中,使用top-c命令可以找出当前进程的运行列表。按P按CPU使用率排序。PID为2609的java进程消耗最多。然后我们需要根据PID找出CPU消耗最高的进程。命令top-Hp2609找出这个进程下的线程,继续按P排序,可以看到2854CPU消耗最高2854是十进制,我们需要将其转换为十六进制,转换结果:b26接下来,我们需要导出我们的进程拍个快照,看看这个线程做了什么jstack-l2609>./2609.stack然后在文件cat2609.stack|grep'b26'-C8中用grep查看这个线程做了什么我会的就在这里定位一个,基本上这样,你就可以在你的无限循环中定位类和行。在这里你还可以在来自jstack的文件中看到许多熟悉的术语。至于是什么,请留言告诉我,就当成课后作业了。我写了一个伪代码看看我当时为什么要写这个死循环。对了,我上线的是pre-release,后台系统下线了。虽然是我自己玩的,但是大家还是要引以为戒。我当时写了个代码,把数据库里的数据找出来,修正日期,仔细看还好,但是忘记自己计算数据库的偏移值了,因为以前是做框架的,还有临时写了也没关系。结果每次能检测到10条数据,最后判断一直为真,没有退出。其实最后会退出,但是要循环很多次。我这里退出的逻辑比较tricky,就是觉得最后一个query肯定和我的页码不一样,也就是最后一页,然后处理完就退出了。原来也是个坑。写的时候也要注意很多小坑。这次我就来一个demo,带大家回顾一下在线故障的排查。下次我可能会做一些内存泄漏,集群宕机等故障,这样才有素材啊。有问题第一时间找三外这样的靠山,在排错过程中到电脑前操作。最近有点忙,准备写一篇关于分布式锁的文章。这个怎么样?我是敖丙,一个生活在互联网上的工具人。
