这是一篇来源于阿里内部技术论坛的文章,原文在阿里内部取得共同好评。作者已经把这篇文章开放到云栖社区中供外网拜访。Hollis对文章内容做了部分删减,首要删减掉了其间只要阿里内部才干使用的东西g J E的介绍,并删减掉部分只要经过j n _ b |阿里内网才干拜访到的链接。

前语

平常L x + ; ! 8 zQ W 9 ~工作中常常碰到许多疑难问题的处理,在解决问题的一起,有一些东西起到了B 9 6 & b *适当大的作用,在此书写下来,一是作为笔记,能够让自己后续忘记了可快速翻阅,5 m $ – 9 # z二是共享,希望看到此文的同学们能够拿出R I U v t自己日常觉得协助很大的东西,我们一同前进。

闲话不多说,开搞。

Linux指令类
tail
最常用的tail] p 1 V { u -f

tail -300f shopbase.log #倒数300行并进i K r入实时监听文件写入模式

grep

grep fo+ ` / $rest f.txt     #文件查找
grep forest f.txt cpf.txt #多文件查找
grep 'log' /home/admin -r -n #目录下查找一切契合关键字的文件
c[ M - % , | j wat f.txt | grep -i shopbase
grep_ y n 0 N ( t : c E y 1 ! k U # z'shopbaseq n R _ : ` ) f C' /home/admin -r -n --include *.{vm,java} #指定文件后缀
grep 'shopbase' /home/admin -r -n --exclude *.i A . J 4 7 Y N 5{vm,java} #反匹配
seq 10 | grep 5 -A 3    #上匹配
seq 10 | grep 5 -Bx | ? ^ x w 3    #下匹配
seq 10 | grep 5 -C 3    #上下匹配,平常用这个就妥了
cat f.txt | grep -Q f _ m ( rc 'SHOPI j ` y ) O LBASE'

awk
1 基础指令

awk '{prin- - L P ? -t $4,$6}' f.txt
awk '{print NR,$2 B ` ` I ? @ 3 00}' f.P s ^ L V K 2 ^txt cpf.txt
awk '{print FNR,$0}' f.txt cpf.txt
awk '{print FNR,FILENAME,$0}' f.tx= g b B z {t cpf.txt
awk '{print FILENAME,"NR="NR,"FNR="FNR,"$"NF4 g c"="$NF}' f.txt cpf.txt
echo 1:2:3:4 | awk -F: '{print $1,$2,$3,$4}'

2 匹配

awk '/ldb/ {print}' f.txt   #匹配ldb
awk '!/ldb/ {print}' f.txt  #不匹配ldb
awk '/ldb/ && /LIg & ~ u & } s jSTEN/I 3 i a ? / F g {pr? R C , 2 o Tint}' f.txt   #匹配ldb和LISTEN
awk '$5 ~ /ldb/ {pra 7 x y r Eint}'| ] v ( f.txt #第五列匹配] g U z 6 R u pldb

3 内建变量

NR:NR表示从awk开端履行后,依照记载分隔符读取的数据N ! } N ^ T H次数,默许f = O Z & ) X 2的记载分隔符为L r h换行符,因此默许的便是读取的数据行数,NR能够理解为Number of[ * 3 t 6 8 c @ Record的缩写。

FNR:在awk处理多个输入文J Z @ a D件的时分,在处理完第一个文件后,NRk a 5 q并不会从1开端,而是持续累加,因此就呈现了FNR,每逢处理一个新文件的时分,FNR就j 5 z W t A 1 3从1开端计数,FNR能够理解为File Numbp h Y V [ ;er of Record。

NF: NF表示目前的记载被g 1 3 u )切割的字段的数目,NF能够理w r ~ O解为Number of Field。

find

sudo -u admin find /H K T ] ehome} K t p W ` -/admin /tmp /usr -naS :  G @ ) ame *.log(多个目录去找)
find . -inae t ? + ? Tme *.txt(大小写都匹B G c I j k配)
find .A G 4 j R d p } d -type d(当时目录下的一切子目录)
find /usr -type l(当时目录下一切的符号链接)
find /usr -type l -name "z*" -P :  V j c bls(符号链接的具体信息 eg:inode,目录)
find /home/admin -size +250000k(超过250000k的文件,当然+改成I b , x = 6 #-便是小于了)
find /home/admin f -perm 777 -exec lU G as -) : + ` N K = Tl {} ; (依照权限查询文件)
find /home/admin -atime -1  1天内拜访过的文件
find /home/admin -ctime -1  1天内状况改变x f | :过的文件
find /home/admin -mtime -1  1天内修改过的文件
find /home/admin -amin -1  1分钟内拜访过的文件
find /home/admin -cmin -1  1分钟内状况改变过的文件
find /home/admin -mmin -1  1分钟内修改过的文件

pgm
批量查询vm-shopbase满足条件的日志

pgmR 7  z -A -f vP ] h Z h K B am-shopbase 'cat /home/admin/shopbase/logs/shopbase.log.2017-01-17|grep 2069861630'

tsar
tsar是咱公司自己的采集东西。很好用, 将前 r U W o史收集到的数据持g o [ {久化在磁盘上,所以我们快速来查询前史: @ ] b i的体系数据。当然实时的使R X D # T c / u用状况也是能够查询的啦。大部分机器上都有装置。

tsar  ###能够检查最近一天的各项I [ j O * c _ z -目标

阿里内部员工,排查Java问题常用的工具单

tsar --live ###能够检查实时目) % 4 d u j标,默许五秒一刷

阿里内部员工,排查Java问题常用的工具单

tsar -d 20161218 ###指定检查某天的数据,形似最多只能看四个月的数据

阿里内部员工,排查Java问题常用的工具单

tsar --mem
tsar --load
tsar --cp: + C Z 9 4 _ Tu
###当然这个也能够和-d参数合作来查询某天的单个目标的状况 

阿里内部员工,排查Java问题常用的工具单
阿里内部员工,排查Java问题常用的工具单
阿里内部员工,排查Java问题常用的工具单
top
top除了看一些根本信息之外,剩余的便是合作来查询vm的各种问题了

ps -ef | grep java
top -H -p pid

取得线程10进制转16进制后jstack去抓看g 9 P v : 5这个线程到底在干啥

其他

netstat -nat|J J L W &awk  '{print $6}'|sort|uniq -c|sort -rn
#检查当时连接,留意close_wait偏高的状况,比方如下

阿里内部员工,排查Java问题常用的工具单
阿里内部员工,排查Java问题常用的工具单

排查利器

btrace
首战之地的要说的是btrace。真是生产环境~ _ ) Z&预发的排查问题大杀器。简介什么的就不说了。直接上代码干

1、检查当时谁调用1 z 0了ArrayList的add办法,一起只打印当时ArrayList的size大于500的线程调用~ : h f X E I

@k f   & S GOnMethod(clazz = "jh ] s S 3 X 1ava.utiq e ` ol.ArrB f - - VayList", method="add", location = @Location(value = Kind.CALL, clazz = "/.*/", method = "/.*/"))
public static void m(@ProbeClassName String probeClass, @PrZ e , / Y u $ nobeMethodName String probeMethod, @m a u V } V V  #TargetInstance Object instance, @TargP / W $ |etMethodOrFie6 b a 6 X 7 R 5 jld String method^ L a S y f) {
if(getInt(field("java.util.ArrayList", "size"), instance) > 479){
println("z X 3 tcheck who ArrayList.add method:" + probe+ T W Q RClass + "#" + probeMethod  + ", method:v { ^ l q" + met9 N M } e  , ^hod + ", size:"W _ s + getInt(field("java.utY ^ z $il.ArrayList", "size"), instance));
jstack();1 y . * p ` U 3
println();
println("~ G  5===========================");
println();
}
}

2、监控当时g f 9 J l服务办法被调用时返回的值以及D K + n / c ? Z L请求的! [ a m参数

@C l ? l s S lOnMethod(clazz = "com.taobao.sellerhome.t: 4 f , ) m lra* T 7  9 1 { 2 $nsfer.biz.impl.C2CApplyerServiceImpl", method="navG P ` A ! {", location = @L% i ? f I ~ Oocation(value = Kind.RETURN))
public static void mt(long userId, int current, int relat7 y X vion, String check, String redirectUrl, @Return A7 H FnyType result) {
println("parameter# use] ] orId:" + userId + ", current:" + current + ", relation:" + rel$ @ s ] 6 1 w K Zatio? ? y b w # = E yn + ", check:" + check + ", redirectUrl:" + redirectUrl + ", result:" + result);
}

更多内容,感兴趣的请6 r U ( 8 B r d C移步:https://github.com/btraceio/btrace

留意:

  • 经过观察,1.3.9的release输出不稳定,要多触发几次才干看到正确的成果
  • 正则表达式匹配trace类时范围一定要操控,不然极有或许呈现跑满CPU导致I ] h h y #使用卡死的状况
  • 由所以字节码注入的原理,想要使用康复到正常状况,需求重启使用。

Greys
说几个挺棒的功用_ G a F ` [(部分功用和btrace重合):

sc -df xQ = w y 3 b I kxx: 输出当时类的详情,包括源码方位和classloader结构

trace class meI 9 &thod: 适当喜欢这个功用! 很早前能够早JProfiler看到] p ; z 这个功用。打印出当时办法调用的耗时状况,细分到每个办法。

javOSize
就说一个功用
classes:经过修改了字节码,改变了类的内容,即时生效。所以能够做到快速的在某个当地打个日志看看输出,缺点是对代码的侵入性太大。可是假如自己知道自己在干嘛,的确是不错的玩意儿。@ m C

其他功用GreysV E d F V u 0和btrace都能很_ m $ Y D s ) /容易做的到,不说了。

JProfiler
之前判别许多问题要经过JProfiler,可是现在Greys和btrace根本都能搞定了。再加上出问题的根本上都是生产环境(网络阻隔),所以根本不怎样使用了,可是还是要符号一下。
官网请移步htt( 7 kps://www.ej-technologies.com/products/jprofiler/overview.html

大杀器

eclipseMAT
可作为eclipse的插件,也可作为独自的程序翻开。z $ o L 0 *
详情请移_ r 2 4 L步http://www.eclipse.org/mat/

ja| n z 7 5 O 3va三板斧,噢不对,是七把

jps
我只用一条指令:

sudz Z /o -u admin /opt/taobao/java/bin/jps -mlvV

阿里内部员工,排查Java问题常用的工具单
jstj S k ` [ack
普通用法:

sudo -u admin /opt/taobaR 3 w y ~o/i] n ; Wnstall/ajG P )  N Ydk-8_1_1_fp1-b52/bin/jstack 2815

阿里内部员工,排查Java问题常用的工具单
native+java栈:

sudo -u admin /opt/taobao/r z p Oinstall/ajdk-8_1_1_fp1-b52/bin/jstack -m 2815

阿里内部员工,排查Java问题常用的工具单
jinfo
可看体系发动的: z c G ] Y G h e参数,如下

sudo -u admin /opt/taob@ z } x , 7ao/install/p t majdk-8_* ` C O c #1_1_fp1-b52/bin[ 2 $ 4 m T ^ l/jinfo -flags 2815

阿里内部员工,排查Java问题常用的工具单
jmap
两个用途

1.检查堆的状况

sudo -u adS m V imin /opt/taok W # Vbao/install/ajdk-8_1_1_fp1-b52/bin/jmap -heap 2815

阿里内部员工,排查Java问题常用的工具单
阿里内部员工,排查Java问题常用的工具单
2.dump

sudo -u admin /opt/taobao/instG O $  ~ 7 Q Wall/ajdk-8_1_1_fp1-b52/bin/jmap -dump:live,format=b,fig f k Z . Q C Gle=/tmp/heap2.bin 2815

或者

sudo -u admin /opt/th 3 ) aobao/insta? 6 r Fll/ajb 3 [ W jdk-8_1_1_fp1-b52/bin/jmap -dump:format=b,file=/tmp/heap3.bin 2815

3.看看堆都被谁占了? 再合作zprofiler和btrace,排查问题简直是如虎添翼

sudo -u3 ( d m admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -histo 2815 | head -10

阿里内部员工,排查Java问题常用的工具单
jstat
jstat参数许多,可是使用一个就够了

sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jss S 3 Z o 3 0tat -gcutil 2815 1000

阿里内部员工,排查Java问题常用的工具单
jdb
时至今日,jdb也是常常使用的。
jdb能够用来预发debug,假设你预发的java_home是/opt/taobao/; q ; ^java/,长途调试端口是8000.那么
sudo -u admin /opt/taobao/java/bin/jdb -attach 8000.
阿里内部员工,排查Java问题常用的工具单
呈现以上代表jdb发动成功。后续能够进行设置断点进行调试。
具体参数可见oracle官方说明http://docs.oracle.com/javase/7/docs/technotes/tools/wind , l *ows/jdb.htc Y k p `ml

CHLSDB
CHLSDB感觉许多状况下能够看到更好玩的东西,不具体叙说了。查询材料听说jstack和jmap等东西便是根据它的。

sudo -u admin /opt/taobao/javaP 5 b &/bin/java -classpath /opt/taobao/java/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB

更具体的可见R大此贴` / T | N K B d
http://rednaxelafx.iteye.com/blog/1847971

plugin of7 : . A m j intellij idea

key promoter
快捷键一次你记不住,多来几次你总能记住了吧?
阿里内部员工,排查Java问题常用的工具单
maven helper
剖析maven依靠的好帮手。

VM options

1、你的类到底是从哪个文件加载进来的?

-XX:+TraceClassLoading
成果形如[Loaded java.H v G %lang.invoke.MethodHandleImpl$Lazy from D:programmejdkjdk8U74jrelibrt.jar]

2、使用挂了输出dump文( R Q * : ! ? D

-X V ) u d L z @X:+HeapDumpOnOutOfMemory| L ZError -XX:HeapDumpPath=/h/ p K a -ome/admin/logsC * u | s ]/java.hprof

jar包冲突6 Q ~

把这个独自写个大标题不过分吧?每个人或多或少都处理过这种烦人的case。我特么下边这么多计划不信就搞不定你?

mvn dependency:tree > ~/de1 ; Dpendency.txt

打出一切依靠

mvn= + f P dependency:t F x w i Z p / etree -Dverbose -Dincludes=groupId:artifactId

只打出指定g? ! 8roupId和artifactId的依靠关系

-XX:+TraceClass2 P LLoading

vm发动脚本参加。在tomcat发动脚本中可见加载类的具体信息

-verbose

vm发动脚本参加。在tomcat发动脚本中可见加载类的具体信息

greys:sc

greys的sc指令也能清晰的看到当时类是从哪里加载过来的

tomcat-clasl . u L t H Gsloader-locate

经过以下urlR s d X t能够获知当时类是从哪里加载的
cu, o O Z f ! a Z srl http://localhost:8? ? % S r ^ 7 /006/classloader/locat] S , De?clasG w n I ] A Es=org.apache.xerces.xs.XSObjec

其他

dmesg

假如发现自己的java进程悄然无声的消失了,几乎没有留下任何头绪,那么df J * n g Imesg一发,很有或许有你想要的。

sudo dmesg|grep -i kill|d  j 6 t Yless

去找关键字oom_killer。找到的成果类似如下:

[6710782.021013] java invoked oom{ ` g a . Z = 6 8-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0
[6710782.070639] [<ffffffff81118898>] ? ooH E D 6 x % w O 1m_kill_process+0x68/0x140
[6710782.25, ` O # A7588] Task in /LXC011175068174 killed as a result of limit of /LXC011175068174
[67107 7  j84.698347] Memory cgroup out of memory: Kill process 215701 (java) score 854 od | * b p ! t lr sacrifice child
[6710784.707978] Killed process 215701, UID 679, (java4 n E ) B { { / ~) total-vm:1 t v z r n g w1017300kB, anon-rss:7152S d m U432kB, file-rss:1232{  ) 4 Y W 1 m 8kB

以上表明,对应的java进程被体系的N T d % 1 xOOM Killer给干掉了,得分为854.& [ l p f
解释一下OOM killer(Out-Of-Memory killer),该机制会监控机器的内存资源消耗。+ + b p T v 7 f )当机器内存耗尽前,该机制会扫描一切的进程(依照一定规矩核M z / ` ^ `算,内存占用,时刻等e C T),挑选出得分最高的进程,然后杀死,然后保护机器。

dmesg日志时刻转化公式:
log实践时刻=f 9 Y格林威治1970-01-01+(当时时刻秒数-体系发动至今的秒数+dmesg打印的log时刻)秒数:

date -d "1970-01-01 UTC `ecc 4 : % y B * a NhO _ ;o "$(date +%s)-$(] k [ i R -cat /proc/uptime|cut -f 1 -d' ')+12288812.926194"|bc ` seconds"

剩余的,便是看看为什么内存这么大,触发了OOM-Killer了。

新技能get

RateLimiter
想要精密的操控QPS? 比方这样一个场景,你调用某个( 0 d接口,对方清晰需求你约束你的QPQ 1 m 7 9 L L }S在400之内你怎样操控?这个时分Rate8 + c ^ R I =Limiter就有了用武之地。详情可移步http://ifeve.com/guava-ratelimite

作者x q C u ~:红魔七号
链接:htl 9 C W f h Htps:4 . g .//yq.aliyuP : j V r r `n.com/articles/69520?uC X G a _ qtm_content=m_10360
阿里内部员工,排查Java问题常用的工具单
欢迎重视我的微信大众号「码农包围」,共享Python、Java、大数据、机器学习、人工智能等技术,重视码农技术提升•职场包围•思维跃迁,20万+码& , * o农生长充电第一站,陪有梦想的你一同生长