Sysdig 工作原理

sysdig工作原理

Sysdig架构

markdown-img-paste-20200101170710286.png

具体实现

  • 内核空间

首先,sysdig-probe 的这个驱动利用了内核组件tracepoint 捕获在内核层面的事件。通过Tracepoint,可以放置一个能够被内核中特殊函数调用的处理程序"handler"。现在,sysdig 在进入、退出、进程调度这些事件的系统调用上注册了tracepoints,也即Sysdig-probe 的工作内容。Sysdig-probe对这些事件的处理程序"handler"极其简单,它仅仅复制了事件的详细信息到一个共享缓存区中,并对其编码以供后面使用。让"handler"如此简单的一个重要原因就是性能考虑,因为原始的内核执行程序会被“冻结”直到"handler"返回。
(tracepoint 提供了一个钩子去调用一个函数(称为probe,也即探针)。当一个tracepoint 被probe 连接上时便启动了,每次tracepoint 被执行的时候,probe 这个函数便会在调用方的执行上下文中被调用。probe 结束执行,返回给调用者,从tracepoint 位置继续。)

  • 用户空间

"event buffer"使用了内存映射的方式映射到用户空间,因此它能够在没有进行任何复制操作的情况下被访问,最小化了CPU使用率和减少缓存丢失的情况。"libscap"和"libsinsp"这两个库提供了读、编码以及解析事件的功能。具体来说,"libscap"提供了跟踪文件管理功能,而"libsinsp"包含了复杂的状态跟踪功能(例如,可以使用文件名而不是FD),以及过滤、事件解码、运行"chisels"工具的Lua JIT编译器等。
最后,sysdig 对这些库进行了简单的包装。

当"event buffer"填满(即sysdig,libsinsp,libscap 来不及处理来自内核的事件流)的时候,sysdig-probe 便会开始丢弃即将到来的事件。这种情况下可能会丢失部分跟踪信息,但机器或者其他进程的性能不会受其影响。这意味着,sysdig很适合用在生产环境上。

Linux系统调用相关

sysdig基于系统调用工作。系统调用,指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态运行。如设备IO操作或者进程间通信
简单地说,系统调用是程序与操作系统交互的主要方式。系统调用接口包含了若干个操作系统赋予给运行在其上的应用程序使用的函数。这些函数允许打开文件、创建网络连接、从文件中读写等操作,可以说机器上大部分的事件都要经过系统调用。


想要掌握sysdig的使用,我们需要掌握以下系统调用。

clone
  • 主要工作:
    创建新进程
  • 作用:
    Clone 基本上是创建进程和线程的唯一Linux内核入口点。这意味着你能通过查看它观察到所有进程和线程的活动执行。子线程中的返回值为0,父线程中的子pid为0。Clone克隆是最复杂的系统调用之一,有很多可以告诉你很多关于新进程正在创建的标志
  • 注意:
    Clone 是唯一返回两次的系统调用,一次是在父进程,一次在子进程。
execve
  • 主要工作:
    执行新的程序
  • 作用:
    Execve 是运行程序的唯一Linux内核入口。用户空间API有几种变形,比如execl和fexecve,但它们最后都会激活系统调用execve。你基本上总能在clone操作后看见execve操作,监控execve操作能告诉你什么程序在你的系统里执行。单一程序、脚本、定时任务都会通过execve执行。
chdir
  • 主要工作:
    改变当前进程的工作目录
  • 作用:
    通过chdir,能看见谁访问了哪个目录
open/creat
  • 主要工作:
    打开乃至新建一个文件或设备
  • 作用:
    通过追踪这个系统调用,你能够看到文件什么时候被创建或修改
  • 注意:使用filters能够让在sysdig中追踪这个系统调用更高效(更有趣)
    sysdig evt.type=open and proc.name=evilproc and file.name contains /etc
connect
  • 主要工作:
    在套接字上启动连接
  • 作用:
    这是建立新的网络连接的唯一内核入口。每一次机器上的进程想要连接某个地方,你就能看到这个系统调用。
  • 注意:
    sysdig evt.type=connect and fd.port=80
accept
  • 主要工作:
    接受套接字上的连接
  • 作用:
    此系统调用镜像连接,即每次在机器上建立服务器连接时都将看到一个镜像连接
read/write
  • 主要工作:
    read 和write 系统调用在Linux系统调用接口中有很多变形,如:readv、writev、preadv、pwritev、send、recv、sendto、recvfrom、sendmsg、recvmsg、recvmmsg。它们大致上做着相同的工作,即向一个文件描述符读写数据,这是I/O操作的核心。
  • 作用:
    由于在Linux上几乎所有东西都是一个文件描述符,观察这些调用非常方便。通过它们可以看到文件的访问、网络数据的交换、pipes的活动以及unix套接字。
  • 注意:sysdig提供了一个chisel工具echo_fds让我们能够很方便地查看I/O活动
    sysdig -c echo_fds fd.name=/etc/passwd
unlink/rename
  • 主要工作:
    删除或者重命名文件
  • 作用:
    open/creat 系统调用能告诉你新建了文件,read/write 调用的变形能告诉你文件什么时候被修改,而unlink和rename 则告诉你什么时候文件被删除和重命名
brk/mmap/munmap
  • 主要工作:
    分配/释放内存
  • 作用:
    这些系统调用能让你观察到进程什么时候分配或者释放内存。brk 通常由malloc()使用,而mmap/mmunmap 具有更多用途,包括共享内存或将文件映射到内存
  • 注意:
    内存管理极其复杂,范围远超出这里的内容。 由于程序中的malloc()或new()方法,你几乎永远不会看到brk或mmap调用,因为一般情况下你的程序在获取其内存之前可能会经过至少一个或两个实体。例如,glibc有一个内存分配器,该内存分配器从内核中请求大块连续地址的内存,然后在用户级别进行管理。你最喜欢的基于VM语言的垃圾回收器就是执行类似的操作。
select/poll
  • 主要工作:
    等待操作执行
  • 作用:
    当进程没有主动去执行某个操作时,它们可能被这两者之一阻塞住了。观察它们的参数能告诉我们进程在等待什么以及等了多久。
kill
  • 主要工作:
    发送信号
  • 作用:
    kill 用于进程间发送信号

参考资料:
https://sysdig.com/blog/sysdig-vs-dtrace-vs-strace-a-technical-discussion/
https://www.kernel.org/doc/Documentation/trace/tracepoints.txt
https://sysdig.com/blog/fascinating-world-linux-system-calls/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 主要参考:《程序员的自我修养》读书总结编译与链接过程的思考linux 下动态链接实现原理研读《程序员的自我修养—链...
    林大鹏阅读 5,478评论 0 14
  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,557评论 0 5
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,085评论 0 23
  • 文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e...
    西葫芦炒胖子阅读 3,741评论 0 5
  • 1、Linux内存页管理 Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成4K大小页,作为使分配...
    gbmaotai阅读 1,403评论 0 2