sysdig工作原理
Sysdig架構(gòu)

具體實(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/