阿里员工排查问题的工具清单,总有一款适合你!
Monday, March 11, 2019
8:11 AM

|

| | —- |

| Tags: #微信 |

阿里员工排查问题的工具清单,总有一款适合你!

红魔七号 高效运维
阿里员工排查问题的工具清单,总有一款适合你! - 图9
作者:红魔七号
链接:https://yq.aliyun.com/articles/69520?utm_content=m_10360
这是一篇来源于阿里内部技术论坛的文章,原文在阿里内部获得一致好评。作者已经把这篇文章开放到云栖社区中供外网访问。文章内容做了部分删减,主要删减掉了其中只有阿里内部才能使用的工具的介绍,并删减掉部分只有通过阿里内网才能访问到的链接。
阿里员工排查问题的工具清单,总有一款适合你! - 图10
前言
阿里员工排查问题的工具清单,总有一款适合你! - 图11
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。
闲话不多说,开搞。
阿里员工排查问题的工具清单,总有一款适合你! - 图12
Linux命令类
阿里员工排查问题的工具清单,总有一款适合你! - 图13
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,”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.2017-01-17|grep 2069861630’

tsar

tsar是咱公司自己的采集工具。很好用, 将历史收集到的数据持久化在磁盘上,所以我们快速来查询历史的系统数据。当然实时的应用情况也是可以查询的啦。大部分机器上都有安装。
tsar ###可以查看最近一天的各项指标
阿里员工排查问题的工具清单,总有一款适合你! - 图14
tsar —live ###可以查看实时指标,默认五秒一刷
9t7:E@:Sl-LI/Z@/Z@  ㄥ 乙 • @Ⅰ  It:E@:Sl-LI/Z@/Z@  9E:E@:Sl-LI/Z@/Z@  SO•91  IE:E@:SI-LI/Z@/Z@  9Z:E@:Sl-LI/Z@/Z@  乙 9 • 8  IZ:E@:SI-LI/Z@/Z@  E8 • 6  -ndo-  SS@@E Ⅰ 8 Ⅰ 乙 é)3 z • 亅
tsar -d 20161218 ###指定查看某天的数据,貌似最多只能看四个月的数据
![Ti me Ti me 18/12/16-99:95 18/12/16-ee:łe 18/12/16-ee:15 18/12/16-ee:29 18/12/16-ee:25 18/12/16-ee:ge 18/12/16-ee:35 18/12/16 yingchao.zyc@v218139955 -xvdal— —xvdb- cpu— —-mem- 8.51 63.18 9.22 11.ee 12. ea 2.69 2.69 e.ee e. 17 8.32 63.94 9.26 9.ee 11.ee 2.98 2.98 e.ee 9.23 8.53 63.93 9.24 11.ee 12. ea 2.62 2.62 e.ee 9.13 8.58 63.96 9.29 9.ee 11.ee 2.53 2.53 e.ee 9.18 8.53 63.95 9.24 11.ee 12. ea 2.69 2.69 e.ee e. 78 8.37 63.95 9.23 9.ee 11.ee 2.81 2.81 e.ee e. 49 8.72 63.93 9.23 12. ea 12. ea 2.58 2.58 e.ee e. 42 -99:49 8.52 63.98 9.29 9.ee 11.ee 2. 43 2. 43 e.ee e. 42 -1$ tsar -d 28161218 util —tcp- retran — -traffic- util pktin pktout —xvda— util util util - -Ioad- Ioadl
tsar —mem
tsar —load
tsar —cpu

当然这个也可以和-d参数配合来查询某天的单个指标的情况
![Time Time 01/02/17-15:20 01/02/17-15:25 01/02/17-15:30 01/02/17-15:35 01/02/17 -15. yingchao.zyc@v218130055 62 . 8M 2.8G 148 . 8M 867 . 5M 3.9G 72.74 61.7M 2.8G 148 . 8M 869 . 1M 3.9G 72.73 59 . 3M 2.8G 148 . 8M 870 . 8M 3.9G 72.75 58. 1M 2.8G 148 . 8M 872.4M 3.9G 72.74 55 . 8M 2.8G 148 . 8M 874. 1M 3.9G 72.75 tsar - -mem ———————————-mem- used f ree buff cach total util
阿里员工排查问题的工具清单,总有一款适合你! - 图16
SS •  SK s  -ndo-  ndo-  」 S  SS:SI-LI/Z@/I@  @S:SI-LI/Z@/I@  St:Sl-LI/Z@/I@  9t7:Sl-LI/Z@/I@  SE:SI-LI/Z@/I@  @E:SI-LI/Z@/I@  SZ:SI-LI/Z@/I@  SS@@E Ⅰ 8 Ⅰ 乙 é)3 z • 亅

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偏高的情况,比如如下
![‘{print $6}’ Isortluniq yingchao.zyc@v218130055 nets tat -natl awk -clsort 220 29 21 15 11 CLOSE WAIT LISTEN ESTABLISHED SYN RECV TIME WAIT
阿里员工排查问题的工具清单,总有一款适合你! - 图18
阿里员工排查问题的工具清单,总有一款适合你! - 图19

排查利器
阿里员工排查问题的工具清单,总有一款适合你! - 图20
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);
}
更多内容,感兴趣的请移步:https://github.com/btraceio/btrace
注意:

  1. 经过观察,1.3.9的release输出不稳定,要多触发几次才能看到正确的结果
  2. 正则表达式匹配trace类时范围一定要控制,否则极有可能出现跑满CPU导致应用卡死的情况
  3. 由于是字节码注入的原理,想要应用恢复到正常情况,需要重启应用。

    Greys

    说几个挺棒的功能(部分功能和btrace重合):
    sc -df xxx: 输出当前类的详情,包括源码位置和classloader结构
    trace class method: 相当喜欢这个功能! 很早前可以早JProfiler看到这个功能。打印出当前方法调用的耗时情况,细分到每个方法。

    javOSize

    就说一个功能
    classes:通过修改了字节码,改变了类的内容,即时生效。 所以可以做到快速的在某个地方打个日志看看输出,缺点是对代码的侵入性太大。但是如果自己知道自己在干嘛,的确是不错的玩意儿。
    其他功能Greys和btrace都能很轻易做的到,不说了。

    JProfiler

    之前判断许多问题要通过JProfiler,但是现在Greys和btrace基本都能搞定了。再加上出问题的基本上都是生产环境(网络隔离),所以基本不怎么使用了,但是还是要标记一下。
    官网请移步https://www.ej-technologies.com/products/jprofiler/overview.html
    阿里员工排查问题的工具清单,总有一款适合你! - 图21
    大杀器
    阿里员工排查问题的工具清单,总有一款适合你! - 图22
    eclipseMAT

    可作为eclipse的插件,也可作为单独的程序打开。
    详情请移步http://www.eclipse.org/mat/
    阿里员工排查问题的工具清单,总有一款适合你! - 图23
    java三板斧,噢不对,是七把
    阿里员工排查问题的工具清单,总有一款适合你! - 图24
    jps

    我只用一条命令:
    sudo -u admin /opt/taobao/java/bin/jps -mlvV
    isudo •u admin  2815 start  iLoaderLo#nager -Djava -Olog4j ALLOW EQUALS VALUE=true -O  HTTP SEPARATORS IN ve  •true -Xm4g -Xm2g  : CHSCIassun10adingEnabIed -KX&UseChlnitiatingOccupancyOn1y  Zoncurrpnt -noggc:/hom/adnin/logs/gc.log -XX:.printGCDetaiIs -XX:+PrintGCOate  -Djava.awt.headless=true -Dsun.net.client.de  31323 sun. -mlvV -KM8m

    jstack

    普通用法:
    sudo -u admin /opt/taobao/install/ajdk-81_1_fp1-b52/bin/jstack 2815
    2017-01-23  Fun thread dump OpenJDK 64-Bit Server W (25.92-052 mixed mde):  (a java. concurrent.locks. AbstractQueuedSynchronizer$ConditionObject) • parking to concurrent. locks
    LockSupport _ parkNanos (LockSupport. java : 215) j rrent. locks Abs tract QueuedSyn r$Condi t i onObject. awaitNanos (Abs tractQueuedSynch ronizer. java : 2078) java. util. concurrent. Schedu ledThreadPooIExecu torSDe1 ayedWorkQueue. pot 1 (Schedul edTh readP001Executor. java : 1134 ) . concurrent . Schedu ledTh readPooI Execu to ayedWo rkQueue . poll (Schedul edTh readPooIExecutor. j ava : 809) java. util. concurrent. ThreatWooIExecu tor. getTask( Th readPooI Executor. java : 11366) java. concurrent. Threa(WooIExecu tor. runWorker( tor. j ava: 1127) java. util. concurrent. ThreatWooIExecu torSWorker. run ( Th readPootExecutor. java : 617) java. tang. Thread. runt Thread. java: 166) java java .utn “pool -33 -thread- 183 • #3115 priozS tidzexe9862aaaedfec9ee nidzax662a waiting on condition 19xeeeeeee95eb898Bel java. lang. Thread. State: WAITING (parking) at sun .misc.Unsafe.park(Native Method) at at at at at at at wait for (a java . . concurrent. tocks . AbstractQueuedSynchronizer$ConditionObject) parking to java. util. concurrent . tocks . LockSupport. park( LockSupport. java : 175) . conc u rrent . locks . Abs t rac tQueuedSyn ch ronize r$ConditionObj ect. await ( Abst ractQueuedSynch ronize r. ava : 2039) . concurrent . Ar rayBIockingQueue . take (Ar rayBIockingQueue . java: 483) . concurrent . ThreacPooIExecutor. getTask(Th readPooI Executor. java : 1867) . concu rrent. Threa(9001Executor. runWo rker ( Th readPooIExecutor. j ava: 1127 ) j concurrent. Th reaft01Executor$Worker. run ( Th readPooLExecutor . java : 617 ) java. Thread. run (Thread. java: 766) java java java java . util . util -util -util” class=”align-none”>
    native+java栈:
    sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstack -m 2815
    Attaching to process ID 2815, please wait...  Debugger attached successfully.  Server compiler detected.  JW version is 25.92-b52  Deadlock Detection:  No deadlocks found.  - 2819  Ox00002b7a3127eab6  - 2822  Ox00002b7a30b88f59  Ox00002b7a3269bObb  Ox00002b7a3269b64e  Ox00002b7a328a78c8  Ox00002b7a326dda42  - 2823  Ox00002b7a30b88f59  Ox00002b7a3269bObb  Ox00002b7a3269b64e  Ox00002b7a328a78c8  Ox00002b7a326dda42  - 2824  Ox00002b7a30b88f59  Ox00002b7a3269bObb  Ox00002b7a3269b64e  Ox00002b7a328a78c8  Ox00002b7a326dda42  - 2825  Iibc poll + Ox66  pthread cond wait + Oxb9  ZN7Monitor51WaitEP6Thread1 + Oxcb  ZN7Monitor4waitEb1b + Ox9e  ZNIOGangWorker4100pEv + Ox58  ZLIOjava startP6Thread + Ox122  pthread cond wait + Oxb9  ZN7Monitor51WaitEP6ThreadI + Oxcb  ZN7Monitor4waitEbIb + Ox9e  ZN10GangWorker4100pEv + Ox58  ZLIOjava startP6Thread + Ox122  pthread cond wait + Oxb9  ZN7Monitor51WaitEP6Thread1 + Oxcb  ZN7Monitor4waitEbIb + Ox9e  ZNIOGangWorker4100pEv + Ox58  ZLIOjava startP6Thread + Ox122

    jinfo

    可看系统启动的参数,如下
    sudo -u admin /opt/taobao/install/ajdk-81_1_fp1-b52/bin/jinfo -flags 2815
    ![Ssudo -u admin Attaching to process 2815, please wait… Debugger attached successfully. Serwer detected. is 25.92.b52 -nags 2815 Non-default nags: -xx:.Exp1icitGC1nvokesconcurr -xx:1nitia1HeapSize-4294967296 -xx:MaxHeapSize4294967296 7483648 -xx:hinHeapoe1taBytes-1966e8 -xx:01dPLABSize-16 -xx:Paraue16CThreads-4 -xx:+PrintGC -xx:.PrintcjcoatestM9! -XX:+PrintGCDetaiIs -XXAJseConcHarkSweepGC -XX:+UsePi ,-Newoc Comand -Djava.util.logging.config. r=alibaba ./urandom -010941 .detaultlnitovgrride=true -Dorg.apache. tomcat.utiI.http.ServerCookie.ALLOW EQUALS IN VALUE=true -Oorq.apache.to«at.util.http.servel Cookie. ALLOW HTTP_SEPARATORS -Xms4g -Xmx4g -Xmn2g -XX:SurvIvorRatIIF16 -XX:+UseConcMarkSseepGC -XX:+CFCLassUnloadingEnabted -XX:+ÉxpIICitGCInVOkgsConcurrent -Usun.rmi.dgc.server.gt -XX:+PrintGCDgtaiIS rror ogs •Xdebug •Oproject.name=sellerpi atfom -Ocata1ina.10gs—/hÄ/admin/se11erpIatfoænogs/cata1im •Ocatalina.hæ=/opt/tat bao/t—at -Djava
    ](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639559572680-cfbd6049-1ff0-4402-ae9f-d40e102e9a12.jpg)

    jmap

    两个用途
    1.查看堆的情况
    sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jmap -heap 2815
    $sudo -u admin /opt/taobao/instaII/ajdk-8 1 1 fp1-b52/bin/jmap  Attaching to process ID 2815, please wait.  Debugger attached successfully.  Server compiler detected.  JW version is 25.92-b52  using parallel threads in the new generation.  using thread-local object allocation.  -heap 2815  Concurrent Mark-Sweep GC  Heap Configuration:  MinHeapFreeRatio  MaxHeapFreeRatio  MaxHeapSize  NewSize  MaxNewSize  OldSize  NewRatio  SurvivorRatio  MetaspaceSize  Comp ressedCIassSpaceSize  MaxMetaspaceSize  GlHeapRegionSize  Heap Usage:  40  70  4294967296 (4096. OMB)  2147483648 (2048. OMB)  2147483648 (2048.014B)  2147483648 (2048.014B)  2  10  268435456 (256. OMB)  - 1073741824 (1024.014B)  268435456 (256. OMB)  O (0.014B)  New Generation (Eden + 1 Survivor Space) :  capacity  used  f ree  1968570368 (1877.375MB)  1822766864 (1738.32594299316414B)  145803504 (139.0490570068359414B)  92.59343194583735% used  Eden Space:  capacity  used  f ree  1789657088 (1706.7514B)  1774411392 (1692.210571289062514B)  15245696 (14.5394287109375MB)  99.14812194457669% used  From Space:  capacity  used  f ree  178913280 (170.62514B)  48355472 (46.1153717041015614B)  130557808 (124.50962829589844MB)  27.02732407566392% used
    To Space:  capacity  used  f ree  0.0% used  178913280  O (O.OMB)  178913280  (170.625MB)  (170.625MB)  concurrent mark-sweep generation:  capacity  used  f ree  2147483648 (2048.0MB)  299866328 (285.97481536865234MB)  1847617320 (1762.0251846313477MB)  13.963614031672478% used
    2.dump
    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
    ![$sudo -u num 1: 2: 3: 4: 5: 6: 7: admin /opt/taobao/instaU/ajdk-8 1 1 fpl name -b52/bin/ j map -histo 2815 head -10 #ins tances 853529 355583 62522 760046 80380 140015 133162 #bytes 86068120 68141472 25186360 18241104 5667176 4480480 4261184 class [C [B [1 java . lang. String Ljava.Iang.Object; com.taobao . csp . sentinel . util . LongAdder com.taobao . pandora . loader. util . AsciiBytes

    jstat

    jstat参数众多,但是使用一个就够了
    sudo -u admin /opt/taobao/install/ajdk-8_1_1_fp1-b52/bin/jstat -gcutil 2815 1000
    $sudo  -u  so  3.06  0.00  27 . 40  9.76  94.39  3.06  0.00  27 . 52  9.76  94.39  3.06  0.00  27.54  9.76  94.39  3.06  0.00  9.76  94.39  3.06  0.00  27.60  9.76  94.39  3.06  0.00  28.04  9.76  94.39  3.06  0.00  28.04  9.76  94.39  3.06  0.00  28.05  9.76  94.39  3.06  0.00  28.05  9.76  94.39  3.06  0.00  28.05  9.76  94.39  3.06  0.00  28. 12  9.76  94.39  3.06  0.00  9.76  94.39  3.06  0.00  28.20  9.76  94.39  3.06  0.00  28.20  9.76  94.39  3.06  0.00  28.20  9.76  94.39  admin  /opt/taobao/instaII/ajdk-8  ccs  1 1 fpl  YGC  30  30  30  30  30  30  30  30  30  30  30  30  30  30  30  -b52/bin/jstat  YGCT FGC  -gcutil 2815  27  28  . 54  . 12  97  . 15  97  . 15  97.  15  97  . 15  97  . 15  97  . 15  97.  15  97.  15  97  . 15  97  . 15  97.  15  97  . 15  97  . 15  97.  15  97  . 15  2.580  2.580  2.580  2.580  2. 580  2.580  2.580  2.580  2.580  2.580  2.580  2.580  2. 580  2.580  2.580  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  FGCT  1.644  1. 644  1.644  1.644  1.644  1.644  1.644  1.644  1.644  1. 644  1.644  1.644  1.644  1.644  1.644  GCT  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224  4.224

    jdb

    时至今日,jdb也是经常使用的。
    jdb可以用来预发debug,假设你预发的java_home是/opt/taobao/java/,远程调试端口是8000.那么
    sudo -u admin /opt/taobao/java/bin/jdb -attach 8000.
    [yingchao.zyc@v218130055 —]$ sudo -u admin /opt/taobao/java/bin/jdb  j ava . tang . Throwable  j ava . tang . Throwable  -attach 8000
    出现以上代表jdb启动成功。后续可以进行设置断点进行调试。
    具体参数可见oracle官方说明http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html

    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
    阿里员工排查问题的工具清单,总有一款适合你! - 图32
    plugin of intellij idea
    阿里员工排查问题的工具清单,总有一款适合你! - 图33
    key promoter

    快捷键一次你记不住,多来几次你总能记住了吧?
    'Ctrl +Alt+R'  (Quick Run Maven Goal)  rt for the  2 time(s)  as defined in XML Namespaces, of

    maven helper

    分析maven依赖的好帮手。
    阿里员工排查问题的工具清单,总有一款适合你! - 图35
    VM options
    阿里员工排查问题的工具清单,总有一款适合你! - 图36
    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
    阿里员工排查问题的工具清单,总有一款适合你! - 图37
    jar包冲突
    阿里员工排查问题的工具清单,总有一款适合你! - 图38
    把这个单独写个大标题不过分吧?每个人或多或少都处理过这种烦人的case。我特么下边这么多方案不信就搞不定你?
    mvndependency: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
    阿里员工排查问题的工具清单,总有一款适合你! - 图39
    其他
    阿里员工排查问题的工具清单,总有一款适合你! - 图40
    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] [] ? 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实际时间=格林威治1970-01-01+(当前时间秒数-系统启动至今的秒数+dmesg打印的log时间)秒数:
    date -d “1970-01-01 UTC echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+12288812.926194"|bc seconds”
    剩下的,就是看看为什么内存这么大,触发了OOM-Killer了。
    阿里员工排查问题的工具清单,总有一款适合你! - 图41
    新技能get
    阿里员工排查问题的工具清单,总有一款适合你! - 图42
    RateLimiter

    想要精细的控制QPS? 比如这样一个场景,你调用某个接口,对方明确需要你限制你的QPS在400之内你怎么控制?这个时候 RateLimiter 就有了用武之地。详情可移步http://ifeve.com/guava-ratelimite
    GOPS 2019 .  G 0 P S 迪  -AIOps 风 向 标  大 会 时 间 : 2019 年 4 月 12 日 . 13 日  0 . 00
    点击阅读原文,立即订票
    阅读原文
    已使用 OneNote 创建。