12

架构师说了:不想做背锅侠?生产问题要这样查

 3 years ago
source link: http://news.51cto.com/art/202010/629060.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

f6fYZ3B.jpg!mobile

话说这天一大早,那个悲催的中年架构师大刘又被手机微信群给炸醒。部门的运维兄弟在公司微信群里说:

短信的生产环境服务器 CPU 占用率过高,疯狂报警。是不是你们昨天上线看门狗导致的?

大刘迷了巴登的想了想,没错,昨天确实给短信服务装上了看门狗。但是看门狗服务肯定不会有问题(架构师必备的蜜汁自信),而且上线之前各轮测试也都测过了,没见过这个想象啊。

难道是测试妹子没测试到位?难道线上短信应用自身出现了问题?

生产无小事,小事更不能忽视,主要是怕扣绩效奖金。大刘迅速打开电脑,远程登上短信生产服务器,开始大刘最拿手的 2W1H 三板斧诊断之旅。

接下来的诊断内容有点烧脑,节奏有点快,请大家坐稳扶好。

1. 病号是谁(WHO)?

大刘拿出控制台诊断仪器,输入 top 命令一探究竟。我勒个去,不看不知道一看吓一跳,PID 为 1878 的病号,CPU 占用居然 200% 多。

qaUJnev.png!mobile

问题算是定位到了,但是 PID 为 1878 的病号到底是谁,难道真是昨天上线的看门狗 ?虽然大刘久经职场,但是排查生产问题时,内心还是比较忐忑,毕竟这是生产环境。说时迟那时快,只见大刘一个命令输入:

ps -ef | grep 1878 

定睛一看,原来是放屁瞅别人,短信服务自己在作祟,和看门狗没关系,大刘心里一下子平缓了不少。锅找到了主儿,其实这个时候大刘完全可以把这个问题甩给短信开发团队,但是大刘最喜欢做的不是甩锅,而是打破砂锅刨到底。

2. 病号哪里出了问题(WHERE)?

为什么 1878 号病人占用 CPU 会这么高呢?只见黑乎乎的控制台诊断仪器上,大刘熟练的输入:

jstack -l  1878 >> 1878号病历.log 

这样便得到一份 1878 号病人的病历详情单,一会儿用得上。到底 1878 号病人的哪个部位出了问题呢?话没说完,只见大刘又在控制台诊断仪器上,输入一个:

top -Hp 1878 

白板黑字,把 1878 号病人的器官信息全部列了出来。

A7jieaf.png!mobile

看到结果,甚是一惊,PID 代号为 8721 的器官占用 CPU 100% 多。疑惑油然而生,这个 PID 代号 为 8721 的器官是啥,是头、是眼睛、还是胳膊腿呢?这些器官展示的 PID 列都是昵称,都这么善于伪装,如何揭露它的真面目呢?还好大刘有高招,借助照妖镜算法,熟练的输入:

printf "%x\n" 8721 

果真使得代号为 8721 的器官,现了真身,真实身份居然是 2211 的呼吸道,怪不得病号一直气喘吁吁,上气不接下气。

m6NBZzq.png!mobile

到这一步还无法对症下药啊,还需要进一步确诊 2211 的呼吸道到底出了什么幺蛾子,导致 1878 号病人一直气喘吁吁,上气不接下气?只见黑乎乎的控制台诊断仪器上,大刘再次飞一般的在输入:

grep 2211 -A20 1878号病历.log 

诊断结果随之显示在诊断仪器上。

aym6zqF.png!mobile

曾经背了很多锅的大刘,看到诊断结果心里乐了一下,一眼就看出是高并发情况下用了 HashMap 的问题(请大家们自行寻找谷歌、百度,就不在此深入展开啦),终于拨开云雾见青天。

3. 如何对症下药( HOW )?

在大刘行云流水没有一丝一毫的拖泥带水般的神操作下,1878 号病人的诊断也就结束了,这个锅就彻底被打破了。术业有专攻,大刘就可以郑重的告诉短信开发同事具体原因了,捉得病根,开发同事也就可以对症下药啦。大刘这套行走江湖的诊断问题方式你 get 到了没?大刘自己简单概括为 2W1H 三板斧:病号是谁、病号哪里出了问题、对症下药。

1、病号是谁?(WHO)

  • 第一步:采用 top 命令,找出 CPU 占用最高的病号 PID ;
  • 第二步:通过 ps -ef | grep PID 查看病号对应的真实身份。

2、病号哪里出了问题?(WHERE)

  • 第一步:采用 jstack -l PID >> PID.log 获取病号的各器官信息的病历单;
  • 第二步:采用 top -Hp PID 拿到占用 CPU 最高的器官昵称 PID ;
  • 第三步:采用 printf "%x\n" PID 根据器官昵称 PID 的拿到器官真实身份 TID ;
  • 第四步:采用 grep TID -A20 pid.log 根据 TID 去病历单中匹配,确定是哪出了问题。

3、捉得病根、便可拿出医药箱,对症下药啦。(HOW)

作为程序猿,工作中难免会遇到不少类似这样的问题。面对问题,你如果像无头苍蝇一样乱撞,撞得头破血流依然不知道缘由,在背锅即将成为现实时,那就不妨试试大刘的 2W1H 三板斧的诊断方式,说不定会帮你快速定位、解决线上问题,毕竟快速的解决生产问题会把损失降到最低。最后,想对大家说一句:作为程序猿,一定要有程序猿的态度。避免背锅,拒绝甩锅,打破砂锅,从你我做起。

本文转载自微信公众号「四猿外」,可以通过以下二维码关注。转载本文请联系四猿外公众号。

7NbAZj.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK