00:00
好,那么同学们,下面我们呢?来看看第十题。假如生产环境出现CPU占用过高,谈谈你的分析思路和定位?只刚才有些同学呢来问我说,杨哥,你干嘛还留着这个妖孽是吧?把他杀了不就完了吗?知道了吧,杨哥自有安排。OK,那么来了,不多废话,那么这个呢,结合我们讲过的这个S,前面的这些GVM命令参数,再加上我们的前面的这些Linux高级命令抬高。首先啊,他也会问你说记忆次印象深刻的故障,或者说你,呃,这个故障当中,你应该会去怎么排查,一般基本上一嘴就说一般你怎么查故障啊啊查一下百度啊啊,一般你怎么查故障啊,啊看一下日志啊,100%就是没有工作经验的。只要回答这两个。项目项目经理心里面已经知道,这小子撑死也就是什么一万一万二不能再多了,你的水平也就这样,当然你还会觉得就是说我没答错啊,大哥,不是你答的对和错,而是你答的根本就没有答到点子上,我直接告了当的告诉大家,比方说一些这种故障。
01:12
什么出现CPU占用过高,你去看什么日志,看不出来什么鬼的,那么必须要结合我们的Linux和JDK的命令一块分析,我们呢来看一下我们的案例步骤,那么这个呢就比较重要,这个case好,甚至可以,这个case呢你可以呢。讲一个什么记一次印象深刻的故障,你是怎么故障现象导致原因调优排错怎么弄出来的?好,我们的步骤如下。第一个。先要用拓扑命令找出CPU占比最高的,那么刚刚好我们查过。那么现在是一个Java命令导致啊,对不对,3928那么好,那么这个时候同学们我们呢,还在这跑着呢,那么现在。突破,那么找我们这个Java命令啊,这个不是啊,同学们不要管,这个是我们的控制台,听懂了吗?Go tell me,这个是,你看是不是控制台终端。
02:07
现在给我们惹事儿了。是5101这个Java程序,OK,那么好,同学们找到了,我们只要记录下。他的PID。那么第二步,杠EF或者是GPS,那么杠EF竖线gra Java或者GPS-L,进一步定位,得知是怎样一个后台程序给我们惹事,那么来同学们漏一眼看看,杨哥用的是杠F,那么好吧,我们再来一次,把两个命令都复习一下,好,那么这个时候那么给大家看。窗口开的太多了是吧。这一个呢,是。我就把它关掉一个吧,那么这个是出事的这个对吧,这个控制窗口,那么大家看GPS啊,杠L,我们可以得到是哪个Java程序,是不是5101这个,那么还有一种是杠EF竖线grape Java竖线gra,杠v grape,那么你懂的。
03:01
这个什么格干V什么意思就不多废话了,你看现在是不是纯纯的有这么一个程序,干嘛5101好,我们得到了我们惹事的进程编号是这货,那么我们呢,直接拷贝。好,那么接下来同学们请看。红色重要。第三步,要定位到具体的线程或者是代码,那么言下之意就是你要告诉我哪个程序有的事定位到是哪一行。出的错。你看日志。很准快,那么这个时候同学们请看。我们呢,直接用这么一个。命令来给大家处理。来。杠MP,注意不是杠EF了,这些是些什么?我们待会说那杠MP,然后进程编号5101-o thread注意什么?ID是不是从进程变成了线程ID了?
04:01
其实具体干活的是不是还是那些线程,那么过来同学们。能不能我们呢?第三部粘贴。就会发现5101这个总的下面,你看它占CPU是36.4%这么多,多多下面这个进程里面有一个叫5102的线程。听懂了吗?择出来有问题的是这货。5102,那么这个是干什么呢?定位到具体的线程。注意没到进程了,是线程了或者是代码,那我们可以看得出现在。我们用这个命令,那么杠MP干嘛?PID和time就是哪一个线程已经耗费了多少时间。那么。蓝色的横,红色的纵,3929这个线程。Idea。听懂,那么得知到我们这儿是不是就是我们这的这个5102啥意思呢?然后大家看ID,大家漏一眼tid是不是这5102没问题吧?好,那么接下来我们要看看这三个参数啊,什么杠NP什么意思了,我给大家解释一下,杠M显示所有的线程。
05:18
注意,不是进程是什么程线程。P是。具体的进程编号使用CPU的时间哦,是个参数,之后是用户自定义的格式,我要哪一找,我以现成的现成ID号加上现成的时间,那么大家看现成。那么这个是什么?然后线程的TD和time,也就是说对于线程,我要拿线程号和它耽误的时间,占用CPU的时间,我们这儿看了5102,那么。第。三步完活,那么第四步我们要干什么呢?既然需要的现场ID要转换为16进制的格式,取英文小写的什么意思啊,因为哈线程在内存里面跑。
06:08
它是16进制的,我们现在已经知道了5102这个线程给我们惹事儿,那么这个惹事儿以后,我们要定位到它具体代码里面是哪一行给我们惹的事,那么这样定位比较准,不用去看什么日志啊,那么这个时候我们呢,就要用这样的一个命令。和有问题的线程,那么直接一敲在0NU四面就搞定,那么当然你说我不会,那怎么办呢?嗯。杨哥教一个简单的方法,那么干嘛呢?计算器总该会用吧,那么干嘛?十进制的5102。那么大家。看一下对于我们16进制而言干嘛,是不是就是1311这么一种转换,那计算器你总该会用了吧?十进制的,你看这是不是5102转换成16进制啊,就叫1311这么说能跟上,注意严格的要求,英文什么写小写啊,它计算器是转成大写,我们在机器内存里面全是小写啊,这块幺三一键十进制的线程。
07:14
好,5102换成16进制啊,就叫131G,好,它的这个计算器的作用跟这个的作用一样。好了,那么接下来我们呢?执行我们的。最后一个命令用JS sta j sta,讲没讲过,前面我们看什么思索的时候是不是说过不废话了?那么进程ID是多少五幺?零幺,然后在什么5101这个进程里面,我们要带看它的运行轨迹。然后呢,Grape tidd,注意是16进制的线程ID的小写英文,那么这块是不是叫13。能跟上打印出正序。打印出多少前60行,那么这个时候同学们,我们呢,弄到这儿。
08:07
过来这我一粘贴。一回车唰出来,我们迅速就会看到一个东东,那么这些是些什么鬼啊?那么来,同学们。5101,有没有看到这儿有一个。NID。线程的IDNX16进制啊,1311跟我们转换的是不是一样,此时正在reable,那么干什么呢?这些啪啦啪啦你不用去管,你就找哪一个是你们公司的名字啊,大家请看,他就告诉你现在这个有问题的131这个线程ID,哪一行代码是第十行代码给我们惹的祸,那么二话不说,现在我们打开我们源代码,那么这个时候同学们大家请看。这块多少含十第十行说明我们这是不是这一行代码出了我们的问题,一抓一个准,从底层我们推断出是哪一行代码给我们有的事,那么这段代码的前后的业务逻辑我们具体检查一下,是不是可以比看日志查百度用这样的底层命令和内存分析进程线程的分析可以给我们更快的识别出干嘛我们的故障和分析思路,那么CPU占用过高,那么要求同学们干嘛?课后。
09:28
按照严格的这五步把它复现一下,好,那么这个就是CPU占用过高,我们的定位分析思路。
我来说两句