像 Boss 一样用 sysdig 来排查问题

你可能还不知道,现在有一个新工具sysdig,可以用它来排查故障。它被鼓吹是 strace 和 tcpdump 的合体,我认为这是一种炒作。我倒觉得可以把 sysdig 同 SystemTap 和 tcpdump一起比较,因为它的命令语法类似tcpdump,而功能像 SystemTap 一样强大。

我在本文中会介绍关于 sysdig 的一些基础知识和很棒的例子,你可以在 sysdig wiki 上找到更为详细的信息。然而,即便是 sysdig 的官方文档,也只涉及 sysdig 功能的皮毛而已。

安装

本文中我们将在 Ubuntu 上使用 apt-get 安装sysdig。如果你运行的是基于 rpm 的发行版,你可以在wiki上找到通过 yum 安装的细节。

准备 apt 仓库

通过 apt 安装sysdig,我们需要准备好 apt 仓库,由 sysdig 后面的 Draios 公司来维护。可以运行下面的 curl 命令来完成:

第一行命令下载 Draios gpg 密钥并把它加入 apt 密钥库。第二行从 Draios 下载 apt 源文件,并把它放到 /etc/apt/sources.list.d/ 路径下。

更新 apt 的索引

一旦安装好源文件列表和 gpg 密钥,需要运行 apt-get update 来重新同步 apt 包的索引。

内核头文件包

sysdig 工具需要用到内核头文件包,开始安装前,需要确认内核头文件包已安装上。

检查内核头文件是否安装

在这个例子中,我使用的系统已经安装了内核头文件包,你可以使用 dpkg 命令查看你的系统上是否有安装。

有一点要特别注意,内核头文件包必须和你系统上的内核版本相匹配。从上面的输出,你可以看到 linux-generic 包的版本号是3.11.0.12,头文件包也是3.11.0.12。如果你有多个内核,你可以通过 uname 命令来确认你正在运行哪个版本。

安装内核头文件包

你可以用 apt-get 安装与内核匹配的头文件包。记住,你必须确认内核的版本信息,可以通过 uname -r 来获得。

例如

安装 sysdig

既然 apt repo 安装完成,那么所需的依赖条件都已满足。下面可以安装 sysdig 命令了。

使用 sysdig

基本操作

sysdig 语法和 tcpdump类似,特别是保存和读取记录文件的时候。与tcpdump 一样,sysdig 所有的输出都可以存成一个文件方便后面阅读。如果你正在运行一个进程或者遇到一个问题,希望之后再来通过信息深入挖掘,这个功能就很有帮助。

写入记录文件

语法:

例子:

像tcpdump一样,sysdig 命令也可以用 CTRL+C 来停止。

读取记录文件

你一旦写了一个记录文件,就需要用 sysdig 读取这个文件,这可以通过 -r 标记来完成。

语法:

例子:

按 ASCII 格式输出

sysdig 默认按照二进制保存文件,但你可以通过使用-A 标记得到 ASCII 格式的输出。

语法:

例子:

上面的例子把输出重定位到一个文本文件。如果你想保存文件并在一个没有安装 sysdig 的系统上检查数据,就可以这样做。

sysdig 过滤器

和 tcpdump 很像,sysdig 命令也有过滤器,可以用来过滤输出,得到特定的信息 。你可以通过-l 标记列出所有可用的过滤器。

例子:

过滤器例子

抓取特定的进程

你可以使用“proc.name” 过滤器去抓取特定进程的所有 sysdig 事件。下面的例子中,我过滤了所有名字中包含 sshd 的进程。

例子:

抓取打开一个特定文件的所有进程

fd.name这个过滤器用在过滤一个特定文件名的事件。这样可以看到有哪些进程来读取或者写入特定的文件或 socket。

例子:

抓取打开一个特定文件系统的所有进程

你也可以在过滤器中使用比较运算符,例如包含、=、!=、<=、>=、< 和 >。

例子:

从上面这些例子,你可以看出过滤器可以用来读取文件或者活动的事件流 。

凿子

前面我把 sysdig 类比 SystemTap 的原因就在于 凿子(Chisels)。类似 SystemTap 这类工具都有它自己的脚本语言,可以用来拓展 SystemTap 的功能。在 sysdig 中,它们叫做凿子,可以用 LUA 这种常见编程语言来编写。我个人认为选择使用 LUA 是一个好点子,这可以让新手很容易拓展 sysdig。

列出可用的凿子

可以通过 -cl 标记,列出所有可以使用的凿子。

例子:

虽然 sysdig 还很新,但这个列表相当长,而且 sysdig 在 GitHub 上,你可以很容易拓展和贡献自己的凿子。

显示凿子的信息

列表命令可以让你大致了解每个凿子,你还可以通过 -i 标记加凿子名来获取更详细的信息。

例子:

运行凿子

你可以通过 -c 标记和指定凿子名,让 sysdig 来运行这个凿子。

例子:

带过滤器运行凿子

你在运行凿子时候,仍然可以使用对特定的事件使用过滤器。

抓取一个特定进程的所有网络流量

下面这个例子显示对 apache2 进程使用 echo_fds 凿子。

抓取一个特定 IP 的网络流量交换

我们使用 echo_fds 凿子和fd.cip 过滤器 ,显示单独一个 IP 所有的网络流量。

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

任选一种支付方式

1 3 收藏 2 评论

关于作者:至秦

Linux,Networking 个人主页 · 我的文章 · 53 ·  

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 楷子狐 运维 2015/10/19

    # sysdig
    Unable to load the driver
    error opening device /dev/sysdig0. Make sure you have root credentials and that the sysdig-probe module is loaded.

    # sysdig-probe-loader
    * Unloading sysdig-probe, if present
    rmmod: ERROR: Module sysdig_probe is not currently loaded
    * Running dkms autoinstall
    Error! Your kernel headers for kernel 3.16.0-4-amd64 cannot be found.
    Please install the linux-headers-3.16.0-4-amd64 package,
    or use the --kernelsourcedir option to tell DKMS where it's located
    * Trying to load a system sysdig-probe, if present
    * Trying to load a dkms sysdig-probe, if present
    * Trying to find precompiled sysdig-probe for 3.16.0-4-amd64
    Found kernel config at /boot/config-3.16.0-4-amd64
    * Trying to download precompiled module from https://s3.amazonaws.com/download.draios.com/stable/sysdig-probe-binaries/sysdig-probe-0.3.0-x86_64-3.16.0-4-amd64-a209fc457663e80a14b81fd0e5a87407.ko
    Download failed, consider compiling your own sysdig-probe and loading it or getting in touch with the sysdig community

    • 尊敬的Sysdig用户

      为了解决这个错误:

      "Error! Your kernel headers for kernel 3.16.0-4-amd64 cannot be found"

      请尝试使用此命令安装你的kernal header文件:

      apt-get -y install linux-headers-$(uname -r)

      如果你还有问题,请留言在下面的Sysdig博客:

      https://groups.google.com/forum/#!forum/sysdig

      希望能帮助!

      MartinL

跳到底部
返回顶部