前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sysdig:Linux系统监控与分析的全能利器

Sysdig:Linux系统监控与分析的全能利器

作者头像
五分钟学SRE
发布2024-04-16 16:46:49
1880
发布2024-04-16 16:46:49
举报
文章被收录于专栏:五分钟学SRE五分钟学SRE

在Linux系统的运维工作中,监控和分析是保证系统稳定性和性能的关键环节。传统的监控工具如strace、tcpdump等各有所长,但往往只关注系统的某一方面,而且使用起来相对独立,缺乏统一的视角。在这样的背景下,Sysdig以其全面、深入的监控能力和对容器技术的友好支持,成为了SRE的新宠。

Sysdig的核心特性

Sysdig的官网上自我介绍为:“具有原生容器支持的开源通用系统可视化工具”。这一定位准确概括了Sysdig的三大优势:整合性、强大的监控分析能力、以及灵活性。

整合性

Sysdig能够整合多个监控工具的功能,提供了一个统一的命令行界面,使得用户可以轻松捕获和分析系统数据。这种整合性大大提升了工作效率,尤其是在问题定位和性能调优方面。

强大的监控分析能力

Sysdig能够捕获全方位的系统参数,包括CPU、内存、磁盘IO和网络IO等。它还支持对各种IO活动的监控,如进程、文件、网络连接等。Sysdig不仅能够捕获信息,还提供了内置的分析工具,帮助用户从大量数据中提取有价值的信息。

灵活性

Sysdig提供了类似于tcpdump的过滤语法,用户可以自定义过滤逻辑,精确地找到感兴趣的事件。此外,Sysdig允许用户通过Lua脚本来扩展分析逻辑,极大地增强了工具的适应性和灵活性。

Sysdig的工作原理

Sysdig 的核心在于其能够捕获 Linux 系统中的系统调用和事件。它通过在内核中注册 tracepoint 钩子来实现这一功能。Tracepoint 是内核中的特定函数调用,可以在不修改内核代码的情况下,提供对内核函数执行的监控点。Sysdig 利用这些 tracepoint 放置处理程序,从而在内核层面捕获事件。

当系统调用发生时,Sysdig 会将相关信息复制到特定的缓冲区中。这些信息随后被用户态的组件处理,包括解压、解析和过滤。最终,这些数据通过 Sysdig 的命令行界面与用户进行交互。

安装Sysdig

Sysdig的安装过程在官方文档中有详细说明。安装时需注意内核版本的兼容性,并确保系统兼容。安装完成后,用户可以通过简单的命令开始捕获系统信息。可以参考官网:

代码语言:javascript
复制
https://github.com/draios/sysdig/wiki/How-to-Install-Sysdig-for-Linux

我们以root身份运行以下命令来从官方apt/yum仓库安装sysdig:

代码语言:javascript
复制
curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash

sysdig最原始的用法是直接从命令行运行sysdig命令。将获得类似 strace 的输出。

代码语言:javascript
复制
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

所有的输入都是按照行来分割的,每行都是一条记录,由多个列组成,默认的格式是:

代码语言:javascript
复制
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info

各个字段的含义如下:

代码语言:javascript
复制
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 显示上面给出的每个系统事件将导致数千个事件同时从屏幕上流出,这样我们将迷失在这种信息流中;Sysdig有一个非常先进的过滤系统,可以消除我们习惯于strace的这种低效情况。

Sysdig的基本命令格式为

代码语言:javascript
复制
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查看完整的过滤器列表

代码语言:javascript
复制
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 命令在后台执行的所有操作都反映在屏幕上。

代码语言:javascript
复制
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 提供了一套强大的过滤器,它们不仅支持基础的相等性比较,还包含了一系列的操作符,如 =!=>=><<=containsinexists,使得过滤条件更加灵活和精确。例如:

代码语言:javascript
复制
 sysdig fd.name contains /etc
代码语言:javascript
复制
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 
代码语言:javascript
复制
 sysdig "evt.type in ('select', 'poll')"
代码语言:javascript
复制
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=
代码语言:javascript
复制
 sysdig proc.name exists
代码语言:javascript
复制
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

更进一步,多个过滤条件可以通过逻辑操作符 andornot 进行组合,以实现复杂的查询。例如:

代码语言:javascript
复制
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 字符串。例如:

代码语言:javascript
复制
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>,例如:

代码语言:javascript
复制
root@adming-virtual-machine:~# sysdig -p"*%evt.type %evt.dir %evt.arg.name" evt.type=open

保存到文件

Sysdig 允许你将捕获的数据保存到本地文件中,以便后续分析。使用 -w 参数可以将事件流保存到文件,而 -r 参数用于从文件中读取数据。例如:

代码语言:javascript
复制
# 捕获事件并保存到文件,终端不显示输出
sysdig -w sysdig-trace-file.scap

# 从文件中读取事件进行分析
sysdig -r sysdig-trace-file.scap

为了有效管理磁盘空间,Sysdig 提供了类似于 logrotate 的功能,允许你只保存最新的捕获文件。你可以通过 -n 参数指定捕获事件的数量,或者使用 -C-W-G 参数来控制文件的大小和数量:

代码语言:javascript
复制
# 每个文件不超过 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 系统调用:

代码语言:javascript
复制
sysdig -r sysdig-trace-nano.scap evt.type=write

甚至可以对文件进行分割,例如将文件分割成每五分钟一个的多个文件:

代码语言:javascript
复制
root@adming-virtual-machine:/opt/alex# sysdig -r sysdig-trace-file.scap -G 300 -z -w segments.scap
100.00

通过这些功能,Sysdig 为用户提供了强大的监控和分析能力,使得我们可以更加高效地进行系统管理和故障排查。

Chisels:实用的工具箱

虽然有了过滤器和文件的输入输出,加上 sysdig 其他的参数,我们可以按照需求去分析和监控系统了,但是很多场景需要更复杂的数据聚合。chisels 是 Sysdig 的一个特色功能,它们是由 Lua 脚本编写的小型分析工具,用于执行特定的监控和分析任务。它们可以分析 Sysdig 捕获的事件流以执行有用的操作。这些 chisels 可以看作是 Sysdig 的插件,通过它们可以扩展 Sysdig 的功能,满足更复杂的监控需求。

可用的 chisels

要列出所有可用的 chisels,可以使用命令 sudo sysdig -cl。这将显示所有预定义的 chisels,它们按照不同的类别进行组织,如 CPU 使用、网络活动、系统状态等。

常用 Chisels 及其命令示例

  • httplog: 输出所有的 HTTP 请求。
代码语言:javascript
复制
sysdig -c httplog
  • topprocs_cpu: 按照 CPU 使用率排序的进程列表。
代码语言:javascript
复制
 sysdig -c topprocs_cpu
  • echo_fds: 输出进程读写的数据。
代码语言:javascript
复制
sysdig -c echo_fds
  • netstat: 列出网络的连接情况。
代码语言:javascript
复制
sysdig -c netstat
  • spy_file: 输出文件的读写数据,可以指定只监视特定文件的读写活动。
代码语言:javascript
复制
sysdig -c spy_file
代码语言:javascript
复制
sysdig -c spy_file "spy_on_file_name=/var/log/syslog"
  • topprocs_net: 按照网络使用情况对进程进行排序。
代码语言:javascript
复制
 sysdig -c topprocs_net
  • fdcount_by fd.sport: 按照建立连接数量对进程进行排序。
代码语言:javascript
复制
sysdig -c fdcount_by fd.sport "evt.type=accept"
  • spy_users: 显示交互式用户活动。
代码语言:javascript
复制
sysdig -c spy_users

更多的实例可以参考官方文档:https://github.com/draios/sysdig/wiki/Sysdig-Examples

实际工作可以参考案例

分析网络流量

当系统出现网络延迟或丢包的问题时,Sysdig可以帮助SRE分析网络流量,定位问题源头。通过捕获网络相关的系统调用,SRE可以了解哪些进程在进行大量的网络通信,以及这些通信是否正常。

例如,以下命令可以捕获所有TCP连接的建立过程:

代码语言:javascript
复制
sysdig evt.type=accept

审计文件系统活动

在需要确保数据安全的环境中,Sysdig可以用来监控对敏感文件的访问。通过特定的Chisel脚本,SRE可以记录所有对特定文件的读写操作,从而及时发现和防范潜在的安全威胁。

例如,以下命令可以监控对/etc/passwd文件的所有访问:

代码语言:javascript
复制
sysdig -c spy_file read_or_write=R evt.arg.name=/etc/passwd

容器性能分析

在容器化的应用环境中,Sysdig可以提供对容器内部活动的深入监控。通过-pc参数,SRE可以获取到每个容器的网络、CPU和文件系统活动,帮助优化容器的性能和资源使用。

例如,以下命令可以列出所有容器的网络连接情况:

代码语言:javascript
复制
sysdig -pc container.name=<container_name>

故障排查

在系统出现故障时,Sysdig的事件记录功能可以帮助SRE回溯问题发生时的系统状态。通过分析记录的系统调用序列,SRE可以快速定位到故障的原因。

例如,以下命令可以将系统活动记录到文件中,供后续分析:

代码语言:javascript
复制
sysdig -w trace.scap.gz

Sysdig作为一款全面且强大的系统监控工具,它的出现极大地简化了系统管理和故障排查的工作。无论是实时监控、事件记录、资源分析还是容器监控,Sysdig都能够提供有效的支持。随着技术的不断进步,Sysdig将继续在系统监控领域发挥其重要作用,帮助用户构建更加稳定、高效和安全的IT基础设施。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学SRE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Sysdig的核心特性
    • 整合性
      • 强大的监控分析能力
        • 灵活性
        • Sysdig的工作原理
        • 安装Sysdig
        • Sysdig的基本用法
          • Sysdig的基本命令格式为
            • 自定义输出格式
              • 保存到文件
              • Chisels:实用的工具箱
                • 可用的 chisels
                  • 常用 Chisels 及其命令示例
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档