[关闭]
@cdmonkey 2026-04-27T05:58:02.000000Z 字数 6238 阅读 388

sysdig

命令总结


Sysdig 一个工具就能完成几乎所有系统分析工具的功能,并且提供了统一的使用语法。
Sysdig 既能获得实时系统数据,也能把信息保存至指定文件中以供后面分析。

Sysdig 通过于内核 driver 模块注册系统调用的 hook,这样当有系统调用发生、完成时,它将把系统调用信息拷贝至特定的 buffer,然后相关用户模块对数据信息进行处置(解压、解析、过滤等),并最终通过 Sysdig 命令行同用户进行交互。

安装

首先要把虚机《安全引导》功能关闭!

另外,Sysdig 对内核版本有一定版本要求,若是内核太旧就没办法使用了。

  1. # Update kernel
  2. # Must install kernel-headers
  3. yum install kernel kernel-headers kernel-tools

至少需要安装两个软件包:sysdig、scap-driver-loader(位于 tar.gz 包内)

第一次使用前要载入相关内核模块:

  1. scap-driver-loader
  2. # Check:
  3. [root@yunweizhicheng ~]# lsmod|grep scap
  4. scap 983040 0

否则会有下面的报错:

  1. [root@yunweizhicheng ~]# sysdig -w fdbytes_by.scap -C 30
  2. Unable to load the driver
  3. error opening device /dev/scap0. Make sure you have root credentials and that the scap module is loaded: No such file or directory

容器部署

若是使用容器的方式安装,需要把主机的很多系统目录 mount 至容器中:

  1. docker run -i -t --name sysdig --privileged \
  2. -v /var/run/docker.sock:/host/var/run/docker.sock \
  3. -v /dev:/host/dev \
  4. -v /proc:/host/proc:ro \
  5. -v /boot:/host/boot:ro \
  6. -v /lib/modules:/host/lib/modules:ro \
  7. -v /usr:/host/usr:ro \
  8. sysdig/sysdig

AlmaLinux 8.10

  1. yum install kernel-devel-$(uname -r)
  2. yum localinstall sysdig-0.40.0-x86_64.rpm

Rocky9 + RPM

首先是确保安装了 epel 源:

  1. yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
  2. # 把 repo 配置中的地址替换为阿里云镜像站地址
  3. sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
  4. sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

需要 kernel-develkernel-devel-matched 这俩包,我是从这里下载。

  1. # uname -r: 5.14.0-427.13.1.el9_4.x86_64
  2. yum localinstall kernel-devel-5.14.0-427.13.1.el9_4.x86_64.rpm
  3. yum localinstall kernel-devel-matched-5.14.0-427.13.1.el9_4.x86_64.rpm

安装 dkms

  1. yum install dkms

最后安装 Sysdig

  1. yum localinstall sysdig-0.38.1-x86_64.rpm

剩下的就是载入内核模块。但是很遗憾,模块无法载入,怎么着都不行。

  1. depmod.....
  2. * scap module installed in dkms
  3. * scap module found: /var/lib/dkms/scap/7.2.0+driver/5.14.0-427.13.1.el9_4.x86_64/x86_64/module/scap.ko.xz
  4. * Trying to insmod
  5. * Unable to insmod scap module
  6. * Trying to load a system scap module, if present
  7. Consider compiling your own scap driver and loading it or getting in touch with the Sysdig community

Github 上有类似的安装问题,参考这个:https://github.com/draios/sysdig/issues/2035,提供的解决办法是使用 --modern-bpf 参数运行指令。

--modern-bpf    Enable live capture using the modern BPF probe instead of the kernel module.

大概意思就是使用 BPF 探针而不是内核模块启用实时捕获。用了一下,似乎是没问题。

只能这样吧,目前没有找出其他解决办法。

使用

sysdig [option]...  [filter]
Opt LongOpt Explain
-A --print-ascii 只输出数据中文本部分 ,就是人可直接阅读之内容。
-b --print-base64
-w --write 将事件捕获(trace)内容写入指定文件。
-r --read 从哪里读入事件信息,通常是个 trace 文件。
-z --compress 启用 trace 文件压缩。

直接输入 sysdig 就能开始捕获系统信息,这个命令需要系统管理员权限,执行后将看出终端有持续不断的输出流(尽量别这么干,否则有时 Ctrl+C 都不能将其中断,而且根本无法看清更无法分析输出之信息)。总之就是,即便系统看似很清闲,底层也是时刻不停的进行着太多的系统调用。

基本上就是这个样子:

  1. 1606115 11:43:46.227503319 3 sshd (32228.32228) > clock_gettime
  2. 1606116 11:43:46.227503783 3 sshd (32228.32228) < clock_gettime
  3. 1606117 11:43:46.227504565 3 sshd (32228.32228) > select
  4. 1606118 11:43:46.227505979 3 sshd (32228.32228) < select res=2
  5. 1606119 11:43:46.227506563 3 sshd (32228.32228) > rt_sigprocmask
  6. 1606120 11:43:46.227506965 3 sshd (32228.32228) < rt_sigprocmask
  7. 1606121 11:43:46.227507457 3 sshd (32228.32228) > rt_sigprocmask
  8. 1606122 11:43:46.227507763 3 sshd (32228.32228) < rt_sigprocmask
  9. 1606123 11:43:46.227508278 3 sshd (32228.32228) > clock_gettime
  10. 1606124 11:43:46.227508606 3 sshd (32228.32228) < clock_gettime
  11. 1606125 11:43:46.227509206 3 sshd (32228.32228) > read fd=12(<f>/dev/ptmx) size=16384
  12. 1606126 11:43:46.227510319 3 sshd (32228.32228) < read res=343 data=1077533 11:43:43.743077230 2 ...

每行是为一条记录,包含多个列,预设样式为:

  1. %evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info

列信息:

Field Explain
evt.num 递增事件号。
evt.outputtime 事件发生时间。
evt.cpu 事件被捕获时所处 CPU,就是系统调用是于哪个 CPU 上执行的。值 0 是为第一个 CPU
proc.name 事件之进程名,就是哪个进程之事件。
thread.tid 线程 id,若为单线程程序,就是进程 id(PID)
evt.dir 事件方向(direction),> 是为进入事件,< 是为退出事件。
evt.type 事件名(类型),像是 open、stat 等,一般是系统调用。
evt.args 事件参数。若是系统调用,这些对应着系统调用之参数。

列出指令支持的所有事件(主要是系统调用):

  1. sysdig -L

保存为文件使用 -w

Filter

因为 Sysdig 输出内容很多,不管是监控还是查问题,需要关注的事件只是其中很小一部分。这个时候就要使用过滤功能,定位目标事件。Sysdig 过滤功能很强大,不仅过滤类型很多,而且还能够自由地进行逻辑组合。

列出所有过滤器:

  1. sysdig -l

指定过滤器:

  1. sysdig evt.type=read
  2. sysdig evt.type=read and proc.name=sshd

过滤器除了直接使用等号进行选择外,还有其他操作符,包括 =!=>=><<=containsinexists 等。

  1. sysdig fd.name contains /etc
  2. sysdig "evt.type in ( 'select', 'poll' )"
  3. sysdig proc.name exists

多个过滤条件还能够通过 andornot 进行逻辑操作:

  1. sysdig "not (fd.name contains /proc or fd.name contains /dev)"

Save to file

尽管可用过滤器减少输出,然而直接于终端查看事件流还是没有办法进行深入分析。同 tcpdump 工具类似,Sysdig 同样允许把捕获事件保存至本地文件,将文件内容做进一步分析。保存至文件可使用 -w,从文件中读出需要使用 -r

Chisels

使用 -c 指定 Chisels,它是一系列预定义功能集合。

sysdig's chisels(类目)是内置脚本,供使用者用于追踪系统调用、查看系统性能瓶颈,它是用强大而且高效的 Lua 脚本语言编写。

  1. sysdig -cl # --list-chisels,列出所有 Chisels

fdbytes_by

https://blog.51cto.com/shanker/1771418

  1. [root@hidocker02 ~]# sysdig -i fdbytes_by.lua
  2. Category: I/O
  3. -------------
  4. fdbytes_by.lua I/O bytes, aggregated by an arbitrary filter field
  5. Groups FD activity based on the given filter field, and returns the key that ge
  6. nerated the most input+output bytes. For example, this script can be used to li
  7. st the processes or TCP ports that generated most traffic.
  8. Args:
  9. [string] key - The filter field used for grouping

依据给定筛选字段对 FD 活动进行分组,并返回生成最多 IO 字节的键。举例说,这个脚本可用于列出生成最多流量的进程及 TCP 端口。

首先,捕获 30M 的包用于分析:

  1. sysdig -w fdbytes_by.scap -C 30

然后:

  1. [root@hidocker02 ~]# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.type
  2. Bytes fd.type
  3. --------------------------------------------------------------------------------
  4. 484.63KB file
  5. 18.60KB ipv4
  6. 475B netlink
  7. 20B unix
  8. 8B timerfd

然后:

  1. [root@hidocker02 ~]# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.directory "fd.type=file"
  2. Bytes fd.directory
  3. --------------------------------------------------------------------------------
  4. 182.81KB /lib64
  5. 159.31KB /etc
  6. 61.08KB /usr/share/locale
  7. 52.55KB /proc
  8. 11.27KB /dev
  9. 11.07KB /dev/pts
  10. 6.35KB /proc/net
  11. 183B /proc/720

然后:

  1. [root@hidocker02 ~]# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.name "fd.directory=/lib64"
  2. Bytes fd.name
  3. --------------------------------------------------------------------------------
  4. 20.31KB /lib64/libselinux.so.1
  5. 20.31KB /lib64/libdl.so.2
  6. 20.31KB /lib64/libattr.so.1
  7. 20.31KB /lib64/libpthread.so.0
  8. 20.31KB /lib64/libpcre.so.1
  9. 20.31KB /lib64/libacl.so.1
  10. 20.31KB /lib64/libc.so.6
  11. 20.31KB /lib64/libcap.so.2
  12. 20.31KB /lib64/libnss_files.so.2

最后:

  1. # 看看有哪些程序访问这个目录:
  2. sysdig -r fdbytes_by.scap0 -c fdbytes_by proc.name "fd.directory=/lib64"
  3. # 具体查看某个文件:
  4. sysdig -r fdbytes_by.scap0 -c fdbytes_by proc.name "fd.directory=/lib64 and fd.filename=libnss_files.so.2"

topprocs_cpu

显示 CPU 使用率 Top10。

  1. sysdig -c topprocs_cpu

topprocs_file

  1. sysdig -c topprocs_file

其他

监控用户的操作命令:

  1. sysdig -c spy_users

查看占用网络带宽最多的进程:

  1. sysdig -c topprocs_net

查看读写量最大的文件:

  1. sysdig -c topfiles_bytes

Github

https://github.com/draios/sysdig

Wiki

https://github.com/draios/sysdig/wiki
https://github.com/draios/sysdig/wiki/Sysdig-Examples

参考内容:

https://www.cnblogs.com/linhaostudy/p/17017114.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注