当前位置: 首页 > article >正文

理解并使用 sysdig

理解并使用 sysdig

1. 概述

sysdig 是一个以系统调用为核心的事件捕捉工具。它能够捕获和分析来自操作系统的各种信息,如进程、网络、文件、内存、系统调用等。通过 sysdig,你可以获得关于系统行为的详细数据,从而帮助你定位性能瓶颈、发现安全隐患、进行故障排查和优化应用性能。


2. sysdig 的实现原理

sysdig原理

sysdig 的核心原理是通过拦截 Linux 系统调用和内核事件来捕获系统中的活动。它利用内核中的各种机制(如 tracepoint 或 eBPF)实时地捕获系统调用,并将这些信息传递给用户空间进行处理和展示。这样,sysdig 可以提供系统和应用程序层面的详细行为数据,供进一步分析和诊断。

事件捕获流程:
  1. 系统调用捕获sysdig 会捕获系统中的每一个系统调用,如文件操作、网络请求、进程调度等。
  2. 事件过滤:通过 sysdig 的过滤机制,用户可以根据事件类型、进程名称、文件路径等条件过滤事件,只查看自己关心的数据。
  3. 数据展示和分析:捕获到的事件会被转换成可读的格式,供用户进一步分析。sysdig 支持通过 chisel 对数据进行实时分析和可视化展示。

通过这种方式,sysdig 使得我们能够深入理解系统的内部操作,并快速定位问题,无论是性能瓶颈、网络问题还是安全隐患。


3. sysdig 的命令行参数和基本用法

sysdig 提供了丰富的命令行选项和 chisel(小工具)来帮助你定制化分析需求。常见的命令行用法包括:

基本命令:
  • sysdig:启动 sysdig 捕获事件,并实时显示。
  • sysdig -c <chisel>:使用内置的 chisel 进行数据分析,例如 sysdig -c topprocs_cpu 用于查看 CPU 占用高的进程。
    • 使用 sysdig -cl查看所有内置的脚本
  • sysdig -p <format>:指定输出格式,%proc.name 会显示进程名,%evt.type 会显示事件类型。
过滤和筛选:
  • 使用sysdig -l查看所有的过滤器
  • sysdig evt.type=open:过滤出所有文件打开事件; evt.type可以理解为过滤系统调用的名字。
  • sysdig proc.name=nginx:筛选出所有 nginx 进程的事件。
  • sysdig fd.name=/path/to/file:筛选特定文件的事件。
其他常用参数:
  • sysdig -n <number>:指定捕获的事件数量。
  • sysdig -w xxx.scap:将事件输出到文件进行后期分析。
  • sysdig -r xxx.scap:从文件中读取事件。

4. sysdig 可以解决的问题示例

sysdig 是一款功能强大的系统监控与故障排查工具。它能够捕获并展示系统调用和内核事件的详细数据,帮助用户深入了解系统行为,快速定位和解决各种系统问题。以下是一些常见的应用场景,展示了 sysdig 如何解决实际问题。

性能监控:
  • CPU 占用监控:
    使用 sysdig -c topprocs_cpu 命令可以实时查看 CPU 占用率最高的进程,帮助用户识别哪些进程消耗了过多的 CPU 资源。这对于调优系统性能非常有帮助,尤其是在处理高负载时。
    示例命令:

    sysdig -c topprocs_cpu
    

    输出示例:

    CPU%   Process
    40%    make
    30%    gcc
    15%    java
    
  • I/O 密集型进程监控:
    sysdig -c topprocs_file 可以帮助你识别哪些进程正在执行大量的磁盘 I/O 操作。这对于排查磁盘瓶颈和优化 I/O 性能非常有效。
    示例命令:

    sysdig -c topprocs_file
    

    输出示例:

    IO%    Process
    50%    nginx
    30%    mysql
    10%    redis
    
故障排查:
  • 网络连接状态排查:
    sysdig -c netstat 命令可以查看当前系统的所有网络连接状态。它类似于 netstat 工具,但提供了更多实时的底层事件信息,帮助用户快速发现网络问题。比如,某个服务可能占用了大量的网络带宽,或有异常的网络连接。
    示例命令:

    sysdig -c netstat
    

    输出示例:

    Proto   Recv-Q  Send-Q  Local Address           Foreign Address       State
    tcp      0       0      192.168.1.2:80          192.168.1.3:54321     ESTABLISHED
    udp      0       0      192.168.1.2:123         *:*                    *
    
  • 进程行为监控:
    使用 sysdig 追踪进程的创建和执行行为是一项强大的功能,特别是当你怀疑有恶意进程或异常行为时。命令 sysdig -p "%proc.name %evt.type %evt.args" evt.type=execve 会捕获系统上所有执行的进程,并展示它们的执行类型和参数。
    示例命令:

    sysdig -p "%proc.name %evt.type %evt.args" evt.type=execve
    

    输出示例:

    bash execve /bin/bash
    python execve /usr/bin/python script.py
    
安全监控:
  • 可疑进程行为检测:
    sysdig 可用于检测可疑的进程行为,比如恶意软件的执行。通过捕获进程的系统调用,sysdig 可以帮助你发现一些异常行为。例如,监控进程是否正在打开不常见的网络端口或访问不安全的文件路径。
    示例命令:

    sysdig evt.type=execve and proc.name=python3
    

    这将帮助你检测系统上所有执行 python 的进程,查看它们的具体执行参数和路径,确保没有异常进程在运行。

  • 网络活动追踪:
    sysdig 还可以帮助监控系统上的异常网络活动,特别是当你怀疑某些进程在向外部发送恶意数据时。例如,使用以下命令可以捕获wget通过网络发送的数据包:

    sysdig "proc.name=wget and evt.type in (send, write)"
    
容器环境监控:
  • Docker 容器监控:
    sysdig 支持 Docker 容器的监控,帮助你捕获容器内部的所有系统调用。例如,使用以下命令,可以查看容器内的文件操作:

    sysdig -c topprocs_file container.id=<container_id>
    
  • Kubernetes 集群监控:
    在 Kubernetes 集群中,你可以使用 sysdig 监控特定 Pod 的活动。sysdig 支持以容器为单位进行监控和诊断,帮助开发人员快速诊断容器化应用程序中的性能瓶颈和故障。
    示例命令:

    sysdig -c topprocs_cpu container.id=<container_id> pod.name=<pod_name>
    
开发调试:
  • 应用程序调试:
    sysdig 可用于捕获和分析应用程序的系统调用链,帮助开发人员更好地理解应用与系统的交互。通过捕获系统调用,开发人员可以分析应用程序在执行时遇到的性能瓶颈,并优化应用的性能。
    示例命令:

    sysdig -p "%proc.name %evt.type %evt.args" evt.type=read or evt.type=write
    
  • 优化系统交互性能:
    sysdig 还可以帮助开发人员分析进程与系统资源的交互。例如,分析应用程序与文件系统的交互过程,找出文件读取或写入的性能瓶颈。通过 sysdig,你可以捕获所有与文件系统的相关事件,从而深入了解文件操作的细节。
    示例命令:

    sysdig -p "%proc.name %evt.type %evt.args" evt.type=open
    

通过上述的案例,我们可以看到 sysdig 在系统性能监控、故障排查、安全监控、容器监控、以及开发调试等多个场景中的强大应用能力。这使得 sysdig 成为一个无价的工具,帮助用户全面掌握系统行为、快速定位问题、提升系统安全性,并优化应用性能。


5. csysdig界面

csysdigsysdig 提供的一个可视化界面工具,它能够以图形化的方式展示 sysdig 捕获的事件。相比于命令行工具,csysdig 提供了更直观和易于操作的界面,适合需要可视化展示的场景。

特点:

  • 实时数据展示:实时显示系统的各类事件,包括 CPU 使用、内存消耗、网络流量等。
  • 交互式界面:支持图形化分析和互动操作,方便用户深入分析系统状况。
    • 可以直接使用鼠标点击界面操作, 当然也可以使用键盘选择
    • F2:切换视图(如进程视图、网络视图等)。
    • Enter:选中某个项目,查看详细信息。
  • 筛选和聚合:支持通过简单的点击进行事件筛选,帮助用户快速定位问题。

6. 自定义 Chisels

如果内置的 Chisels 不能满足需求,你还可以编写自己的 Lua 脚本。例如,统计指定的系统调用被调用了多少次:

-- Chisel description
description = "counts how many times the specified system call has been called";
short_description = "syscall count";
category = "misc";

-- Chisel argument list
args = 
{
	{
		name = "syscall_name", 
		description = "the name of the system call to count", 
		argtype = "string"
	},
}

-- Argument notification callback
function on_set_arg(name, val)
	syscallname = val
	return true
end

-- Initialization callback
function on_init()
	-- Request the fileds that we need
	ftype = chisel.request_field("evt.type")
	fdir = chisel.request_field("evt.dir")
	
	-- set the filter
	chisel.set_filter("evt.type=" .. syscallname .. " and evt.dir = >")
	
	return true
end

count = 0

-- Event parsing callback
function on_event()
	count = count + 1
	return true
end

-- End of capture callback
function on_capture_end()
	print(syscallname .. " has been called " .. count .. " times")
	return true
end

将脚本保存为 my_chisel.lua 后,通过以下命令运行:

sysdig -c my_chisel.lua open

ctrl+c结束后, 会打印出open系统调用被调用了多次

7. 总结

sysdig 是一个功能强大且灵活的系统分析工具,它不仅可以帮助开发者和运维人员深入了解系统的行为,还能有效地解决性能瓶颈、故障排查、容器监控等问题。通过掌握 sysdig 的基本用法、命令行参数以及 csysdig 的图形化界面,你可以更加高效地进行系统诊断和优化。无论是高性能的 CPU 和 I/O 分析,还是容器环境中的日志捕获,sysdig 都是一个不可或缺的利器。


http://www.kler.cn/a/442840.html

相关文章:

  • Attention计算中的各个矩阵的维度都是如何一步步变化的?
  • java项目之在线文档管理系统源码(springboot+mysql+vue+文档)
  • 分类模型为什么使用交叉熵作为损失函数
  • 基于Python的社交音乐分享平台
  • [免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】
  • 【“软件工程”基础概念学习】
  • ubuntu监测硬盘状态
  • 图像分割数据集石头rock分割数据集labelme格式2602张3类别
  • Leetcode 208实现Trie树前缀
  • iOS 核心动画
  • 【深入理解ApacheTomcat】
  • 数据结构和算法-06线段树-01
  • DOA估计算法——ESPRIT算法
  • mysql,创建数据库和用户授权核心语句
  • 使用 ts-node插件运行ts
  • C++的诗行:类与对象(中)
  • 关于IP代理API,我应该了解哪些功能特性?以及如何安全有效地使用它来隐藏我的网络位置?
  • 通过Canvas获得视频某一帧
  • Myabits的执行过程
  • Eureka控制中心:微服务控制的极速上手指南
  • WPF+MVVM案例实战与特效(四十一)-WPF文本到几何路径转换的艺术:轻松实现自定义字体路径生成
  • Linux: 通过/proc/pid/stack查看程序卡在内核的什么地方
  • Python 实现炸弹人游戏
  • 智星云技术文档:GPU测速教程
  • Java中基于TCP的Socket编程
  • API开发:Flask VS FastAPI