如何使用 sysdig 监控 Linux 服务器并对其进行故障排除
当您需要跟踪进程发出和接收的系统调用时,首先想到的是什么?您可能会想到 strace
,您是对的。您将使用什么工具从命令行监控原始网络流量?如果您考虑过 tcpdump,那么您又做出了一个绝佳的选择。如果您需要跟踪打开的文件(在 Unix 意义上:一切都是文件),您很可能会使用 lsof。
strace
、tcpdump
和 lsof
确实都是很棒的实用程序,应该成为每个系统管理员工具集中的一部分,这正是您会喜欢 sysdig
的原因,它是一个用于系统级探索和故障排除的强大开源工具,其创建者将其介绍为“strace + tcpdump + lsof + 很棒的酱汁,上面有一点 Lua 樱桃”。抛开幽默不谈,sysdig
的一大特色在于它不仅能够分析 Linux 系统的实时状态,还能将状态保存在转储文件中以供离线检查。此外,您可以自定义 sysdig 的行为,甚至可以通过使用称为凿子的内置(或编写您自己的)小脚本来增强其功能。各个凿子用于以各种特定于脚本的方式分析 sysdig 捕获的事件流。
在本教程中,我们将探讨 sysdig
的安装和基本用法,以在 Linux 上执行系统监控和故障排除。
在 Linux 上安装 sysdig
在本教程中,为了简单、简洁和与发行版无关,我们将选择使用官方网站中描述的自动安装过程。在自动过程中,安装脚本会自动检测操作系统并安装所有必需的依赖项。
以 root 身份运行以下命令,从官方 apt
/yum
存储库安装 sysdig
:
# curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash

安装完成后,我们可以调用 sysdig 来感受一下:
# sysdig
我们的屏幕将立即充满系统中正在发生的所有内容,不允许我们对这些信息做更多的事情。因此,我们将运行:
# sysdig -cl | less
查看可用凿子的列表。

默认情况下提供以下类别,每个类别都由多个内置凿子填充。
CPU使用率
错误
输入/输出
日志
杂项
网
表现
安全
系统状态
要显示特定凿子的信息(包括详细的命令行用法),请运行:
# sysdig -cl [chisel_name]
例如,我们可以通过运行以下命令来查看 Net
类别下的 spy_port
chisel 信息:
# sysdig -i spy_port

Chisels 可以与过滤器(可应用于实时数据或跟踪文件)结合以获得更有用的输出。
过滤器遵循 class.field
结构。例如:
fd.cip:客户端IP地址。
evt.dir:事件方向可以是进入事件的
>
或退出事件的<
。
完整的过滤器列表可以通过以下方式显示:
# sysdig -l
在本教程的其余部分中,我将演示 sysdig 的几个用例。
Sysdig 示例:服务器性能故障排除
假设您的服务器遇到性能问题(例如,无响应或响应显着延迟)。您可以使用“bottlenecks”凿子显示当前 10 个最慢的系统调用的列表。
使用以下命令实时检查实时服务器。 -c
标志后跟凿子名称,告诉 sysdig
运行指定的凿子。
# sysdig -c bottlenecks
或者,您可以离线进行服务器性能分析。在这种情况下,您可以将完整的 sysdig
跟踪保存到文件中,然后针对该跟踪运行 bottlenecks
chisel,如下所示。
首先,保存 sysdig
跟踪(使用 Ctrl+c
停止收集):
# sysdig -w trace.scap
收集跟踪后,您可以通过运行以下命令来检查捕获间隔期间执行的最慢的系统调用:
# sysdig -r trace.scap -c bottlenecks

您需要注意 #2
、#3
和 #4
列,它们分别表示执行时间、进程名称和 PID。
Sysdig 示例:监控交互式用户活动
假设您作为系统管理员想要监视系统中的交互式用户活动(例如,用户从命令行输入的命令以及用户访问的目录)。这就是 spy_user
chisel 派上用场的时候。
让我们首先收集带有几个额外选项的 sysdig
跟踪。
# sysdig -s 4096 -z -w /mnt/sysdig/$(hostname).scap.gz
-s 4096
告诉sysdig
捕获每个事件最多 4096 字节。-z
(与-w
一起使用)启用跟踪文件的压缩。-w
将sysdig
跟踪保存到指定文件。
在上面,我们在每个主机上自定义压缩跟踪文件的名称。请记住,您可以随时按 Ctrl+c
中断 sysdig
的执行。
一旦我们收集了合理数量的数据,我们就可以通过运行以下命令来查看系统中每个用户的交互活动:
# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users

上述输出中的第一列表示与给定用户活动关联的进程的 PID。
如果您想定位特定用户并仅监控该用户的活动怎么办?您可以按用户名过滤 spy_users
chisel 的结果:
# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users "user.name=linux教程"

Sysdig 示例:监控文件 I/O
我们可以使用 -p 标志自定义 sysdig 跟踪的输出格式,并指示用双引号括起来的所需字段(例如,用户名、进程名称以及文件或套接字名称)。在此示例中,我们将创建一个跟踪文件,该文件仅包含主目录中的写入事件(稍后我们可以使用 sysdig -r writetrace.scap.gz 进行检查)。
# sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/" -z -w writetrace.scap.gz

Sysdig 示例:监控网络 I/O
作为服务器故障排除的一部分,您可能需要监听网络流量,这通常使用 tcpdump
完成。使用sysdig
,可以轻松地完成流量嗅探,但方式更加用户友好。
例如,您可以检查由特定进程(例如 apache2
)服务的与特定 IP 地址交换的数据(以 ASCII 表示):
# sysdig -s 4096 -A -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2
如果您想监视原始数据传输(二进制),请将 -A
替换为 -X
:
# sysdig -s 4096 -X -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2
如需更多信息、示例和案例研究,您可以查看项目网站。相信我,可能性是无限的。但不要只相信我的话。安装 sysdig 并立即开始挖掘!