Sysdig 工作原理

sysdig工作原理

Sysdig架構(gòu)

markdown-img-paste-20200101170710286.png

具體實(shí)現(xiàn)

  • 內(nèi)核空間

首先,sysdig-probe 的這個(gè)驅(qū)動(dòng)利用了內(nèi)核組件tracepoint 捕獲在內(nèi)核層面的事件。通過(guò)Tracepoint,可以放置一個(gè)能夠被內(nèi)核中特殊函數(shù)調(diào)用的處理程序"handler"。現(xiàn)在,sysdig 在進(jìn)入、退出、進(jìn)程調(diào)度這些事件的系統(tǒng)調(diào)用上注冊(cè)了tracepoints,也即Sysdig-probe 的工作內(nèi)容。Sysdig-probe對(duì)這些事件的處理程序"handler"極其簡(jiǎn)單,它僅僅復(fù)制了事件的詳細(xì)信息到一個(gè)共享緩存區(qū)中,并對(duì)其編碼以供后面使用。讓"handler"如此簡(jiǎn)單的一個(gè)重要原因就是性能考慮,因?yàn)樵嫉膬?nèi)核執(zhí)行程序會(huì)被“凍結(jié)”直到"handler"返回。
(tracepoint 提供了一個(gè)鉤子去調(diào)用一個(gè)函數(shù)(稱為probe,也即探針)。當(dāng)一個(gè)tracepoint 被probe 連接上時(shí)便啟動(dòng)了,每次tracepoint 被執(zhí)行的時(shí)候,probe 這個(gè)函數(shù)便會(huì)在調(diào)用方的執(zhí)行上下文中被調(diào)用。probe 結(jié)束執(zhí)行,返回給調(diào)用者,從tracepoint 位置繼續(xù)。)

  • 用戶空間

"event buffer"使用了內(nèi)存映射的方式映射到用戶空間,因此它能夠在沒有進(jìn)行任何復(fù)制操作的情況下被訪問,最小化了CPU使用率和減少緩存丟失的情況。"libscap"和"libsinsp"這兩個(gè)庫(kù)提供了讀、編碼以及解析事件的功能。具體來(lái)說(shuō),"libscap"提供了跟蹤文件管理功能,而"libsinsp"包含了復(fù)雜的狀態(tài)跟蹤功能(例如,可以使用文件名而不是FD),以及過(guò)濾、事件解碼、運(yùn)行"chisels"工具的Lua JIT編譯器等。
最后,sysdig 對(duì)這些庫(kù)進(jìn)行了簡(jiǎn)單的包裝。

當(dāng)"event buffer"填滿(即sysdig,libsinsp,libscap 來(lái)不及處理來(lái)自內(nèi)核的事件流)的時(shí)候,sysdig-probe 便會(huì)開始丟棄即將到來(lái)的事件。這種情況下可能會(huì)丟失部分跟蹤信息,但機(jī)器或者其他進(jìn)程的性能不會(huì)受其影響。這意味著,sysdig很適合用在生產(chǎn)環(huán)境上。

Linux系統(tǒng)調(diào)用相關(guān)

sysdig基于系統(tǒng)調(diào)用工作。系統(tǒng)調(diào)用,指運(yùn)行在用戶空間的程序向操作系統(tǒng)內(nèi)核請(qǐng)求需要更高權(quán)限運(yùn)行的服務(wù)。系統(tǒng)調(diào)用提供用戶程序與操作系統(tǒng)之間的接口。大多數(shù)系統(tǒng)交互式操作需求在內(nèi)核態(tài)運(yùn)行。如設(shè)備IO操作或者進(jìn)程間通信
簡(jiǎn)單地說(shuō),系統(tǒng)調(diào)用是程序與操作系統(tǒng)交互的主要方式。系統(tǒng)調(diào)用接口包含了若干個(gè)操作系統(tǒng)賦予給運(yùn)行在其上的應(yīng)用程序使用的函數(shù)。這些函數(shù)允許打開文件、創(chuàng)建網(wǎng)絡(luò)連接、從文件中讀寫等操作,可以說(shuō)機(jī)器上大部分的事件都要經(jīng)過(guò)系統(tǒng)調(diào)用。


想要掌握sysdig的使用,我們需要掌握以下系統(tǒng)調(diào)用。

clone
  • 主要工作:
    創(chuàng)建新進(jìn)程
  • 作用:
    Clone 基本上是創(chuàng)建進(jìn)程和線程的唯一Linux內(nèi)核入口點(diǎn)。這意味著你能通過(guò)查看它觀察到所有進(jìn)程和線程的活動(dòng)執(zhí)行。子線程中的返回值為0,父線程中的子pid為0。Clone克隆是最復(fù)雜的系統(tǒng)調(diào)用之一,有很多可以告訴你很多關(guān)于新進(jìn)程正在創(chuàng)建的標(biāo)志
  • 注意:
    Clone 是唯一返回兩次的系統(tǒng)調(diào)用,一次是在父進(jìn)程,一次在子進(jìn)程。
execve
  • 主要工作:
    執(zhí)行新的程序
  • 作用:
    Execve 是運(yùn)行程序的唯一Linux內(nèi)核入口。用戶空間API有幾種變形,比如execl和fexecve,但它們最后都會(huì)激活系統(tǒng)調(diào)用execve。你基本上總能在clone操作后看見execve操作,監(jiān)控execve操作能告訴你什么程序在你的系統(tǒng)里執(zhí)行。單一程序、腳本、定時(shí)任務(wù)都會(huì)通過(guò)execve執(zhí)行。
chdir
  • 主要工作:
    改變當(dāng)前進(jìn)程的工作目錄
  • 作用:
    通過(guò)chdir,能看見誰(shuí)訪問了哪個(gè)目錄
open/creat
  • 主要工作:
    打開乃至新建一個(gè)文件或設(shè)備
  • 作用:
    通過(guò)追蹤這個(gè)系統(tǒng)調(diào)用,你能夠看到文件什么時(shí)候被創(chuàng)建或修改
  • 注意:使用filters能夠讓在sysdig中追蹤這個(gè)系統(tǒng)調(diào)用更高效(更有趣)
    sysdig evt.type=open and proc.name=evilproc and file.name contains /etc
connect
  • 主要工作:
    在套接字上啟動(dòng)連接
  • 作用:
    這是建立新的網(wǎng)絡(luò)連接的唯一內(nèi)核入口。每一次機(jī)器上的進(jìn)程想要連接某個(gè)地方,你就能看到這個(gè)系統(tǒng)調(diào)用。
  • 注意:
    sysdig evt.type=connect and fd.port=80
accept
  • 主要工作:
    接受套接字上的連接
  • 作用:
    此系統(tǒng)調(diào)用鏡像連接,即每次在機(jī)器上建立服務(wù)器連接時(shí)都將看到一個(gè)鏡像連接
read/write
  • 主要工作:
    read 和write 系統(tǒng)調(diào)用在Linux系統(tǒng)調(diào)用接口中有很多變形,如:readv、writev、preadv、pwritev、send、recv、sendto、recvfrom、sendmsg、recvmsg、recvmmsg。它們大致上做著相同的工作,即向一個(gè)文件描述符讀寫數(shù)據(jù),這是I/O操作的核心。
  • 作用:
    由于在Linux上幾乎所有東西都是一個(gè)文件描述符,觀察這些調(diào)用非常方便。通過(guò)它們可以看到文件的訪問、網(wǎng)絡(luò)數(shù)據(jù)的交換、pipes的活動(dòng)以及unix套接字。
  • 注意:sysdig提供了一個(gè)chisel工具echo_fds讓我們能夠很方便地查看I/O活動(dòng)
    sysdig -c echo_fds fd.name=/etc/passwd
unlink/rename
  • 主要工作:
    刪除或者重命名文件
  • 作用:
    open/creat 系統(tǒng)調(diào)用能告訴你新建了文件,read/write 調(diào)用的變形能告訴你文件什么時(shí)候被修改,而unlink和rename 則告訴你什么時(shí)候文件被刪除和重命名
brk/mmap/munmap
  • 主要工作:
    分配/釋放內(nèi)存
  • 作用:
    這些系統(tǒng)調(diào)用能讓你觀察到進(jìn)程什么時(shí)候分配或者釋放內(nèi)存。brk 通常由malloc()使用,而mmap/mmunmap 具有更多用途,包括共享內(nèi)存或?qū)⑽募成涞絻?nèi)存
  • 注意:
    內(nèi)存管理極其復(fù)雜,范圍遠(yuǎn)超出這里的內(nèi)容。 由于程序中的malloc()或new()方法,你幾乎永遠(yuǎn)不會(huì)看到brk或mmap調(diào)用,因?yàn)橐话闱闆r下你的程序在獲取其內(nèi)存之前可能會(huì)經(jīng)過(guò)至少一個(gè)或兩個(gè)實(shí)體。例如,glibc有一個(gè)內(nèi)存分配器,該內(nèi)存分配器從內(nèi)核中請(qǐng)求大塊連續(xù)地址的內(nèi)存,然后在用戶級(jí)別進(jìn)行管理。你最喜歡的基于VM語(yǔ)言的垃圾回收器就是執(zhí)行類似的操作。
select/poll
  • 主要工作:
    等待操作執(zhí)行
  • 作用:
    當(dāng)進(jìn)程沒有主動(dòng)去執(zhí)行某個(gè)操作時(shí),它們可能被這兩者之一阻塞住了。觀察它們的參數(shù)能告訴我們進(jìn)程在等待什么以及等了多久。
kill
  • 主要工作:
    發(fā)送信號(hào)
  • 作用:
    kill 用于進(jìn)程間發(fā)送信號(hào)

參考資料:
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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 主要參考:《程序員的自我修養(yǎng)》讀書總結(jié)編譯與鏈接過(guò)程的思考linux 下動(dòng)態(tài)鏈接實(shí)現(xiàn)原理研讀《程序員的自我修養(yǎng)—鏈...
    林大鵬閱讀 5,786評(píng)論 0 13
  • 計(jì)算機(jī)系統(tǒng)漫游 代碼從文本到可執(zhí)行文件的過(guò)程(c語(yǔ)言示例):預(yù)處理階段,處理 #inlcude , #defin...
    willdimagine閱讀 3,820評(píng)論 0 5
  • 又來(lái)到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來(lái)談?wù)劜?..
    tangsl閱讀 4,309評(píng)論 0 23
  • 文/tangsl(簡(jiǎn)書作者) 原文鏈接:http://www.itdecent.cn/p/2b993a4b913e...
    西葫蘆炒胖子閱讀 3,922評(píng)論 0 5
  • 1、Linux內(nèi)存頁(yè)管理 Linux內(nèi)核管理物理內(nèi)存是通過(guò)分頁(yè)機(jī)制實(shí)現(xiàn)的,它將整個(gè)內(nèi)存劃分成4K大小頁(yè),作為使分配...
    gbmaotai閱讀 1,527評(píng)論 0 2

友情鏈接更多精彩內(nèi)容