You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
arthas/arthas_3_0/new_feature.html

420 lines
24 KiB
HTML

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Arthas 3.0新特性介绍 &mdash; Arthas 3.0.6-SNAPSHOT 文档</title>
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/overrides.css" type="text/css" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
<script src="../_static/center_page.js"></script>
<script src="../_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="../index.html" class="icon icon-home"> Arthas
</a>
<div class="version">
3.0.6-SNAPSHOT
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference external" href="https://alibaba.github.io/arthas/en/">English Docs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../install-detail.html">安装</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quick-start.html">快速入门</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced-use.html">进阶使用</a></li>
<li class="toctree-l1"><a class="reference internal" href="../commands.html">命令列表</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/alibaba/arthas/issues?q=label%3Auser-case">用户案例</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/alibaba/arthas/issues?q=label%3Aquestion-answered">Questions and answers</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/alibaba/arthas">Fork me at GitHub</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md">参与贡献</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release-notes.html">Release Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../contact-us.html">QQ群/钉钉群</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Arthas</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Docs</a> &raquo;</li>
<li>Arthas 3.0新特性介绍</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/alibaba/arthas/blob/master/site/src/site/sphinx/arthas_3_0/new_feature.md" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="arthas-3-0">
<span id="arthas-3-0"></span><h1>Arthas 3.0新特性介绍<a class="headerlink" href="#arthas-3-0" title="永久链接至标题"></a></h1>
<p>Arthas 3.0在架构上做了重大改造,通过引入<code class="docutils literal notranslate"><span class="pre">termd</span></code>完整的支持了telnet协议并基于websocket封装了telnet协议实现了<code class="docutils literal notranslate"><span class="pre">Telnet</span> <span class="pre">over</span> <span class="pre">HTTP</span></code>使得在线诊断成为了可能并且保证了本地启动telnet远程访问在线诊断三种方式的体验完全一致。都支持自动补全高亮显示等功能。并且支持<code class="docutils literal notranslate"><span class="pre">多人同时在线诊断</span></code></p>
<div class="section" id="">
<span id="id1"></span><h2>在线诊断<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>Arthas 3.0最重要的特性通过Arthas在线诊断平台无需再登陆目标机器一键启动Arthas并开启诊断</p>
<p>![image](TODO image.png)</p>
<p>具体使用方法请参见<a class="reference external" href="https://github.com/alibaba/arthas/wiki/arthas_3_0/home">在线诊断使用说明</a></p>
</div>
<div class="section" id="">
<span id="id2"></span><h2>管道支持<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>Arthas 3.0开始支持管道, 率先提供了<code class="docutils literal notranslate"><span class="pre">grep</span></code>,<code class="docutils literal notranslate"><span class="pre">wc</span></code>,<code class="docutils literal notranslate"><span class="pre">plaintext</span></code>的支持。</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span> java.vendor.url http://java.oracle.com/
java.vm.vendor Oracle Corporation
java.runtime.name Java<span class="o">(</span>TM<span class="o">)</span> SE Runtime Environment
sun.java.command org.apache.catalina.startup.Bootstrap start
java.class.path /Users/wangtao/work/ali-tomcat-home/ant-develop/output/build/bin/bootstrap.jar
java.vm.specification.name Java Virtual Machine Specification
java.vm.specification.version <span class="m">1</span>.8
java.awt.headless <span class="nb">true</span>
java.io.tmpdir /Users/wangtao/work/ali-tomcat-home/ant-develop/output/build/temp
java.vendor.url.bug http://bugreport.sun.com/bugreport/
java.awt.graphicsenv sun.awt.CGraphicsEnvironment
java.ext.dirs /Users/wangtao/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.
/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
java.vm.name Java HotSpot<span class="o">(</span>TM<span class="o">)</span> <span class="m">64</span>-Bit Server VM
java.specification.version <span class="m">1</span>.8
$ sysprop <span class="p">|</span> grep java <span class="p">|</span> wc -l
<span class="m">36</span>
</pre></div>
</div>
</div>
<div class="section" id="">
<span id="id3"></span><h2>启动自检<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>针对启动时经常出现的权限问题在启动脚本中增加了自检逻辑脚本会自动判断目标进程是否具备attach权限并给出进一步的提示。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[huxing.zhx@v125056161.bja /home/huxing.zhx]
$./as.sh 32260
The current user (huxing.zhx) does not match with the owner of process 32260 (admin).
To solve this, choose one of the following command:
1) sudo su admin &amp;&amp; ./as.sh
2) sudo -u admin -EH ./as.sh
</pre></div>
</div>
</div>
<div class="section" id="groovy">
<span id="groovy"></span><h2>去groovy依赖<a class="headerlink" href="#groovy" title="永久链接至标题"></a></h2>
<p>groovy表达式在arthas2.0中大量使用例如watch表达式</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;params + &#39; &#39; + returnObj&quot;</span> params.size<span class="o">()==</span><span class="m">2</span>
</pre></div>
</div>
<p>其中<code class="docutils literal notranslate"><span class="pre">&quot;params</span> <span class="pre">+</span> <span class="pre">'</span> <span class="pre">'</span> <span class="pre">+</span> <span class="pre">returnObj&quot;</span></code>以及<code class="docutils literal notranslate"><span class="pre">params.size()==2</span></code>背后其实都使用了groovy来进行表达式求值如果反复大量的运行这些表达式groovy会创建大量的classloader打满perm区从而触发FGC。</p>
<p>为了避免这个问题Arthas 3.0中使用了ognl这个更加轻量的表达式求值库来代替groovy彻底解决了groovy引起的FGC风险。但由于这个替换导致原来使用groovy脚本编写的自定义脚本失效。这个问题留待后续解决。</p>
<p>在3.0中watch命令的表达式部分的书写有了一些改变详见<a class="reference external" href="https://alibaba.github.io/arthas/watch">这里</a></p>
</div>
<div class="section" id="rt">
<span id="rt"></span><h2>提升rt统计精度<a class="headerlink" href="#rt" title="永久链接至标题"></a></h2>
<p>Arthas 2.0中统计rt都是以<code class="docutils literal notranslate"><span class="pre">ms</span></code>为单位对于某些比较小的方法调用耗时在毫秒以下的都会被认为是0ms造成trace总时间和各方法的时间相加不一致等问题虽然这里面确实会有误差主要Arthas自身的开销。Arthas 3.0中所有rt的单位统一改为使用<code class="docutils literal notranslate"><span class="pre">ns</span></code>来统计精准捕获你的方法耗时让0ms这样无意义的统计数据不再出现</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -l
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
------------------------------------------------------------------------------------------------------------------------------------------------------------
1000 2017-02-24 10:56:46 808.743525 true false 0x3bd5e918 TestTraceServlet doGet
1001 2017-02-24 10:56:55 805.799155 true false 0x3bd5e918 TestTraceServlet doGet
1002 2017-02-24 10:57:04 808.026935 true false 0x3bd5e918 TestTraceServlet doGet
1003 2017-02-24 10:57:22 805.036963 true false 0x3bd5e918 TestTraceServlet doGet
1004 2017-02-24 10:57:24 803.581886 true false 0x3bd5e918 TestTraceServlet doGet
1005 2017-02-24 10:57:39 814.657657 true false 0x3bd5e918 TestTraceServlet doGet
</pre></div>
</div>
</div>
<div class="section" id="watch-stack-trace">
<span id="watch-stack-trace"></span><h2>watch/stack/trace命令支持按耗时过滤<a class="headerlink" href="#watch-stack-trace" title="永久链接至标题"></a></h2>
<p>我们在trace的时候经常会出现某个方法间隙性的rt飙高但是我们只想知道rt高的时候是哪里慢了对于正常rt的方法我们并不关心Arthas 3.0支持了按<code class="docutils literal notranslate"><span class="pre">#cost</span></code>(方法执行耗时,单位为<code class="docutils literal notranslate"><span class="pre">ms</span></code>)进行过滤只输出符合条件的trace路径。</p>
<p>具体用法为:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">trace</span><span class="o">/</span><span class="n">watch</span><span class="o">/</span><span class="n">stack</span> <span class="n">class_name</span> <span class="n">method</span> <span class="n">cost_expression</span>
</pre></div>
</div>
<p>例如:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ trace test.arthas.TestTraceServlet doGet #cost&gt;800
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 137 ms.
trace test.arthas.TestTraceServlet doGet #cost&gt;800
`---thread_name=http-bio-8080-exec-9;id=6e;is_daemon=true;priority=5;TCCL=org.apache.catalina.loader.WebappClassLoader
`---[816.880001ms] test.arthas.TestTraceServlet:doGet()
+---[min=0.019223ms,max=1.192115ms,total=1.211338ms,count=2] java.lang.System:currentTimeMillis()
+---[1.407006ms] test.arthas.TestTraceServlet:call1()
+---[381.970892ms] test.arthas.TestTraceServlet:callhsfL1()
+---[0.018866ms] test.arthas.TestPathTrace:&lt;init&gt;()
+---[375.753301ms] test.arthas.TestPathTrace:callPathTrace()
+---[12.352252ms] test.arthas.TestTraceServlet:call3()
+---[2.758025ms] test.arthas.TestTraceServlet:call4()
+---[1.246057ms] test.arthas.TestTraceServlet:call5()
+---[10.306568ms] test.arthas.TestTraceServlet:call6()
+---[8.891933ms] test.arthas.TestTraceServlet:call7()
+---[4.030325ms] test.arthas.TestTraceServlet:call8()
+---[6.51316ms] test.arthas.TestTraceServlet:call9()
+---[0.059405ms] javax.servlet.http.HttpServletResponse:getWriter()
+---[0.013107ms] java.lang.StringBuilder:&lt;init&gt;()
+---[min=0.004892ms,max=0.06357ms,total=0.100672ms,count=3] java.lang.StringBuilder:append()
+---[0.018255ms] java.lang.StringBuilder:toString()
`---[0.028812ms] java.io.PrintWriter:write()
</pre></div>
</div>
<p>上述命令只有当<code class="docutils literal notranslate"><span class="pre">test.arthas.TestTraceServlet#doGet</span></code>方法执行耗时大于800ms时才会输出。</p>
</div>
<div class="section" id="trace">
<span id="trace"></span><h2>trace命令优化<a class="headerlink" href="#trace" title="永久链接至标题"></a></h2>
<div class="section" id="">
<span id="id4"></span><h3>自动高亮显示最耗时方法调用<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>trace命令现在会自动显示</p>
<p><img alt="image" src="arthas_3_0/TODO/image.png" /></p>
</div>
<div class="section" id="trace">
<span id="id5"></span><h3>带条件过滤的多级trace<a class="headerlink" href="#trace" title="永久链接至标题"></a></h3>
<p>目前trace默认只输出一级方法调用耗时有时候并不能完全看出问题。但是如果展开多级的话每一个方法的耗时都统计会造成方法数量迅速膨胀大大增加trace的开销。</p>
<p>TODO</p>
</div>
<div class="section" id="eagleeyetraceid">
<span id="eagleeyetraceid"></span><h3>显示当前线程的信息及eagleeye的traceId<a class="headerlink" href="#eagleeyetraceid" title="永久链接至标题"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>trace test.arthas.TestTraceServlet doGet
`---thread_name=http-bio-8080-exec-10;id=da;is_daemon=true;priority=5;TCCL=org.apache.catalina.loader.WebappClassLoader;trace_id=1e09489014879085429791006d969d
</pre></div>
</div>
</div>
</div>
<div class="section" id="syspropsystemproperty">
<span id="syspropsystemproperty"></span><h2>sysprop命令操作SystemProperty<a class="headerlink" href="#syspropsystemproperty" title="永久链接至标题"></a></h2>
<p>sysprop命令支持查看所有的系统属性以及针对特定属性进行查看和修改。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sysprop
...
os.arch x86_64
java.ext.dirs /Users/wangtao/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.
8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library
/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
user.dir /Users/wangtao/work/ali-tomcat-home/ant-develop/output/build
catalina.vendor alibaba
line.separator
java.vm.name Java HotSpot(TM) 64-Bit Server VM
file.encoding UTF-8
org.apache.tomcat.util.http.ServerCookie.ALLOW_EQUA true
LS_IN_VALUE
com.taobao.tomcat.info Apache Tomcat/7.0.70.1548
java.specification.version 1.8
$ sysprop java.version
java.version=1.8.0_51
$ sysprop production.mode true
Successfully changed the system property.
production.mode=true
</pre></div>
</div>
</div>
<div class="section" id="thread">
<span id="thread"></span><h2>thread命令支持指定采样时间<a class="headerlink" href="#thread" title="永久链接至标题"></a></h2>
<p>thread命令计算线程cpu占用的逻辑默认是采样100ms内各个线程的cpu使用情况并计算cpu消耗占比。有时候100ms的时间间隔太短看不出问题所在Arthas3.0中thread命令支持设置采样间隔(以<code class="docutils literal notranslate"><span class="pre">ms</span></code>为单位)可以观察任意时间段内的cpu消耗占比情况。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ thread -i 1000
Threads Total: 74, NEW: 0, RUNNABLE: 17, BLOCKED: 0, WAITING: 15, TIMED_WAITING: 42, TERMINATED: 0
ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTED DAEMON
78 com.taobao.config.client.timer main 5 TIMED_WAITING 22 0:0 false true
92 Abandoned connection cleanup thread main 5 TIMED_WAITING 15 0:2 false true
361 as-command-execute-daemon system 10 RUNNABLE 14 0:0 false true
67 HSF-Remoting-Timer-10-thread-1 main 10 TIMED_WAITING 12 0:2 false true
113 JamScheduleThread system 9 TIMED_WAITING 2 0:0 false true
14 Thread-3 main 5 RUNNABLE 2 0:0 false false
81 com.taobao.remoting.TimerThread main 5 TIMED_WAITING 2 0:0 false true
104 http-bio-7001-AsyncTimeout main 5 TIMED_WAITING 2 0:0 false true
123 nioEventLoopGroup-2-1 system 10 RUNNABLE 2 0:0 false false
127 nioEventLoopGroup-3-2 system 10 RUNNABLE 2 0:0 false false
345 nioEventLoopGroup-3-3 system 10 RUNNABLE 2 0:0 false false
358 nioEventLoopGroup-3-4 system 10 RUNNABLE 2 0:0 false false
27 qos-boss-1-1 main 5 RUNNABLE 2 0:0 false true
22 EagleEye-AsyncAppender-Thread-BizLog main 5 TIMED_WAITING 1 0:0 false true
</pre></div>
</div>
</div>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2018, Alibaba Middleware Group, and contributors.
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../',
VERSION:'3.0.6-SNAPSHOT',
LANGUAGE:'zh_CN',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/translations.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
<div class="github-fork-ribbon-wrapper right">
<div class="github-fork-ribbon">
<a href="https://github.com/alibaba/arthas">Fork me at GitHub</a>
</div>
</div>
<script type="text/javascript" src="../_static/add_badges.js"></script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?d5c5e25b100f0eb51a4c35c8a86ea9b4";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</body>
</html>