生产环境(基于docker)故障排除? 有感于博客园三番五次翻车
<h2>前言</h2><p> 如题,有感于博客园最近多次翻车,感觉像胡子眉毛一把抓, 定位不了生产环境的问题。</p>
<p>抛开流程问题,思考在生产环境中如何做故障排除, 发现博客园里面这方面的文章比较少。</p>
<p><img src="https://img2018.cnblogs.com/blog/587720/201908/587720-20190824092055866-838770668.gif" alt=""></p>
<p>.Net 本身是提供了sos.dll工具帮助我们在生产中故障排除,通过提供有关内部公共语言运行时(CLR)环境的信息,帮助您在Visual Studio和Windows调试器(WinDbg.exe)中调试托管程序。</p>
<h2>头脑风暴</h2>
<p>故障排除的核心是:<strong>调试待分析进程的dump文件 </strong></p>
<h3><strong>常规思路</strong></h3>
<p>① ps aux 找到待分析进程<span style="background-color: rgba(255, 255, 0, 1)">PID</span></p>
<p>② .netcore runtime自带createdump工具</p>
<p><strong><strong><img src="https://img2018.cnblogs.com/blog/587720/201908/587720-20190827102303229-1889103846.png" alt=""></strong></strong></p>
<p>③ 执行 ./createdump -f -u {<span style="background-color: rgba(255, 255, 0, 1)">PId</span>} 命令导出coredump文件,默认生成 /tmp/coredump.%d dump文件, 使用Visual Studio 或者Windebug调试dump文件</p>
<h3>容器中遇到的障碍</h3>
<ul>
<li> .netcore app容器中需要有容器特权模式才能执行createdump命令, 否则会如下图错误</li>
</ul>
<p><img src="https://img2018.cnblogs.com/blog/587720/201908/587720-20190826184001565-1950062312.png" alt=""></p>
<p> ps:可通过在docker run 生成该容器时增加<span style="background-color: rgba(255, 255, 0, 1)">--privileged = true</span>操作特权</p>
<ul>
<li>
<p> 常规.netcore app容器内不包含ps命令, 难以明确容器内dotnet 进程PID</p>
</li>
<li>
<p> 容器内导出的coredump文件,还需要使用 docker cp 命令导出到docker 主机,再行调试。</p>
</li>
</ul>
<p>针对容器内.NetCore app生产调试,国外大牛已经针对 .NetCore特定runtime版本制成了<span class="hljs-number"><span class="hljs-number">工具镜像</span></span></p>
<h2>Analyze running container</h2>
<p> 以下假设待分析容器使用的.netcore runtime与6opuc/lldb-netcore 工具镜像内runtime 相同。</p>
<p>1.找到待分析容器id (docker ps),例如: b5063ef5787c</p>
<p>2.运行包含createdump工具的容器(需要sys_admin,sys_ptrace特权), 如果运行的容器已经包含这个特权,可附加待分析容器并在容器中执行createdump工具</p>
<div>
<div class="cnblogs_code">
<pre>docker run --rm -it --cap-add sys_admin --cap-add sys_ptrace --net=container:b5063ef5787c --pid=container:b5063ef5787c -v /tmp:/tmp 6opuc/lldb-netcore /bin/bash</pre>
</div>
<blockquote>
<p> --net=container:b5063ef5787c 重用待分析容器的网络堆栈</p>
<div id="2950-1566978130053">
<div>--pid=container:b5063ef5787c 加入待分析容器的PID命名空间</div>
</div>
<div id="7511-1566978130053">
<div>Joining another container’s pid namespace can be used for debugging that container</div>
</div>
</blockquote>
</div>
<p><span class="hljs-number" style="color: rgba(0, 0, 0, 1)">3. 找到待分析dotnet进程PID: px aux</span></p>
<p><span class="hljs-number" style="color: rgba(0, 0, 0, 1)">4. 生成dotnet进程的 coredump文件,并退出容器</span></p>
<div class="cnblogs_code">
<pre>createdump -u -f/tmp/coredump <span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)"> # 7是dotnet进程id
exit</span></pre>
</div>
<p><span class="hljs-number" style="color: rgba(0, 0, 0, 1)">5. 使用debugger打开coredump文件</span></p>
<div class="cnblogs_code">
<pre>docker run --rm -it -v /tmp/coredump:/tmp/coredump 6opuc/lldb-netcore</pre>
</div>
<p> output:</p>
<div class="cnblogs_code">
<pre>(lldb) target create <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/usr/bin/dotnet</span><span style="color: rgba(128, 0, 0, 1)">"</span> --core <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/tmp/coredump</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Core file </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/tmp/coredump</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> (x86_64) was loaded.
(lldb) plugin load </span>/coreclr/<span style="color: rgba(0, 0, 0, 1)">libsosplugin.so
(lldb) sos PrintException
There </span><span style="color: rgba(0, 0, 255, 1)">is</span> no current managed exception on <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)"> thread
(lldb)</span></pre>
</div>
<p>6. 在lldb shell : help命令继续探索</p>
<p> lldb使用方式可参考https://docs.microsoft.com/en-us/dotnet/framework/tools/sos-dll-sos-debugging-extension</p>
<h2><span class="hljs-number" style="color: rgba(0, 0, 0, 1)">常见用例</span></h2>
<p>该DockerHub Repo还提供了基于docker 生产故障排除的常见用例:</p>
<ul>
<li>Process hang with idle CPU</li>
<li>Process hang with high CPU usage</li>
<li>Process crash</li>
<li>Excessive memory usage</li>
</ul>
<p>这个镜像对于基于容器的故障排除相当有用,不敢自称原创镜像;</p>
<p>分享给大家, 希望园友通过经历生产环境的故障排除,进阶为资深研发。</p>
<p>+ <em>dotnet core调试docker下生成的dump文件</em></p>
<p>+ <em>Windbg程序调试系列-索引篇</em></p>
</div>
<div id="MySignature" role="contentinfo">
<HR style="FILTER: alpha(opacity=100,finishopacity=0,style=3)" width="80%" color=#987cb9 SIZE=3>
<div style="text-align:center;">
<p>本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/11365593.html</p>
<strong style="color: red; ">欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化</strong>
<div><imgstyle="width: 250px;height:250px;" src="https://blog-static.cnblogs.com/files/JulianHuang/QR.gif" /> </div>
</div><br><br>
来源:https://www.cnblogs.com/JulianHuang/p/11365593.html
頁:
[1]