01、起因

定位一个线上问题 - 图1
朋友遇到个问题,我的回答是这样的:
定位一个线上问题 - 图2
本来以为这样就结束了,其实才刚刚进入正题;

02、问题原因定位

朋友把文件下载下来:
定位一个线上问题 - 图3
文件好大,这么大的文件咋统计出来是哪类线程最多呢?这就到了妥妥的文本处理内容了(关键时候这类文本命令可以帮助提供非常多的效率);
我们打开文本看看内容:
定位一个线上问题 - 图4
一共有 80 万行,我们来看下规律:
定位一个线上问题 - 图5
每个线程的开始都是” 开头,我们仅仅是需要获取线程名即可,那么就简单了,不是的” 开头都删除即可;

  1. 输入命令:
  2. :v/"/d

定位一个线上问题 - 图6
之后效果:
定位一个线上问题 - 图7
80 万的文件仅仅只剩 6.66 万行了,每一行都是一个线程,我们需要提取线程名称进行排序:
定位一个线上问题 - 图8
发现规律线程名称就是”线程名称” 被(双引号包围的)
定位一个线上问题 - 图9

  1. 输入命令:
  2. cat jstack.txt| awk -F '"' '{print $2}'>thread.txt

那么我们通过 awk 进行操作;
我们发现确实获取到了线程名称了,但是线程名称后面有后缀,我们需要把后缀给去掉,因为他们都是一类,等会我们还需要汇总统计的;定位一个线上问题 - 图10
那么这个时候正则表达式就要起作用了,

  1. 输入命令:
  2. :%s#\d\+$##g

定位一个线上问题 - 图11
执行效果如下:
定位一个线上问题 - 图12
接下来就简单了,进行排序,之后获取重复次数的计数即可统计了;

  1. 输入命令:
  2. cat thread.txt|sort |uniq -c |sort -nr |head -10

效果如下:
定位一个线上问题 - 图13
到这里我们就基本知道是哪个线程了,接下来的事情就比较简单了,告诉朋友,朋友很快就定位解决了;

03、总结

文本类的处理,还是需要熟悉的,很多时候排查定位问题还是需要这类技能的,希望今天的这个案例可以让你有所收获;