作者:红魔七号
链接:http://yq.aliyun.com/articles/69520?utm_content=m_10360
这是一篇来历于阿里外部手艺服装服装服装服装服装服装论坛t.vhao.nett.vhao.nett.vhao.nett.vhao.nett.vhao.nett.vhao.net的文章,原文在阿里外部取得分歧好评。作者已把这篇文章开放到云栖社区中供外网拜候。文章内容做了局部删减,首要删减掉了此中只要阿里外部能力操纵的东西的先容,并删减掉局部只要经由过程阿里内网能力拜候到的链接。
媒介
平常平凡的任务中常常碰着良多疑题目目的处置,在处置题目的同时,有一些东西起到了相称大的感化,在此誊写上去,一是作为条记,能够让本身后续健忘了可疾速翻阅,二是分享,但愿看到此文的同窗们能够拿出本身平常感受赞助很大的东西,大师一路前进。
闲话未几说,开搞。
Linux号令类
tail
最常常操纵的tail -f
tail -300f shopbase.log #倒数300行并进入及时监听文件写入形式
grep
grep forest f.txt #文件查找
grep forest f.txt cpf.txt #多文件查找
grep "log" /home/admin -r -n #目次下查找一切合适关头字的文件
cat f.txt | grep -i shopbase
grep "shopbase" /home/admin -r -n --include *.{vm,java} #指定文件后缀
grep "shopbase" /home/admin -r -n --exclude *.{vm,java} #反婚配
seq 10 | grep 5 -A 3 #上婚配
seq 10 | grep 5 -B 3 #下婚配
seq 10 | grep 5 -C 3 #高低婚配,平常平凡用这个就妥了
cat f.txt | grep -c "SHOPBASE"
awk
1 、根本号令
awk "{print $4,$6}" f.txt
awk "{print NR,$0}" f.txt cpf.txt
awk "{print FNR,$0}" f.txt cpf.txt
awk "{print FNR,FILENAME,$0}" f.txt cpf.txt
awk "{print FILENAME,"NR="NR,"FNR="FNR,"$"NF"="$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/ && /LISTEN/ {print}" f.txt #婚配ldb和LISTEN
awk "$5 ~ /ldb/ {print}" f.txt #第五列婚配ldb
3 、 内建变量
NR:NR表现从awk起头履行后,根据记实分开符读取的数据次数,默许的记实分开符为换行符,是以默许的便是读取的数据行数,NR能够懂得为Number of Record的缩写。
FNR:在awk处置多个输入文件的时辰,在处置完第一个文件后,NR并不会从1起头,而是持续累加,是以就呈现了FNR,每当处置一个新文件的时辰,FNR就从1起头计数,FNR能够懂得为File Number of Record。
NF: NF表现今朝的记实被朋分的字段的数量,NF能够懂得为Number of Field。
find
sudo -u admin find /home/admin /tmp /usr -name *.log(多个目次去找)
find . -iname *.txt(巨细写都婚配)
find . -type d(以后目次下的一切子目次)
find /usr -type l(以后目次下一切的标记链接)
find /usr -type l -name "z*" -ls(标记链接的详细信息 eg:inode,目次)
find /home/admin -size +250000k(跨越250000k的文件,固然+改成-便是小于了)
find /home/admin f -perm 777 -exec ls -l {} ; (根据权限盘问文件)
find /home/admin -atime -1 1天内拜候过的文件
find /home/admin -ctime -1 1天内状况转变过的文件
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知足前提的日记
pgm -A -f vm-shopbase "cat /home/admin/shopbase/logs/shopbase.log.2018-01-17|grep 2069861630"
tsar
tsar是咱公司本身的收罗东西。很好用, 将汗青搜集到的数据耐久化在磁盘上,以是咱们疾速来盘问汗青的体系数据。固然及时的操纵情况也是能够盘问的啦。大局部机械上都有装置。
tsar ###能够检查比来一天的各项目标
tsar --live ###能够检查及时目标,默许五秒一刷
tsar -d 20161218 ###指定检查某天的数据,貌似最多只能看四个月的数据
tsar --mem
tsar --load
tsar --cpu
###固然这个也能够和-d参数共同来盘问某天的单个目标的情况
top
top除看一些根基信息以外,剩下的便是共同来盘问vm的各类题目了
ps -ef | grep java
top -H -p pid
取得线程10进制转16进制后jstack去抓看这个线程究竟在干啥
其余
netstat -nat|awk "{print $6}"|sort|uniq -c|sort -rn
#检查以后毗连,注重close_wait偏高的情况,比方以下
btrace
首当其冲的要说的是btrace。真是出产情况&预发的排盘题目大杀器。 简介甚么的就不说了。间接上代码干
1、检查以后谁挪用了ArrayList的add体例,同时只打印以后ArrayList的size大于500的线程挪用栈
@OnMethod(clazz = "java.util.ArrayList", method="add", location = @Location(value = Kind.CALL, clazz = "/.*/", method = "/.*/"))
public static void m(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod, @TargetInstance Object instance, @TargetMethodOrField String method) {
if(getInt(field("java.util.ArrayList", "size"), instance) > 479){
println("check who ArrayList.add method:" + probeClass + "#" + probeMethod + ", method:" + method + ", size:" + getInt(field("java.util.ArrayList", "size"), instance));
jstack;
println;
println("===========================");
println;
}
}
2、监控以后办事体例被挪用时前往的值和要求的参数
@OnMethod(clazz = "com.taobao.sellerhome.transfer.biz.impl.C2CApplyerServiceImpl", method="nav", location = @Location(value = Kind.RETURN))
public static void mt(long userId, int current, int relation, String check, String redirectUrl, @Return AnyType result) {
println("parameter# userId:" + userId + ", current:" + current + ", relation:" + relation + ", check:" + check + ", redirectUrl:" + redirectUrl + ", result:" + result);
}
更多内容,感乐趣的请移步:http://github.com/btraceio/btrace
注重:
颠末察看,1.3.9的release输入不不变,要多触发几回能力看到准确的成果
正则抒发式婚配trace类时规模必然要节制,不然极有能够呈现跑满CPU致使操纵卡死的情况
因为是字节码注入的道理,想要操纵规复到一般情况,须要重启操纵。
Greys
说几个挺棒的功效(局部功效和btrace重合):
sc -df xxx
: 输入以后类的概况,包含源码地位和classloader布局trace class method
: 相称喜好这个功效! 很早前能够早JProfiler看到这个功效。打印出以后体例挪用的耗时情况,细分到每一个体例。javOSize
就说一个功效
classes
:经由过程点窜了字节码,转变了类的内容,当即失效。 以是能够做到疾速的在某个处所打个日记看看输入,毛病谬误是对代码的侵入性太大。可是若是本身晓得本身在干吗,的确是不错的玩艺儿。其余功效Greys和btrace都能很等闲做的到,不说了。
JProfiler
之前判定良多题目要经由过程JProfiler,可是此刻Greys和btrace根基都能搞定了。再加上出题目的根基上都是出产情况(搜集断绝),以是根基不怎样操纵了,可是仍是要标记一下。官网请移步http://www.ej-technologies.com/products/jprofiler/overview.html
大杀器
eclipseMAT
可作为eclipse的插件,也可作为零丁的法式翻开。 概况请移步http://www.eclipse.org/mat/
java三板斧,噢毛病,是七把
jps
我只用一条号令:
sudo -u admin /opt/taobao/java/bin/jps -mlvV
jstack
通俗用法:
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack 2815
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack -m 2815
jinfo
可看体系启动的参数,以下
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jinfo -flags 2815
jmap
两个用处
1.检查堆的情况
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -heap 2815
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -dump:live,format=b,file=/tmp/heap2.bin 2815
或
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -dump:format=b,file=/tmp/heap3.bin 2815
3.看看堆都被谁占了? 再共同zprofiler和btrace,排盘题目的确是为虎傅翼
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -histo 2815 | head -10
jstat
jstat参数浩繁,可是操纵一个就够了
sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstat -gcutil 2815 1000
jdb
时至本日,jdb也是常常操纵的。
jdb能够用来预发debug,假定你预发的java_home是/opt/taobao/java/,长途调试端口是8000.那末
sudo -u admin /opt/taobao/java/bin/jdb -attach 8000
.CHLSDB
CHLSDB感受良多情况下能够看到更好玩的东西,不详细论述了。 盘问材料传闻jstack和jmap等东西便是基于它的。
sudo -u admin /opt/taobao/java/bin/java -classpath /opt/taobao/java/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB
更详细的可见R大此贴http://rednaxelafx.iteye.com/blog/1847971
plugin of intellij idea
key promoter
疾速键一次你记不住,多来几回你总能记着了吧?
maven helper
阐发maven依靠的好帮忙。
VM options
1、你的类究竟是从哪一个文件加载出去的?
-XX:+TraceClassLoading
成果形如[Loaded java.lang.invoke.MethodHandleImpl$Lazy from D:programmejdkjdk8U74jrelib
t.jar]
2、操纵挂了输入dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof
jar包抵触
把这个零丁写个大标题不过度吧?每小我或多或少都处置过这类烦人的case。我特么下边这么多计划不信就搞不定你?
mvn dependency:tree > ~/dependency.txt
打出一切依靠
mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId
只打出指定groupId和artifactId的依靠干系
-XX:+TraceClassLoading
vm启动剧本插手。在tomcat启动剧本中可见加载类的详细信息
-verbose
vm启动剧本插手。在tomcat启动剧本中可见加载类的详细信息
greys:sc
greys的sc号令也能清楚的看到以后类是从那里加载过去的
tomcat-classloader-locate
经由过程以下url能够获知以后类是从那里加载的curl http://localhost:8006/classloader/locate?class=org.apache.xerces.xs.XSObjec
其余
dmesg
若是发明本身的java历程悄无声气的消逝了,几近不留下任何线索,那末dmesg一发,很有能够有你想要的。
sudo dmesg|grep -i kill|less
去找关头字oom_killer。找到的成果近似以下:
[6710782.021013] java invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0
[6710782.070639] [<ffffffff81118898>] ? oom_kill_process+0x68/0x140
[6710782.257588] Task in /LXC011175068174 killed as a result of limit of /LXC011175068174
[6710784.698347] Memory cgroup out of memory: Kill process 215701 (java) score 854 or sacrifice child
[6710784.707978] Killed process 215701, UID 679, (java) total-vm:11017300kB, anon-rss:7152432kB, file-rss:1232kB
以上标明,对应的java历程被体系的OOM Killer给干掉了,得分为854.诠释一下OOM killer(Out-Of-Memory killer),该机制会监控机械的内存资本耗损。当机械内存耗尽前,该机制会扫描一切的历程(根据必然法则计较,内存占用,时辰等),遴选出得分最高的历程,而后杀死,从而掩护机械。
dmesg日记时辰转换公式:log现及时辰=格林威治1971-01-01+(以后时辰秒数-体系启动至今的秒数+dmesg打印的log时辰)秒数:
date -d "1971-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d" ")+12288812.926194"|bc ` seconds"
剩下的,便是看看为甚么内存这么大,触发了OOM-Killer了。
新手艺get
RateLimiter
想要邃密的节制QPS? 比方如许一个场景,你挪用某个接口,对方明白须要你限定你的QPS在400以内你怎样节制?这个时辰 RateLimiter 就有了用武之地。概况可移步http://ifeve.com/guava-ratelimite
本文仅代表作者小我概念,不代表巅云官方发声,对概念有疑义请先接洽作者自己停止点窜,若内容不法请接洽平台办理员,邮箱2522407257@qq.com。更多相干资讯,请到巅云www.taishanly.com进修互联网营销手艺请到巅云建站www.yx10011.com。