概述
Sysdig 是一款强大的系统分析工具,能够监控和捕捉到大量的系统状态信息。它可以用来监控包括但不限于以下状态:
-
CPU 使用率:可以监控整体系统或者特定进程的CPU使用情况。
-
内存使用:能够检查系统的内存使用率,包括物理内存、交换分区等。
-
I/O 活动:监控磁盘I/O活动,如读写操作和I/O等待时间,可以用于诊断性能瓶颈。
-
文件操作:捕捉对文件的打开、读写、关闭等操作,用于分析文件使用情况或未授权访问。
-
网络活动:监听所有网络活动,包括连接的建立与断开、数据包的传输等。
-
进程活动:跟踪进程的创建、执行和终止,查看系统中进程的活跃情况。
-
用户活动:记录用户登录、执行命令及其他活动,对于安全监控尤其重要。
-
系统调用:跟踪系统调用(syscalls),可以用于检查系统的安全性和程序行为。
-
容器活动:特别对于Docker等容器化技术,sysdig可以监控容器的使用情况,如CPU、内存、网络和文件系统活动。
-
错误和异常:查看系统产生的错误及异常,帮助定位问题所在。
-
系统事件:所有用户空间和内核空间的事件都可以通过sysdig进行跟踪,这对于分析系统行为非常有用。
Sysdig 通过提供强大的过滤器,使用户可以根据需要选择性地监控上述状态的任何组合。此外,sysdig 还有一个名为 csysdig 的图形界面版本,该程序可以让用户以交云方式浏览和过滤事件数据。正因为 sysdig 提供了如此详细的系统洞察,它被广泛用于底层的问题诊断、性能分析和安全监控中。不过,使用者应当注意,sysdig 的高级监控功能可能对系统性能有一定的影响,故在生产环境中应斟酌使用。
Sysdig 安装
Sysdig 是一个开源的系统监控和故障排查工具,适用于Linux。它提供了丰富的系统事件数据,便于深入分析。
安装依赖项
首先,确保已安装必须的依赖项。大多数Linux发行版都可以通过包管理器安装。对于基于Debian的系统(如Ubuntu),运行:
shell
apt-get update
apt-get install -y software-properties-common
对于基于RPM的系统(如CentOS),运行:
shell
yum update
yum groupinstall -y 'Development Tools'
yum install -y kernel-devel
通过包管理器安装Sysdig
接着,可以通过系统的包管理器直接安装Sysdig。对于Ubuntu或Debian系统,运行:
shell
curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | ```shell
对于CentOS,运行:
shell
rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public
curl -s -o /etc/yum.repos.d/draios.repo https://s3.amazonaws.com/download.draios.com/stable/rpm/draios.repo
yum install -y sysdig
编译安装
如果您喜欢从源代码安装,可以按照以下步骤操作:
shell
git clone https://github.com/draios/sysdig.git
cd sysdig
mkdir build
cd build
cmake ..
make
make install
Sysdig 使用场景和示例
查看所有系统事件
运行以下命令可以查看所有捕获的事件:
shell
sysdig
筛选进程创建和退出事件
仅查看与进程创建和退出相关的事件:
shell
sysdig evt.type=execve or evt.type=exit
按照进程名称筛选
通过进程名称来筛选事件:
shell
sysdig proc.name=httpd
查看特定用户的活动
查看特定用户(假设用户ID为1001)的所有系统活动:
shell
sysdig user.uid=1001
查看文件I/O
捕获特定文件(例如/var/log/messages)的所有读写事件:
shell
sysdig fd.name=/var/log/messages
监控网络连接
监控所有进出网络连接:
shell
sysdig evt.type=connect or evt.type=accept
实时表示某个目录下的文件操作
监控对/etc目录的所有文件操作:
shell
sysdig fd.directory=/etc
将捕获的事件输出到文件
将事件输出到 capture.scap 文件以备后续分析:
shell
sysdig -w capture.scap
从文件中读取事件
从scap文件中读取并分析事件:
shell
sysdig -r capture.scap
建议在操作中加以尝试以更好地理解每个命令的使用场景。Sysdig 的官方文档提供了更多高级用法和示例,可以访问 Sysdig Documentation 来获取详细信息。
sysdig实际应用场景介绍
除了前面提到的基础用法,sysdig 还能适用于更复杂的实战场景,下面是一些进阶的使用示例:
分析特定应用程序的性能
如果要监控特定应用程序的系统调用以分析性能问题,可以使用类似以下命令:
shell
sysdig -p "%proc.name %evt.num %evt.type" proc.name=httpd
这个命令会显示进程名为httpd的所有事件类型及其事件序号,有助于识别可能导致性能下降的系统调用。
故障排查和实时监控
Sysdig 可以用来监控实时系统的状态,比如实时监控CPU利用率较高的进程:
shell
sysdig -c topprocs_cpu
这将会列出消耗CPU最多的进程。
检查文件系统的活动
如果需要监控文件系统的变化,例如谁删除了某个文件或者哪些文件被最频繁地修改,可以使用:
shell
sysdig -A -c echo_fds fd.type=file and evt.failed=false and evt.type=write
这个命令捕获并显示所有文件写入事件,并排除了失败的事件。
监控网络活动
监控并记录从特定IP地址传入或传出的网络活动,可以帮助排查网络问题:
shell
sysdig -c spy_ip 192.168.1.101
如果是需要详细输出特定端口的网络请求,可以使用:
shell
sysdig "evt.type=recvfrom and fd.port=80"
容器监控
Sysdig 也是个容器监控的好工具。如果你使用Docker,可以通过以下命令查看所有Docker事件:
shell
sysdig -c spy_users
或者查看特定容器的活动:
shell
sysdig -pc container.id=<container_id>
用容器ID替换 <container_id> 以监控该容器。
排查系统安全问题
如果怀疑系统被未经授权的用户访问,可以用 sysdig 搜集证据:
shell
sysdig -c spy_users
该命令会监控所有用户活动,包括终端输入输出。
保存和回放会话
如果想要记录下发生异常时的系统状态用于事后分析,可以将sysdig输出保存到文件:
shell
sysdig -w session.scap
然后可以回放这次会话:
shell
sysdig -r session.scap
sysdig的Chisels都有哪些常用的功能?
sysdig 的 Chisels 是预先编写的脚本,用来提供易懂的输出,并针对特定的监控任务。以下是一些常用的 sysdig Chisels 以及它们的功能:
-
topprocs_cpu: 显示 CPU 使用率最高的进程。
-
topprocs_mem: 显示内存使用率最高的进程。
-
topfiles_bytes: 列出读取和写入最多字节的文件。
-
topconns: 显示网络连接数最多的端点。
-
iobytes: 按照 I/O 字节显示进程排行。
-
nettop: 实时网络活动统计,类似于网络版的 top 命令。
-
spy_users: 显示用户输入的命令(例如在 shell 中输入的)。
-
listens: 显示监听端口的服务器。
-
spy_file: 监控对指定文件的所有读写活动。
-
fileslower: 显示磁盘 I/O 操作中响应时间超过一定阈值的事件。
-
stderr / stdout: 分别捕获和显示进程的标准错误或标准输出流。
-
connections: 罗列系统中的网络连接。
-
echo_fds: 以人类可读的格式捕捉文件描述符的活动。
-
memcachetop: 显示 memcached 服务器上的 top 请求。
-
httptop: 显示 HTTP 请求排行。
这些是一些基本的 Chisels,sysdig 根据使用频率和需要进行了优化。你可以通过运行 sysdig -cl 来列出所有可用的 Chisels。记住每个 Chisel 都有其参数和过滤选项,用以精细控制输出内容。
使用 Chisel 的时候,通常我们会输入如 sysdig -c ChiselName 的命令,并可以加上过滤条件来更精准地捕捉所需的数据。
我该如何使用Chisels来监控特定进程的网络连接数?
要监控某个特定进程的网络连接数,你可以使用 sysdig 的 topconns Chisel。topconns Chisel 用于显示网络连接数最多的进程及其对应的IP地址和端口号。如果你想针对某个特定进程进行监控,你需要结合使用 Chisel 和一个合适的过滤器。假设你要监控进程名称为 myapp 的应用程序的网络连接数,可以按照以下步骤操作:
打开终端,输入以下命令,其中 proc.name=myapp 是一个过滤器,用于指定进程名称:
shell
sysdig -c topconns "proc.name=myapp"
如果你知道进程的PID,也可以使用类似的命令:
shell
sysdig -c topconns "proc.pid=1234"
这里的 1234 应替换为实际要监控的进程的PID。
运行此命令,sysdig 将会实时显示与 myapp 应用程序相关的网络连接信息,包括远程IP地址、端口号和连接数等。
如果你只对特定类型的网络连接感兴趣(例如TCP或UDP连接),你还可以进一步细化过滤器。例如,只监控TCP连接:
shell
sysdig -c topconns "proc.name=myapp and evt.type=connect and fd.type=ipv4 and fd.l4proto=tcp"
使用Chisels监控网络连接数有助于识别潜在的网络瓶颈问题、不正常的连接模式或者检查服务的使用情况等。记得,始终根据你的需求来调整过滤器,以获取最相关的数据。
我如何在sysdig中监控多个特定进程的网络连接数?
要在sysdig中监控多个特定进程的网络连接数,你可以构建一个过滤器,该过滤器结合了所有你需要监控的进程。过滤器可以使用逻辑运算符(如or)来匹配多个条件。例如,如果你需要同时监控名为 httpd 和 mysqld 的两个进程的网络连接数,可以这样做:
打开一个终端,输入以下命令:
shell
sysdig -c topconns "proc.name=httpd or proc.name=mysqld"
这个命令将显示 httpd 和 mysqld 进程的网络连接数。topconns chisel会针对这些过滤器列出连接最多的端点。同样地,如果你有这些进程的PID,也可以像这样使用它们:
shell
sysdig -c topconns "proc.pid=123 or proc.pid=456"
其中的 123 和 456 应该替换为你想要监控的实际进程的PID。
请注意,在监控多个不同的进程时,要准确无误地指定进程名称或者PID,以确保sysdig为每个特定进程提供准确的网络连接数据。
如果你想要指定更多的进程,只需在过滤器中继续添加更多的条件,使用 or 运算符连接它们即可。这样可以让你轻松地同时监控多个进程的网络连接状况。如果有必要,也可以添加更多详细的过滤选项,比如过滤特定的端口号或网络协议。
我可以使用sysdig的Chisels来监控UDP连接数吗?
是的,你可以使用sysdig的Chisels监控UDP连接数。不过,需要注意的是UDP(用户数据报协议)是无连接的协议,意味着它本身并不维持持久的连接状态。因此,对于UDP通信,通常是监控发送和接收到的UDP包的数量。要监控UDP通信,你可以使用topconns Chisel,结合一个过滤器来专注于UDP协议。例如,以下命令展示了所有UDP通信:
shell
sysdig -c topconns "fd.l4proto=udp"
如果想针对特定的进程,你可以再进一步添加过滤条件:
shell
sysdig -c topconns "proc.name=dnsmasq and fd.l4proto=udp"
在这个示例中,我们用proc.name=dnsmasq指定了进程名为dnsmasq的进程,同时指定了fd.l4proto=udp来过滤仅对应于UDP协议的数据。这样,sysdig就会展示dnsmasq进程的UDP通信情况。
类似地,如果你有进程的PID,可以使用下面的命令来监控该进程的UDP通信:
shell
sysdig -c topconns "proc.pid=1234 and fd.l4proto=udp"
在这里,1234是你希望监控的进程的进程ID(PID)。记得替换为真实的进程PID。
请注意,由于UDP是无连接的,所以“连接数”这一术语在这里指的是UDP数据包的流量量级。Chisel会根据你的过滤条件来显示活动最多的UDP会话。
如何在sysdig中监控UDP包的数量?
监控UDP包的数量可以通过使用 sysdig 的 pktcount Chisel 实现,它能统计在一段时间内经过网络接口的数据包总数。如果你只对 UDP 数据包感兴趣,你需要添加一个过滤器来专注于 UDP 流量。
下面是如何使用 sysdig 监控 UDP 包数量的具体命令:
shell
sysdig -c pktcount "evt.type=recvfrom and fd.l4proto=udp"
这个命令结合了 pktcount Chisel 和一个过滤器,后者只考虑接收到的、使用 UDP 协议的网络数据包(基于事件类型 recvfrom)。这样就可以得到实时统计的 UDP 接收数据包数。
如果需要监控发送的 UDP 数据包数,可以修改事件类型为 sendto:
shell
sysdig -c pktcount "evt.type=sendto and fd.l4proto=udp"
若要更具体地监控某个进程的接收到的 UDP 数据包,可以添加进程名称或进程 ID 来进一步过滤:
shell
sysdig -c pktcount "evt.type=recvfrom and proc.name=dnsdist and fd.l4proto=udp"
在上述命令中,我们以 dnsdist 进程为例,在过滤器中指定了 proc.name 这个字段。这个命令将仅统计 dnsdist 进程接收到的 UDP 数据包数量。
请记得将 dnsdist 替换为你想要监控的具体进程名称,如果你已知进程的 PID,你可以使用 proc.pid 字段替换掉 proc.name=dnsdist:
shell
sysdig -c pktcount "evt.type=recvfrom and proc.pid=12345 and fd.l4proto=udp"
在这里,12345 应替换为你希望监控的进程的实际 PID。通过这样的命令,你可以定位到特定进程的 UDP 包数量,无论是接收还是发送。
我如何在sysdig中监控特定网络接口的UDP包数量?
要在 sysdig 中监控特定网络接口上的 UDP 数据包数量,你首先需要知道接口的名称,如 eth0 或 wlan0。接着,可以使用 sysdig 的过滤语句来专门监控那个接口上的 UDP 交互。以下是监控指定网络接口上 UDP 包数量的一个例子:
shell
sysdig -c pktcount "evt.type=recvfrom and fd.l4proto=udp and fd.dev=eth0"
在这个命令中:
-c pktcount 是指使用 pktcount Chisel 来统计数据包。
evt.type=recvfrom 指明捕获接收事件。
fd.l4proto=udp 用于过滤 UDP 协议的数据包。
fd.dev=eth0 用于限定只监控名为 eth0 的网络接口。
确保将 eth0 替换成你实际想监控的网络接口名称。如果你想监控所有发送和接收的 UDP 包,可以省略 evt.type 过滤器,或者将其改成同时监控 recvfrom 和 sendto:
shell
sysdig -c pktcount "fd.l4proto=udp and fd.dev=eth0"
或者,要同时监控接收和发送的UDP包:
shell
sysdig -c pktcount "(evt.type=recvfrom or evt.type=sendto) and fd.l4proto=udp and fd.dev=eth0"
如上命令将监控特定网络接口 eth0 上的所有 UDP 发送和接收活动。
记得你可以通过运行 ifconfig 或 ip addr 命令来查看你系统上所有网络接口的列表及其状态。这有助于确保你使用正确的网络接口名称在 sysdig 命令中。
如何使用sysdig监控特定进程的CPU使用情况?
要监控特定进程的CPU使用情况,你可以使用sysdig的内置的Chisel(即sysdig命令行版本的一种交互式的脚本)。Chisels 是一系列用于处理和格式化sysdig的输出数据的脚本。Sysdig 带有一些预定义的Chisels,可以直接使用。
监控特定进程的CPU使用情况的步骤:
-
确定你想要监控的进程名称或者进程ID(PID)。例如,如果你想要监控名为httpd的进程。
-
使用sysdig的topprocs_cpu Chisel,这个Chisel会显示消耗CPU最多的进程。
启动监控的具体命令如下:
如果使用进程名称进行监控:
shell
sysdig -c topprocs_cpu "proc.name=httpd"
如果是使用PID进行监控,则需要用到proc.pid过滤条件:
shell
sysdig -c topprocs_cpu "proc.pid=1234"
请将 “httpd” 和 “1234” 替换为你需要监控的实际进程名称或PID。
默认系统会输出CPU占用率最高的几个进程,但如果你使用上面的过滤条件,输出将会被限制在特定的进程。
topprocs_cpu 是实时运行的,它会不断刷新并显示当前消耗CPU最多的进程。你可以通过 Ctrl + C 来停止监控过程。
友情提示:
在低性能或者高负载的系统上使用sysdig时,尽量使用特定的过滤条件来减少性能开销。过度的监控可能会进一步拖慢系统。
我怎样才能监控所有正在进行的UDP通信?
若要使用sysdig来监控系统中所有正在进行的UDP通信,你不需要指定特定的进程或网络接口,你可以设置通用的过滤器来捕获所有的UDP事件。以下是监控系统中所有UDP通信的命令:
shell
sysdig "fd.l4proto=udp"
这个简单的过滤器只要求捕获协议为UDP的网络事件。不过,这样会显示所有相关的事件,包括recvfrom和sendto,并可能会产生大量的输出。如果你想定制输出让它更有用,可以设置Chisel输出更可读的格式。例如,使用echo_fds Chisel会显示详细的I/O活动:
shell
sysdig -c echo_fds "fd.l4proto=udp"
这会以人类可读的格式输出UDP通信的细节,包括哪个进程正在发送或接收数据。若想仅监控接收(入站)的UDP包,可以使用以下命令:
shell
sysdig "evt.type=recvfrom and fd.l4proto=udp"
对于发送(出站)的UDP包,可以用:
shell
sysdig "evt.type=sendto and fd.l4proto=udp"
要获得关于每一条UDP通信的统计信息,可以使用topconns Chisel:
shell
sysdig -c topconns "fd.l4proto=udp"
这会列出活跃的UDP连接(实际上是流),包括远程的IP地址和端口,以及它们的活动排序。
如果输出信息太多,你可能想要将输出重定向到文件中或者使用grep等工具进行过滤,以更好地分析数据。
我可以通过sysdig监控系统中的所有TCP通信吗?
是的,您可以使用 sysdig 来监控系统中的所有 TCP 通信。TCP(传输控制协议)是一种可靠的、面向连接的协议,用于建立网络应用之间稳定的双向通信。通过合适的过滤器,您可以捕获和显示所有与 TCP 相关的网络活动。
要监控所有TCP通信,您可以运行如下命令:
shell
sysdig "fd.l4proto=tcp"
这个命令应用了一个简单的过滤器 fd.l4proto=tcp 来选择所有 TCP 协议的事件。这将会列出所有TCP网络事件,包括连接的建立、数据的发送和接收以及连接的关闭。
如果要以格式化的方式显示TCP通信的详细信息,您可以使用Chisels,例如 echo_fds:
shell
sysdig -c echo_fds "fd.l4proto=tcp"
echo_fds Chisel 以可读的格式显示文件描述符的活动,包括网络套接字的创建和使用。对于TCP通信,这将包括连接建立和数据传输的详细内容。
对于更细粒度的分析,Sysdig 允许您使用各种过滤条件来控制您想要监控的TCP通信的具体类型。比如,如果您只想看到建立的TCP连接,您可以使用以下命令:
shell
sysdig "evt.type=connect and fd.l4proto=tcp"
反之,如果您想监控TCP连接关闭事件,可以使用:
shell
sysdig "evt.type=close and fd.l4proto=tcp"
或者,您可能想要监控在指定端口(例如 HTTP 标准端口 80)上的TCP通信:
shell
sysdig "fd.l4proto=tcp and fd.sport=80 or fd.dport=80"
对于高级监控,您甚至可以结合 sysdig 的输出与其他命令行工具如 grep、awk 或 sed 进行数据处理和分析,或者通过将输出重定向到文件中来进行后续处理。
请记住,在使用 sysdig 对网络通信进行监控时,根据监控的数据量和系统的性能,可能会对系统性能产生一定的影响,所以请确保按需合理使用监控命令。
我可以使用sysdig来监控特定端口上的TCP通信吗?
当然可以,使用sysdig监控特定端口上的TCP通信相对简单。你只需要在过滤器中指定你感兴趣的端口。例如,如果你想监控本地端口 80 (通常被HTTP服务器使用)上的TCP通信,你可以使用以下命令:
shell
sysdig "fd.l4proto=tcp and (fd.sport=80 or fd.dport=80)"
在这个命令中:
-
fd.l4proto=tcp 表示过滤器将仅匹配TCP协议的网络活动。
-
fd.sport=80 表示源端口号为80。
-
fd.dport=80 表示目的端口号为80。
-
使用 or 逻辑运算符是因为TCP通信可以是进入端口80或从端口80出去的。
这将捕获所有涉及端口80的TCP包,不论它们是发送到这个端口还是从这个端口发送出去的。
如果你想要针对远程端口进行过滤(例如,你只关心连接到你服务器端口80的外部端口),你可以修改过滤器来做这种监控:
shell
sysdig "fd.l4proto=tcp and fd.dport=80"
这将只捕获向本地端口80发送的TCP数据包。
你也可以结合使用sysdig的Chisels功能来格式化这些信息,例如,使用netstat Chisel,它提供一个网络连接统计视图,用以下命令查看端口80相关的连接:
shell
sysdig -c netstat "fd.l4proto=tcp and (fd.sport=80 or fd.dport=80)"
Sysdig Chisels可以为你提供更友好或者更详细的输出,并可以按照需要进行多方面的定制。
如果你想实时查看关于特定端口TCP流量的详细统计数据,用topconns Chisel也非常有用:
shell
sysdig -c topconns "fd.l4proto=tcp and (fd.sport=80 or fd.dport=80)"
上述命令将会按网络连接数量列出源端口或目的端口为80的TCP连接。记得将80替换成你想要监控的特定端口号。
我可以使用sysdig来监控特定网络接口上的ICMP包数量吗?
是的,Sysdig 允许你监控特定网络接口上的 ICMP(Internet Control Message Protocol,因特网控制消息协议)包数量。ICMP 通常用于发送错误消息和操作信息,例如当一个数据包无法到达目的地时。
要在 Sysdig 中监控特定网络接口的 ICMP 包,你可以使用相似的过滤器语法,这次关注 icmp 协议。以下是一条具体的命令示例:
shell
sysdig -c pktcount "icmp and fd.dev=eth0"
在这个命令中:
-
-c pktcount 是指使用 pktcount Chisel 来统计数据包。
-
icmp 是指过滤协议为 ICMP 的数据包,它在 Sysdig 中代表所有与 ICMP 相关的事件。
-
fd.dev=eth0 是限定只监控名为 eth0 的网络接口。
你需要把 eth0 更换为你想要监控的实际网络接口。如果你想要记录接收到的 ICMP 包,使用 evt.type 过滤器和 fd.l4proto 字段来进一步细化:
shell
sysdig -c pktcount "evt.type=recvfrom and fd.l4proto=icmp and fd.dev=eth0"
如上所示,修改后的命令通过 evt.type=recvfrom 来指定我们只对接收到的数据包感兴趣。
对于发送出去的 ICMP 包,可以这样过滤:
shell
sysdig -c pktcount "evt.type=sendto and fd.l4proto=icmp and fd.dev=eth0"
请确保将 eth0 替换为你的网络接口的正确名称。
结语
Sysdig 的功能十分强大,学习和掌握它能够大大提高Linux系统管理和故障排查的效率。以上的案例只展示了Sysdig 的一部分功能,它还有许多高级的用法。建议详细阅读其官方文档或社区贡献的使用案例,实践中会发现更多有用的技能。
来源: Transcendent
文章作者: Gavin Wang
文章链接: Monitor tools of sysdig | Transcendent
本文章著作权归作者所有,任何形式的转载都请注明出处。