在Linux系统的运维工作中,监控和分析是保证系统稳定性和性能的关键环节。传统的监控工具如strace、tcpdump等各有所长,但往往只关注系统的某一方面,而且使用起来相对独立,缺乏统一的视角。在这样的背景下,Sysdig以其全面、深入的监控能力和对容器技术的友好支持,成为了SRE的新宠。
Sysdig的官网上自我介绍为:“具有原生容器支持的开源通用系统可视化工具”。这一定位准确概括了Sysdig的三大优势:整合性、强大的监控分析能力、以及灵活性。
Sysdig能够整合多个监控工具的功能,提供了一个统一的命令行界面,使得用户可以轻松捕获和分析系统数据。这种整合性大大提升了工作效率,尤其是在问题定位和性能调优方面。
Sysdig能够捕获全方位的系统参数,包括CPU、内存、磁盘IO和网络IO等。它还支持对各种IO活动的监控,如进程、文件、网络连接等。Sysdig不仅能够捕获信息,还提供了内置的分析工具,帮助用户从大量数据中提取有价值的信息。
Sysdig提供了类似于tcpdump的过滤语法,用户可以自定义过滤逻辑,精确地找到感兴趣的事件。此外,Sysdig允许用户通过Lua脚本来扩展分析逻辑,极大地增强了工具的适应性和灵活性。
Sysdig 的核心在于其能够捕获 Linux 系统中的系统调用和事件。它通过在内核中注册 tracepoint 钩子来实现这一功能。Tracepoint 是内核中的特定函数调用,可以在不修改内核代码的情况下,提供对内核函数执行的监控点。Sysdig 利用这些 tracepoint 放置处理程序,从而在内核层面捕获事件。
当系统调用发生时,Sysdig 会将相关信息复制到特定的缓冲区中。这些信息随后被用户态的组件处理,包括解压、解析和过滤。最终,这些数据通过 Sysdig 的命令行界面与用户进行交互。
Sysdig的安装过程在官方文档中有详细说明。安装时需注意内核版本的兼容性,并确保系统兼容。安装完成后,用户可以通过简单的命令开始捕获系统信息。可以参考官网:
https://github.com/draios/sysdig/wiki/How-to-Install-Sysdig-for-Linux
我们以root身份运行以下命令来从官方apt/yum仓库安装sysdig:
curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash
sysdig最原始的用法是直接从命令行运行sysdig命令。将获得类似 strace 的输出。
root@adming-virtual-machine:~# sysdig
4218 02:03:22.634534084 0 <NA> (<NA>.0) > switch next=293 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
4229 02:03:22.634552706 0 <NA> (<NA>.293) > switch next=0 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
4234 02:03:22.634566475 0 <NA> (<NA>.0) > switch next=293 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
4236 02:03:22.634568548 0 <NA> (<NA>.293) > switch next=0 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
4238 02:03:22.634572181 3 <NA> (<NA>.0) > switch next=2077(sshd) pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
4240 02:03:22.634575338 3 sshd (2077.2077) < ppoll res=2 fds=4:44 9:f1
4242 02:03:22.634578361 3 sshd (2077.2077) > rt_sigprocmask
4243 02:03:22.634578917 3 sshd (2077.2077) < rt_sigprocmask
4245 02:03:22.634580294 0 <NA> (<NA>.0) > switch next=293 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
所有的输入都是按照行来分割的,每行都是一条记录,由多个列组成,默认的格式是:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
各个字段的含义如下:
evt.num:递增的事件号
evt.time:事件发生的时间
evt.cpu:事件被捕获时所在的 CPU,也就是系统调用是在哪个 CPU 执行的。比较上面的例子中,值 0 代表机器的第一个 CPU
proc.name:生成事件的进程名字,也就是哪个进程在运行
thread.tid:线程的 id,如果是单线程的程序,这也是进程的 pid
evt.dir:事件的方向(direction),> 代表进入事件,< 代表退出事件
evt.type:事件的名称,比如 open、stat等,一般是系统调用
evt.args:事件的参数。如果是系统调用,这些对应着系统调用的参数
使用 Sysdig 显示上面给出的每个系统事件将导致数千个事件同时从屏幕上流出,这样我们将迷失在这种信息流中;Sysdig有一个非常先进的过滤系统,可以消除我们习惯于strace的这种低效情况。
sysdig [options]... [filter expressions]
可以通过不同的选项来调整Sysdig的行为,例如使用-w选项将监控数据写入文件,或者使用-r选项从文件中读取数据。过滤表达式则可以帮助用户聚焦于特定的事件或行为。
sysdig 的过滤器也是分成不同类别的,比如:
fd
: 对文件描述符(file descriptor)进行过滤,比如 fd 标号(fd.num
)、fd 名字(fd.name
)process
: 进程信息的过滤,比如进程 id(proc.id
)、进程名(proc.name
)evt
: 事件信息的过滤,比如事件编号、事件名user
: 用户信息的过滤,比如用户 id、用户名、用户 home 目录、用户的登录 shell(user.shell
)syslog
: 系统日志的过滤,比如日志的严重程度、日志的内容fdlist
: poll event 的文件描述符的过滤 可以使用 sysdig -l
查看完整的过滤器列表
sysdig -l |less
-------------------------------
Field Class: evt (All event types)
Description: These fields can be used for all event types
Event Sources: syscall
evt.num event number.
evt.time event timestamp as a time string that includes the nanosecond part.
evt.time.s event timestamp as a time string with no nanoseconds.
evt.time.iso8601 event timestamp in ISO 8601 format, including nanoseconds and time zone offset (in UTC).
evt.datetime event timestamp as a time string that includes the date.
evt.datetime.s event timestamp as a datetime string with no nanoseconds.
evt.rawtime absolute event timestamp, i.e. nanoseconds from epoch.
evt.rawtime.s integer part of the event timestamp (e.g. seconds since epoch).
evt.rawtime.ns fractional part of the absolute event timestamp.
例如 查看 cat 命令的活动,cat 命令在后台执行的所有操作都反映在屏幕上。
root@adming-virtual-machine:~# sysdig proc.name=cat
124652 02:55:00.232207785 2 cat (207733.207733) < execve res=0 exe=cat args=/etc/hosts. tid=207733(cat) pid=207733(cat) ptid=206878(bash) cwd=<NA> fdlimit=1024 pgft_maj=0 pgft_min=28 vm_size=432 vm_rss=0 vm_swap=0 comm=cat cgroups=cpuset=/.cpu=/.cpuacct=/.io=/.memory=/user.slice/user-0.slice/session-7.scope... env=SHELL=/bin/bash.LANGUAGE=en_US:.LC_ADDRESS=zh_CN.UTF-8.LC_NAME=zh_CN.UTF-8.LC... tty=34817 pgid=207733(cat) loginuid=0(root) flags=1(EXE_WRITABLE) cap_inheritable=0 cap_permitted=1FFFFFFFFFF cap_effective=1FFFFFFFFFF exe_ino=1048727 exe_ino_ctime=2024-03-21 01:28:49.519220220 exe_ino_mtime=2022-02-08 00:03:08.000000000 uid=0(root) trusted_exepath=/usr/bin/cat
124655 02:55:00.232225093 2 cat (207733.207733) > brk addr=0
124656 02:55:00.232225463 2 cat (207733.207733) < brk res=56D6FEA76000 vm_size=432 vm_rss=128 vm_swap=0
124663 02:55:00.232275867 2 cat (207733.207733) > arch_prctl
124664 02:55:00.232276170 2 cat (207733.207733) < arch_prctl
...
Sysdig 提供了一套强大的过滤器,它们不仅支持基础的相等性比较,还包含了一系列的操作符,如 =
、!=
、>=
、>
、<
、<=
、contains
、in
和 exists
,使得过滤条件更加灵活和精确。例如:
sysdig fd.name contains /etc
root@adming-virtual-machine:~# sysdig fd.name contains /etc
965 03:07:41.961701055 7 systemd (2080.2080) < openat fd=35(<f>/etc/environment) dirfd=-100(AT_FDCWD) name=/etc/environment flags=4097(O_RDONLY|O_CLOEXEC) mode=0 dev=803 ino=524443
970 03:07:41.961706085 7 systemd (2080.2080) > read fd=35(<f>/etc/environment) size=4096
971 03:07:41.961709030 7 systemd (2080.2080) < read res=106 data=PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/u
972 03:07:41.961709663 7 systemd (2080.2080) > read fd=35(<f>/etc/environment) size=4096
973 03:07:41.961710117 7 systemd (2080.2080) < read res=0 data=NULL
974 03:07:41.961710850 7 systemd (2080.2080) > close fd=35(<f>/etc/environment)
975 03:07:41.961711260 7 systemd (2080.2080) < close res=0
sysdig "evt.type in ('select', 'poll')"
root@adming-virtual-machine:~# sysdig "evt.type in ('select', 'poll')"
7 03:08:12.787998486 6 vmtoolsd (1577.1577) > poll fds=6:e1 7:p1 11:u1 13:u1 15:u1 timeout=100
115 03:08:12.838446428 3 gnome-shell (1189.1189) < poll res=0 fds=
118 03:08:12.838518732 3 gnome-shell (1189.1189) > poll fds=4:e1 8:u1 9:f1 24:u1 26:u1 29:l1 33:t1 41:t1 42:t1 46:u1 48:t1 52:u1 56:e1 98:u1 timeout=100
121 03:08:12.840488912 5 vmtoolsd (712.712) < poll res=0 fds=
132 03:08:12.840516319 5 vmtoolsd (712.712) > poll fds=4:e1 5:p1 timeout=100
203 03:08:12.884551143 6 gmain (768.797) < poll res=0 fds=
212 03:08:12.884585514 6 gmain (768.797) > poll fds=4:e1 7:i1 timeout=108
213 03:08:12.884587894 6 gmain (768.797) < poll res=1 fds=4:e1
216 03:08:12.884591412 6 gmain (768.797) > poll fds=4:e1 7:i1 timeout=108
219 03:08:12.888583199 6 vmtoolsd (1577.1577) < poll res=0 fds=
230 03:08:12.888642167 6 vmtoolsd (1577.1577) > poll fds=6:e1 7:p1 11:u1 13:u1 15:u1 timeout=100
283 03:08:12.896717677 2 rtkit-daemon (1065.1070) < poll res=0 fds=
286 03:08:12.896760229 2 rtkit-daemon (1065.1070) > poll fds=6:e1 timeout=5000
295 03:08:12.896985516 3 rtkit-daemon (1065.1071) < poll res=1 fds=5:e1
298 03:08:12.896995282 3 rtkit-daemon (1065.1071) > poll fds=5:e1 6:e1 timeout=10000
352 03:08:12.940659329 3 gnome-shell (1189.1189) < poll res=0 fds=
sysdig proc.name exists
root@adming-virtual-machine:~# sysdig proc.name exists
18 03:08:53.372301219 4 sysdig (227672.227672) > switch next=0 pgft_maj=0 pgft_min=2046 vm_size=166208 vm_rss=19200 vm_swap=0
40 03:08:53.377327111 4 sysdig (227672.227672) > switch next=0 pgft_maj=0 pgft_min=2047 vm_size=166208 vm_rss=19200 vm_swap=0
44 03:08:53.377360001 7 sshd (2077.2077) < ppoll res=1 fds=9:f1
45 03:08:53.377366159 7 sshd (2077.2077) > rt_sigprocmask
46 03:08:53.377366877 7 sshd (2077.2077) < rt_sigprocmask
47 03:08:53.377373277 7 sshd (2077.2077) > read fd=9(<f>/dev/ptmx) size=32768
48 03:08:53.377376489 7 sshd (2077.2077) < read res=167 data=18 03:08:53.372301219 4 .[01;32msysdig.[00m (.[01;36m227672.[00m.227672) > .[01;
49 03:08:53.377382280 7 sshd (2077.2077) > getpid
更进一步,多个过滤条件可以通过逻辑操作符 and
、or
和 not
进行组合,以实现复杂的查询。例如:
root@adming-virtual-machine:~# sysdig "evt.type in ('select', 'poll')"
42 03:09:34.666216545 3 gnome-shell (1189.1189) < poll res=0 fds=
45 03:09:34.666284735 3 gnome-shell (1189.1189) > poll fds=4:e1 8:u1 9:f1 24:u1 26:u1 29:l1 41:t1 42:t1 45:t1 46:u1 48:t1 52:u1 56:e1 98:u1 timeout=100
122 03:09:34.671219666 4 vmtoolsd (712.712) < poll res=0 fds=
133 03:09:34.671246186 4 vmtoolsd (712.712) > poll fds=4:e1 5:p1 timeout=100
这样的组合使得用户能够轻松定位到特定的系统事件,使得分析和监控更加目标化。
Sysdig 默认的输出格式已经包含了常用的信息。但除此之外,你还可以使用 -p
参数来自定义输出内容,其语法类似于 C 语言中的 printf
字符串。例如:
root@adming-virtual-machine:~# sysdig -p"user:%user.name dir:%evt.arg.path" evt.type=chdir
user:root dir:/var/snap/snapd-desktop-integration/49
user:root dir:/
这条命令会显示用户改变目录的详细信息。在自定义输出中,字段前必须加上 %
前缀,所有在 sysdig -l
列出的字段都可使用。你可以在字符串中加入其他可读性内容,它们会被直接打印出来。如果某个字段在事件中不存在,那么默认该事件会被过滤掉。在字符串最前面加上 *
符号,会打印出所有事件,不存在的字段会显示为 <NA>
,例如:
root@adming-virtual-machine:~# sysdig -p"*%evt.type %evt.dir %evt.arg.name" evt.type=open
Sysdig 允许你将捕获的数据保存到本地文件中,以便后续分析。使用 -w
参数可以将事件流保存到文件,而 -r
参数用于从文件中读取数据。例如:
# 捕获事件并保存到文件,终端不显示输出
sysdig -w sysdig-trace-file.scap
# 从文件中读取事件进行分析
sysdig -r sysdig-trace-file.scap
为了有效管理磁盘空间,Sysdig 提供了类似于 logrotate
的功能,允许你只保存最新的捕获文件。你可以通过 -n
参数指定捕获事件的数量,或者使用 -C
、-W
和 -G
参数来控制文件的大小和数量:
# 每个文件不超过 5M,保存最近的 10 个文件
root@adming-virtual-machine:/opt/alex# sysdig -C 5 -W 10 -w dump.pcap
root@adming-virtual-machine:/opt/alex# ls -lrth
total 29M
-rw-r--r-- 1 root root 4.2M 4鏈10 03:11 sysdig-trace-file.scap
-rw-r--r-- 1 root root 4.8M 4鏈10 03:12 dump.pcap00
-rw-r--r-- 1 root root 4.8M 4鏈10 03:12 dump.pcap01
-rw-r--r-- 1 root root 4.8M 4鏈10 03:12 dump.pcap02
-rw-r--r-- 1 root root 4.8M 4鏈10 03:12 dump.pcap03
-rw-r--r-- 1 root root 4.8M 4鏈10 03:12 dump.pcap04
-rw-r--r-- 1 root root 664K 4鏈10 03:12 dump.pcap0
# 每个文件保存一分钟内的系统活动,保存 60 个文件
sysdig -G 60 -W 60 -w dump.pcap
# 保存 5 个文件,每个文件包含 1000 个事件
sysdig -e 1000 -W 5 -w dump.scap
此外,使用 -w
参数保存文件时,还可以通过 -z
参数对内容进行压缩。在读取文件时,也可以应用过滤器,例如只关心 write
系统调用:
sysdig -r sysdig-trace-nano.scap evt.type=write
甚至可以对文件进行分割,例如将文件分割成每五分钟一个的多个文件:
root@adming-virtual-machine:/opt/alex# sysdig -r sysdig-trace-file.scap -G 300 -z -w segments.scap
100.00
通过这些功能,Sysdig 为用户提供了强大的监控和分析能力,使得我们可以更加高效地进行系统管理和故障排查。
虽然有了过滤器和文件的输入输出,加上 sysdig 其他的参数,我们可以按照需求去分析和监控系统了,但是很多场景需要更复杂的数据聚合。chisels 是 Sysdig 的一个特色功能,它们是由 Lua 脚本编写的小型分析工具,用于执行特定的监控和分析任务。它们可以分析 Sysdig 捕获的事件流以执行有用的操作。这些 chisels 可以看作是 Sysdig 的插件,通过它们可以扩展 Sysdig 的功能,满足更复杂的监控需求。
要列出所有可用的 chisels,可以使用命令 sudo sysdig -cl。这将显示所有预定义的 chisels,它们按照不同的类别进行组织,如 CPU 使用、网络活动、系统状态等。
sysdig -c httplog
sysdig -c topprocs_cpu
sysdig -c echo_fds
sysdig -c netstat
sysdig -c spy_file
sysdig -c spy_file "spy_on_file_name=/var/log/syslog"
sysdig -c topprocs_net
sysdig -c fdcount_by fd.sport "evt.type=accept"
sysdig -c spy_users
更多的实例可以参考官方文档:https://github.com/draios/sysdig/wiki/Sysdig-Examples
实际工作可以参考案例
分析网络流量
当系统出现网络延迟或丢包的问题时,Sysdig可以帮助SRE分析网络流量,定位问题源头。通过捕获网络相关的系统调用,SRE可以了解哪些进程在进行大量的网络通信,以及这些通信是否正常。
例如,以下命令可以捕获所有TCP连接的建立过程:
sysdig evt.type=accept
审计文件系统活动
在需要确保数据安全的环境中,Sysdig可以用来监控对敏感文件的访问。通过特定的Chisel脚本,SRE可以记录所有对特定文件的读写操作,从而及时发现和防范潜在的安全威胁。
例如,以下命令可以监控对/etc/passwd文件的所有访问:
sysdig -c spy_file read_or_write=R evt.arg.name=/etc/passwd
容器性能分析
在容器化的应用环境中,Sysdig可以提供对容器内部活动的深入监控。通过-pc参数,SRE可以获取到每个容器的网络、CPU和文件系统活动,帮助优化容器的性能和资源使用。
例如,以下命令可以列出所有容器的网络连接情况:
sysdig -pc container.name=<container_name>
故障排查
在系统出现故障时,Sysdig的事件记录功能可以帮助SRE回溯问题发生时的系统状态。通过分析记录的系统调用序列,SRE可以快速定位到故障的原因。
例如,以下命令可以将系统活动记录到文件中,供后续分析:
sysdig -w trace.scap.gz
Sysdig作为一款全面且强大的系统监控工具,它的出现极大地简化了系统管理和故障排查的工作。无论是实时监控、事件记录、资源分析还是容器监控,Sysdig都能够提供有效的支持。随着技术的不断进步,Sysdig将继续在系统监控领域发挥其重要作用,帮助用户构建更加稳定、高效和安全的IT基础设施。