1. 首页
  2. IT资讯

阿里员工最常用的问题排查工具单

“u003Cpu003EJava后端,选择 u003Cu002Fpu003Eu003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcsUnd92eoboDR” img_width=”640″ img_height=”29″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003E作者 | 红魔七号u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E链接 | https:u002Fu002Furlifyu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E.cnu003Cu002Fiu003Eu002FaiqYniu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003E这是一篇来源于阿里内部技术论坛的文章,原文在阿里内部获得一致好评。作者已经把这篇文章开放到云栖社区中供外网访问。Hollis对文章内容做了部分删减,主要删减掉了其中只有阿里内部才能使用的工具的介绍,并删减掉部分只有通过阿里内网才能访问到的链接。u003Cu002Fpu003Eu003Cpu003E前言u003Cu002Fpu003Eu003Cpu003E平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。u003Cu002Fpu003Eu003Cpu003E闲话不多说,开搞。u003Cu002Fpu003Eu003Cpu003ELinux命令类u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003Etailu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E最常用的tail -fu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Etail -u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E30u003Cu002Fiu003E0f shopbase.log #倒数u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E30u003Cu002Fiu003E0行并进入实时监听文件写入模式u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Egrepu003Cu002Fh1u003Eu003Cpreu003Eu003Ccodeu003Egrep forest f.txt #文件查找u003Cbru003Egrep forest f.txt cpf.txt #多文件查找u003Cbru003Egrep ‘log’ u002Fhomeu002Fadmin -r -n #目录下查找所有符合关键字的文件u003Cbru003Ecat f.txt | grep -i shopbaseu003Cbru003Egrep ‘shopbase’ u002Fhomeu002Fadmin -r -n –include *.{vm,java} #指定文件后缀u003Cbru003Egrep ‘shopbase’ u002Fhomeu002Fadmin -r -n –exclude *.{vm,java} #反匹配u003Cbru003Eseq 10 | grep 5 -A 3 #上匹配u003Cbru003Eseq 10 | grep 5 -B 3 #下匹配u003Cbru003Eseq 10 | grep 5 -C 3 #上下匹配,平时用这个就妥了u003Cbru003Ecat f.txt | grep -c ‘SHOPBASE’u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Eawku003Cu002Fh1u003Eu003Cpu003E1 基础命令u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eawk ‘{print $4,$6}’ f.txtu003Cbru003Eawk ‘{print NR,$0}’ f.txt cpf.txtu003Cbru003Eawk ‘{print FNR,$0}’ f.txt cpf.txtu003Cbru003Eawk ‘{print FNR,FILENAME,$0}’ f.txt cpf.txtu003Cbru003Eawk ‘{print FILENAME,”NR=”NR,”FNR=”FNR,”$”NF”=”$NF}’ f.txt cpf.txtu003Cbru003Eecho 1:2:3: | awk -F: ‘{print 4 $1,,$2,$3,$4}’u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E2 匹配u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eawk ‘u002Fldbu002F {print}’ f.txt #匹配ldbu003Cbru003Eawk ‘!u002Fldbu002F {print}’ f.txt #不匹配ldbu003Cbru003Eawk ‘u002Fldbu002F && u002FLISTENu002F {print}’ f.txt #匹配ldb和LISTENu003Cbru003Eawk ‘$5 ~ u002Fldbu002F {print}’ f.txt #第五列匹配ldbu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E3 内建变量u003Cu002Fpu003Eu003Cpu003ENR:NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。u003Cu002Fpu003Eu003Cpu003EFNR:在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E累加u003Cu002Fiu003E,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。u003Cu002Fpu003Eu003Cpu003ENF: NF表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。u003Cu002Fpu003Eu003Cpu003ETips:u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E微信u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E公众号u003Cu002Fiu003E:Java后端,每日获取博文的推送。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Efindu003Cu002Fh1u003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin find u002Fhomeu002Fadmin u002Ftmp u002Fusr -name \*.log(多个目录去找)u003Cbru003Efind . -iname \*.txt(大小写都匹配)u003Cbru003Efind . -type d(当前目录下的所有子目录)u003Cbru003Efind u002Fusr -type l(当前目录下所有的符号链接)u003Cbru003Efind u002Fusr -type l -name “z*” -ls(符号链接的详细信息 eg:inode,目录)u003Cbru003Efind u002Fhomeu002Fadmin -size +250000k(超过250000k的文件,当然+改成-就是小于了)u003Cbru003Efind u002Fhomeu002Fadmin f -perm 777 -exec ls -l {} \; (按照权限查询文件)u003Cbru003Efind u002Fhomeu002Fadmin -atime -1 1天内访问过的文件u003Cbru003Efind u002Fhomeu002Fadmin -ctime -1 1天内状态改变过的文件u003Cbru003Efind u002Fhomeu002Fadmin -mtime -1 1天内修改过的文件u003Cbru003Efind u002Fhomeu002Fadmin -amin -1 1分钟内访问过的文件u003Cbru003Efind u002Fhomeu002Fadmin -cmin -1 1分钟内状态改变过的文件u003Cbru003Efind u002Fhomeu002Fadmin -mmin -1 1分钟内修改过的文件u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Epgmu003Cu002Fh1u003Eu003Cpu003E批量查询vm-shopbase满足条件的日志u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epgm -A -f vm-shopbase ‘cat u002Fhomeu002Fadminu002Fshopbaseu002Flogsu002Fshopbase.log.2017-01-17|grep 20698616u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E30u003Cu002Fiu003E’u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Etsaru003Cu002Fh1u003Eu003Cpu003Etsar是咱公司自己的采集工具。很好用, 将历史收集到的数据持久化在磁盘上,所以我们快速来查询历史的系统数据。当然实时的应用情况也是可以查询的啦。大部分机器上都有安装。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Etsar u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E###可以查看最近一天的各项指标u003Cu002Fstrongu003Eu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcbG9JD6QJd” img_width=”872″ img_height=”286″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpreu003Eu003Ccodeu003Etsar –live ###可以查看实时指标,默认五秒一刷u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcbU29UD0lS” img_width=”880″ img_height=”175″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpreu003Eu003Ccodeu003Etsar -d 20161218 ###指定查看某天的数据,貌似最多只能看四个月的数据u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcbcHrOUxx7″ img_width=”889″ img_height=”211″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpreu003Eu003Ccodeu003Etsar –memu003Cbru003Etsar –loadu003Cbru003Etsar –cpuu003Cbru003E###当然这个也可以和-d参数配合来查询某天的单个指标的情况u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcblDt9LQQv” img_width=”566″ img_height=”161″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcbtDRowoR9″ img_width=”538″ img_height=”177″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1Ncr82uTLc7G” img_width=”681″ img_height=”194″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Etopu003Cu002Fh1u003Eu003Cpu003Etop除了看一些基本信息之外,剩下的就是配合来查询vm的各种问题了u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eps -ef | grep javau003Cbru003Etop -H -p pidu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E获得线程10进制转16进制后jstack去抓看这个线程到底在干啥u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003E其他u003Cu002Fh1u003Eu003Cpreu003Eu003Ccodeu003Enetstat -nat|awk ‘{print $6}’|sort|uniq -c|sort -rn u003Cbru003E#查看当前连接,注意close_wait偏高的情况,比如如下u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcrK53WwMr3″ img_width=”779″ img_height=”114″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NcrTERF69nl” img_width=”417″ img_height=”500″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003E排查利器u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003Ebtraceu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E首当其冲的要说的是btrace。真是生产环境&预发的排查问题大杀器。简介什么的就不说了。直接上代码干u003Cu002Fpu003Eu003Cpu003E1、查看当前谁调用了ArrayList的add方法,同时只打印当前ArrayList的size大于500的线程调用栈u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@OnMethod(clazz = “java.util.ArrayList”, method=”add”, location = @Location(value = Kind.CALL, clazz = “u002F.*u002F”, method = “u002F.*u002F”))u003Cbru003Epublic static void m(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod, @TargetInstance Object instance, @TargetMethodOrField String method) {u003Cbru003Eif(getInt(field(“java.util.ArrayList”, “size”), instance) > 479){u003Cbru003Eprintln(“check who ArrayList.add method:” + probeClass + “#” + probeMethod + “, method:” + method + “, size:” + getInt(field(“java.util.ArrayList”, “size”), instance));u003Cbru003Ejstack;u003Cbru003Eprintln;u003Cbru003Eprintln(“===========================”);u003Cbru003Eprintln;u003Cbru003E}u003Cbru003E}u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E2、监控当前服务方法被调用时返回的值以及请求的参数u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@OnMethod(clazz = “com.taobao.sellerhome.transfer.biz.impl.C2Cu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003EAppu003Cu002Fiu003ElyerServiceImpl”, method=”nav”, location = @Location(value = Kind.RETURN))u003Cbru003Epublic static voidu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Emtu003Cu002Fstrongu003E(long userId, int current, int relation, String check, String redirectUrl, @Return AnyType result) {u003Cbru003Eprintln(“parameter# useru003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003EId:u003Cu002Fiu003E” + userId + “, current:” + current + “, relation:” + relation + “, check:” + check + “, redirectUrl:” + redirectUrl + “, result:” + result);u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E更多内容,感兴趣的请移步:https:u002Fu002Fgithubu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fbtraceiou002Fbtraceu003Cu002Fpu003Eu003Cpu003E注意:u003Cu002Fpu003Eu003Colu003Eu003Cliu003Eu003Cpu003E经过观察,1.3.9的release输出不稳定,要多触发几次才能看到正确的结果u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E正则表达式匹配trace类时范围一定要控制,否则极有可能出现跑满CPU导致应用卡死的情况u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E由于是字节码注入的原理,想要应用恢复到正常情况,需要重启应用。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003EGreysu003Cu002Fh1u003Eu003Cpu003E说几个挺棒的功能(部分功能和btrace重合):u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003Esc -df xxxu003Cu002Fcodeu003E: 输出当前类的详情,包括源码位置和classloader结构u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003Etrace class methodu003Cu002Fcodeu003E: 相当喜欢这个功能! 很早前可以早JProfiler看到这个功能。打印出当前方法调用的耗时情况,细分到每个方法。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003EjavOSizeu003Cu002Fh1u003Eu003Cpu003E就说一个功能u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003Eclassesu003Cu002Fcodeu003E:通过修改了字节码,改变了类的内容,即时生效。所以可以做到快速的在某个地方打个日志看看输出,缺点是对代码的侵入性太大。但是如果自己知道自己在干嘛,的确是不错的玩意儿。u003Cu002Fpu003Eu003Cpu003E其他功能Greys和btrace都能很轻易做的到,不说了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003EJProfileru003Cu002Fh1u003Eu003Cpu003E之前判断许多问题要通过JProfiler,但是现在Greys和btrace基本都能搞定了。再u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E加上u003Cu002Fiu003E出问题的基本上都是生产环境(网络隔离),所以基本不怎么使用了,但是还是要标记一下。官网请移步https:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Eej-technologiesu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fproductsu002Fjprofileru002Foverview.htmlu003Cu002Fpu003Eu003Cpu003E大杀器u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003EeclipseMATu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E可作为eclipse的插件,也可作为单独的程序打开。 详情请移步u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Eeclipse.orgu002Fmatu002Fu003Cu002Fpu003Eu003Cpu003Ejava三板斧,噢不对,是七把u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003Ejpsu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E我只用一条命令:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Fjavau002Fbinu002Fjps -mlvVu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1Ncrc2kDTrbK” img_width=”1080″ img_height=”96″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Ejstacku003Cu002Fh1u003Eu003Cpu003E普通用法:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjstack 2815u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1Ncrm5xdy0EU” img_width=”1080″ img_height=”394″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Enative+java栈:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjstack -m 2815u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdHEGztfNex” img_width=”843″ img_height=”554″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Ejinfou003Cu002Fh1u003Eu003Cpu003E可看系统启动的参数,如下u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjinfo -flags 2815u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdHT1L4sNZc” img_width=”1080″ img_height=”229″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Ejmapu003Cu002Fh1u003Eu003Cpu003E两个用途u003Cu002Fpu003Eu003Cpu003E1.查看堆的情况u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjmap -heap 2815u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdHfDllybiH” img_width=”665″ img_height=”764″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdHr9Nwxafm” img_width=”666″ img_height=”205″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003E2.dumpu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjmap -dump:live,format=b,file=u002Ftmpu002Fheap2.bin 2815u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E或者u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjmap -dump:format=b,file=u002Ftmpu002Fheap3.bin 2815u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E3.看看堆都被谁占了? 再配合zprofiler和btrace,排查问题简直是如虎添翼u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjmap -histo 2815 | head -10u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdI1GkLo1Mz” img_width=”792″ img_height=”211″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Ejstatu003Cu002Fh1u003Eu003Cpu003Ejstat参数众多,但是使用一个就够了u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Finstallu002Fajdk-8_1_1_fp1-b52u002Fbinu002Fjstat -gcutil 2815 1000 u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdeCANIFYbL” img_width=”800″ img_height=”324″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Ejdbu003Cu002Fh1u003Eu003Cpu003E时至今日,jdb也是经常使用的。 u003Cu002Fpu003Eu003Cpu003Ejdb可以用来预发debug,假设你预发的java_home是u002Foptu002Ftaobaou002Fjavau002F,远程调试端口是8000.那么u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Fjavau002Fbinu002Fjdb -attach 8000u003Cu002Fcodeu003E.u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdeMHutvVPr” img_width=”745″ img_height=”95″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003E出现以上代表jdb启动成功。后续可以进行设置断点进行调试。具体参数可见oracle官方说明u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fdocs.oracleu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fjavaseu002F7u002Fdocsu002Ftechnotesu002Ftoolsu002Fwindowsu002Fjdb.htmlu003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003ECHLSDBu003Cu002Fh1u003Eu003Cpu003ECHLSDB感觉很多情况下可以看到更好玩的东西,不详细叙述了。查询资料听说jstack和jmap等工具就是基于它的。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo -u admin u002Foptu002Ftaobaou002Fjavau002Fbinu002Fjava -classpath u002Foptu002Ftaobaou002Fjavau002Flibu002Fsa-jdi.jar sun.jvm.hotspot.CLHSDBu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E更详细的可见R大此贴u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Frednaxelafx.iteyeu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fblogu002F1847971u003Cu002Fpu003Eu003Cpu003Eplugin of intellij ideau003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003Ekey promoteru003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E快捷键一次你记不住,多来几次你总能记住了吧?u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRh1NdeV9hdAOWG” img_width=”536″ img_height=”348″ alt=”阿里员工最常用的问题排查工具单” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h4″u003Emaven helperu003Cu002Fh1u003Eu003Cpu003E分析maven依赖的好帮手。u003Cu002Fpu003Eu003Cpu003EVM optionsu003Cu002Fpu003Eu003Cpu003E1、你的类到底是从哪个文件加载进来的?u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E-XX:+TraceClassLoadingu003Cbru003E结果形如[Loaded java.lang.invoke.MethodHandleImpl$Lazy from D:\programme\jdk\jdk8U74\jre\lib\rt.jar]u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E2、应用挂了输出dump文件u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=u002Fhomeu002Fadminu002Flogsu002Fjava.hprofu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Ejar包冲突u003Cu002Fpu003Eu003Cpu003E把这个单独写个大标题不过分吧?每个人或多或少都处理过这种烦人的case。我特么下边这么多方案不信就搞不定你?u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”code” class=”highlight-text”u003Emvn dependency:tree > ~u002Fdependency.txtu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E打出所有依赖u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”code” class=”highlight-text”u003Emvn dependency:tree -Dverbose -Dincludes=groupu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003EId:u003Cu002Fiu003EartifactIdu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E只打出指定groupId和artifactId的依赖关系u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”code” class=”highlight-text”u003E-XX:+TraceClassLoadingu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Evm启动脚本加入。在tomcat启动脚本中可见加载类的详细信息u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”code” class=”highlight-text”u003E-verboseu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Evm启动脚本加入。在tomcat启动脚本中可见加载类的详细信息u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”code” class=”highlight-text”u003Egreys:scu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Egreys的sc命令也能清晰的看到当前类是从哪里加载过来的u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Eu003Cstrong toutiao-origin=”code” class=”highlight-text”u003Etomcat-classloader-locateu003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E通过以下url可以获知当前类是从哪里加载的curl u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Flocau003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003Elhu003Cu002Fiu003Eost:8006u002Fclassloaderu002Flocate?class=org.apache.xerces.xs.XSObjecu003Cu002Fpu003Eu003Cpu003E其他u003Cu002Fpu003Eu003Cpu003Edmesgu003Cu002Fpu003Eu003Cpu003E如果发现自己的java进程悄无声息的消失了,几乎没有留下任何线索,那么dmesg一发,很有可能有你想要的。u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Esudo dmesg|grep -i kill|lessu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E去找关键字oom_killer。找到的结果类似如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E[6710782.021013] java invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0u003Cbru003E[6710782.070639] [<ffffffff81118898>] ? oom_kill_process+0x68u002F0x140u003Cbru003E[6710782.257588] Task in u002FLXC011175068174 killed as a result of limit of u002FLXC011175068174u003Cbru003E[6710784.698347] Memory cgroup out of memory: Kill process 215701 (java) score 854 or sacrifice childu003Cbru003E[6710784.707978] Killed process 215701, UID 679, (java) total-vm:11017u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E30u003Cu002Fiu003E0kB, anon-rss:7152432kB, file-rss:1232kBu003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E以上表明,对应的java进程被系统的OOM Killer给干掉了,得分为854.u003Cu002Fpu003Eu003Cpu003E解释一下OOM killer(Out-Of-Memory killer),该机制会监控机器的内存资源消耗。当机器内存耗尽前,该机制会扫描所有的进程(按照一定规则计算,内存占用,时间等),挑选出得分最高的进程,然后杀死,从而保护机器。u003Cu002Fpu003Eu003Cpu003Edmesg日志时间转换公式:u003Cu002Fpu003Eu003Cpu003Elog实际时间=格林威治1970-01-01+(当前时间秒数-系统启动至今的秒数+dmesg打印的log时间)秒数:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Edate -d “1970-01-01 UTC `echo “$(date +%s)-$(cat u002Fprocu002Fuptime|cut -f 1 -d’ ‘)+12288812.926194″|bc ` seconds”u003Cbru003Eu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E剩下的,就是看看为什么内存这么大,触发了OOM-Killer了。u003Cu002Fpu003Eu003Cpu003E新技能getu003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003ERateLimiteru003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E想要精细的控制QPS? 比如这样一个场景,你调用某个接口,对方明确需要你限制你的QPS在400之内你怎么控制?这个时候RateLimiter就有了用武之地。详情可移步u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fifeveu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fguava-ratelimiteu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E-END-u003Cu002Fpu003E”

原文始发于:阿里员工最常用的问题排查工具单

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/17790.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code