生产环境(基于docker)故障排除? 有感于博客园三番五次翻车


前言

  如题,有感于博客园最近多次翻车,感觉像胡子眉毛一把抓, 定位不了生产环境的问题。

抛开流程问题,思考在生产环境中如何做故障排除, 发现博客园里面这方面的文章比较少。

.Net 本身是提供了工具镜像

Analyze running container

  以下假设待分析容器使用的.netcore runtime与6opuc/lldb-netcore 工具镜像内runtime 相同。

1.找到待分析容器id (docker ps),例如: b5063ef5787c

2.运行包含createdump工具的容器(需要sys_admin,sys_ptrace特权), 如果运行的容器已经包含这个特权,可附加待分析容器并在容器中执行createdump工具

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

 --net=container:b5063ef5787c 重用待分析容器的网络堆栈

--pid=container:b5063ef5787c 加入待分析容器的PID命名空间 Joining another container’s pid namespace can be used for debugging that container

3. 找到待分析dotnet进程PID:    px aux

4. 生成dotnet进程的 coredump文件,并退出容器

createdump -u -f  /tmp/coredump 7            # 7是dotnet进程id
exit

5. 使用debugger打开coredump文件

docker run --rm -it -v /tmp/coredump:/tmp/coredump 6opuc/lldb-netcore

  output:

(lldb) target create "/usr/bin/dotnet" --core "/tmp/coredump"
Core file '/tmp/coredump' (x86_64) was loaded.
(lldb) plugin load /coreclr/libsosplugin.so
(lldb) sos PrintException
There is no current managed exception on this thread
(lldb)

6. 在lldb shell : help命令继续探索

  lldb使用方式可参考https://docs.microsoft.com/en-us/dotnet/framework/tools/sos-dll-sos-debugging-extension

常见用例

该DockerHub Repo还提供了基于docker 生产故障排除的常见用例:

  • Process hang with idle CPU
  • Process hang with high CPU usage
  • Process crash
  • Excessive memory usage

这个镜像对于基于容器的故障排除相当有用,不敢自称原创镜像;

分享给大家, 希望园友通过经历生产环境的故障排除,进阶为资深研发。

+