使用 sysdig 進行監控和調試 linux 機器

sysdig 簡介

sysdig 官網 上對自己的介紹是:

Open Source Universal System Visibility With Native Contaier Support.

它的定位是系統監控、分析和排障的工具,其實在 linux 平臺上,已經有很多這方面的工具 strace、tcpdump、htop、iftop、lsof、netstat,它們都能用來分析 linux 系統的運行情況,而且還有很多日誌、監控工具。爲什麼還需要 sysdig 呢?在我看來,sysdig 的優點可以歸納爲三個詞語:整合、強大、靈活。

整合

雖然 linux 有很多系統分析和調優的工具,但是它們一般都負責某個特殊的功能,並且使用方式有很大的差異,如果要分析和定位問題,一般都需要熟練掌握需要命令的使用。而且這些工具的數據無法進行共享,只能相互獨立工作。sysdig 一個工具就能實現上述所有工具的功能,並且提供了統一的使用語法。

強大

sysdig 能獲取實時的系統數據,也能把信息保存到文件中以供後面分析。捕獲的數據包含系統的個個方面:

除了幫你捕獲信息之外,sysdig 還預先還有有用的工具來分析這些數據,從大量的數據中找到有用的信息變得非常簡單。比如你能還簡單地做到下面這些事情:

基本上自帶的工具就能滿足大部分的分析需求。

靈活

sysdig 有着類似於 tcpdump 的過濾語法,用戶可以隨意組合自己的過濾邏輯,從茫茫的數據中找到關心的信息。除此之外,用戶還可以自己編寫 Lua 腳本來自定義分析邏輯,基本上不受任何限制。

工作原理

sysdig 通過在內核的 driver 模塊註冊系統調用的 hook,這樣當有系統調用發生和完成的時候,它會把系統調用信息拷貝到特定的 buffer,然後用戶模塊的組件對數據信息處理(解壓、解析、過濾等),並最終通過 sysdig 命令行和用戶進行交互。

更多的原理可以參考官方博客

除了 sysdig 命令之外,還有一個基於終端的 UI 命令 csysdig,它類似於 top 命令,定時對系統情況進行刷新,並且可以讓用戶交互。這篇文章我們只介紹 sysdig,不會講解 csysdig 的使用。

安裝

sysdig 的安裝在官方文檔中有詳細的說明,這裏不再贅述。需要注意的是,sysdig 對內核版本有一定的要求,請保證內核不要太舊。

另外,如果使用容器的方式安裝,需要把主機的很多系統目錄 mount 到容器中:

docker run -i -t --name sysdig --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro sysdig/sysdig

sysdig 基本用法

基本格式

直接在終端輸入 sysdig 就能開始捕獲系統信息,這個命令需要系統管理員權限,執行後你會看到終端有持續不斷的輸出流。

$ sudo sysdig

因爲系統每時每刻都有大量的系統調用產生,這樣是沒辦法看清更無法分析輸出信息的,可以先使用 CTRL + c 來退出命令。

在講解如何使用 sysdig 的參數之前,我們先來解釋一下它的輸出格式:

5352209 11:54:08.853479695 0 ssh-agent (13314) < getrusage
5352210 11:54:08.853481094 0 ssh-agent (13314) > clock_gettime
5352211 11:54:08.853482049 0 ssh-agent (13314) < clock_gettime
5352226 11:54:08.853510313 0 ssh-agent (13314) > getrusage
5352228 11:54:08.853511089 0 ssh-agent (13314) < getrusage
5352229 11:54:08.853511646 0 ssh-agent (13314) > clock_gettime
5352231 11:54:08.853512020 0 ssh-agent (13314) < clock_gettime
5352240 11:54:08.853530285 0 ssh-agent (13314) > stat
5352241 11:54:08.853532329 0 ssh-agent (13314) < stat res=0 path=/home/cizixs/.ssh
5352242 11:54:08.853533065 0 ssh-agent (13314) > stat
5352243 11:54:08.853533990 0 ssh-agent (13314) < stat res=0 path=/home/cizixs/.ssh/id_rsa.pub
5353954 11:54:08.857382204 0 ssh-agent (13314) > write fd=16 size=280

所有的輸入都是按照行來分割的,每行都是一條記錄,由多個列組成,默認的格式是:

%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info

各個字段的含義如下:

過濾

完整的 sysdig 使用方法是這樣的:

sysdig [option]...  [filter]

因爲 sysdig 的輸出內容很多,不管是監控還是查問題我們要關注的事件只是其中很小的一部分。這個時候就要用到過濾的功能,找到感興趣的事件。sysdig 的過濾功能很強大,不僅支持的過濾項很多,而且還能夠自由地進行邏輯組合。

sysdig 的過濾器也是分成不同類別的,比如:

完整的過濾器列表可以使用 sysdig -l 來查看,比如可以查看建立 TCP 連接的事件:

sudo sysdig evt.type=accept

過濾器除了直接的相等比較之外,還有其他操作符,包括 =!=>=><<=containsinexists,比如:

$ sysdig fd.name contains /etc
$ sysdig "evt.type in ( 'select', 'poll' )"
$ sysdig proc.name exists

更酷的是,多個過濾條件還可以通過 andornot 進行邏輯組合,比如:

$ sysdig "not (fd.name contains /proc or fd.name contains /dev)"

這些強大的功能綜合到一起,就能讓我們很容易定位到需要的事件,分析和監控更有目的性。

自定義輸出格式

標準的輸出已經打印出常用的信息,sysdig 還允許你自定義打印出的內容,參數 -p 可以加上類似於 C 語言 printf 字符串,比如:

$ sysdig -p"user:%user.name dir:%evt.arg.path" evt.type=chdir
user:ubuntu dir:/root
user:ubuntu dir:/root/tmp
user:ubuntu dir:/root/Download

上面的信息,可以很容易看到用戶更改當前目錄的情況。從上面的例子也可以使用 -p 的使用方法:

$ sysdig -p"*%evt.type %evt.dir %evt.arg.name" evt.type=open
open > <NA>
open < /proc/1285/task/1399/stat
open > <NA>
open < /proc/1285/task/1400/io
open > <NA>
open < /proc/1285/task/1400/statm
open > <NA>

保存到文件

儘管可以用過濾器減少輸出,直接在終端查看事件流還是沒有辦法讓我們進行深入分析。和 tcpdump 工具類似,sysdig 也允許你把捕獲的時間保存到本地的文件,然後再讀取文件的內容進行分析。

保存到文件可以通過 -w 實現,從文件中讀取需要 -r 參數,比如:

$ sudo sysdig -w sysdig-trace-file.scap


$ sudo sysdig -r sysdig-trace-file.scap

另一個有用的功能是,你可以控制捕獲到文件的內容。通常情況下,sysdig 捕獲了系統所有的活動,因此這些數據會很大,如果一直捕獲的話,會造成磁盤空間的浪費,sysdig 提供了類似於 log rotate 的方式,讓你只保存最新捕獲的文件。

控制捕獲文件大小的一個辦法是在捕獲的使用使用過濾器,之外,你還可以通過 -n 2000 指定捕獲 2000 條事件之後就退出,或者通過 logrotate 的方式來滾動文件:

當使用 -w 保存文件的使用,還可以使用 -z 參數對保存的內容進行壓縮,進一步減少佔用的空間。

讀取的時候也可以使用過濾器,如果我們只關心 write 系統調用:

$ sysdig -r sysdig-trace-nano.scap evt.type=write

而且讀取的時候也可以進一步對文件進行分割,比如:

> sysdig -r dump.scap -G 300 -z -w segments.scap

這個命令,就是讀取 dump.scap 文件的內容,並且把它分割成五分鐘(-G 300s)的多個文件。

常用的參數

除了上面介紹的過濾器參數,sysdig 還有很多可用的參數,完整的列表和解釋請參考 man sysdig 文檔。這裏介紹一下比較常用的:

Chisels:實用的工具箱

雖然有了過濾器和文件的輸入輸出,加上 sysdig 其他的參數,我們可以按照需求去分析和監控系統了,但是很多場景需要更復雜的數據聚合。sysdig 提供了另外一個強大的功能:chisels,它們是一組預定義的功能集合,通過 Lua 腳本實現,用來分析特定的場景。

可以通過 sudo sysdig -cl 列出支持的所有 chisels,我們來解釋一些比較常用的 chisels:

有些 chisel 可能需要參數才能正常運行,如果要了解某個 chisel 的具體使用說明,可以用 -i 參數,比如要了解 spy_file 的用法:

$ sudo sysdig -i spy_file

Category: I/O
-------------
spy_file        Echo any read/write made by any process to all files. Optionall
                y, you can provide the name of one file to only intercept reads
                /writes to that file.

This chisel intercepts all reads and writes to all files. Instead of all files,
 you can limit interception to one file.
Args:
[string] read_or_write - Specify 'R' to capture only read event
                s; 'W' to capture only write events; 'RW' to capture read and w
                rite events. By default both read and write events are captured
                .
[string] spy_on_file_name - The name of the file which the chis
                el should spy on for all read and write activity.

文章最開始的時候,我提到過 sysdig 可以滿足大部分的日常分析,它們主要就是通過 chisel 完成的。比如:

按照網絡的使用情況對進程進行排序:

$  sysdig -c topprocs_net

按照建立連接數量對進程進行排序:

$ sysdig -c fdcount_by fd.sport "evt.type=accept"

查看系統中用戶執行的命令:

$ sysdig -r sysdig.pcap -c spy_users

更多的使用案例,可以參考 Sysdig Example 這篇 wiki。

在 linux 機器上,這些 chisel 保存在 /usr/share/sysdig/chisels 文件夾中,每個 chisel 對應一個 lua 腳本文件。如果提供的這些 chisel 還不能滿足需求,用戶也可以根據需求編寫自己的 chisel

對容器的支持

sysdig 另外一個優勢是它對容器(docker 和 kubernetes)的良好支持,這對於目前採用了容器化的系統管理員來說是很好的福利。

使用 -pc 參數就能自動在打印的事件中添加上容器的信息(容器名、容器 id 等),比如捕獲 container 名字爲 zen_knuth 的所有系統活動:

$ sysdig -pc container.name=zen_knuth

對容器的分析和原來的一樣,只要通過 container.name=apache 指定要分析的容器名字就行,比如查看某個容器的網絡連接:

$ sysdig -pc -c topconns container.name=wordpress1

要集成 kubernetes 系統監控的話,使用 -k http://master_ip:8080 參數,後面是 apiserver 的地址,如果 apiserver 需要認證的話,需要指定 -K filename 來說明 apiserver CA 證書的文件地址。關於 kubernetes 的監控和分析不是這篇文章的重點,讀者可以參數 sysdig 的博客或者其他文檔。

Csysdig:圖形化的 sysdig

sysdig 還提供了另外一個圖形化的工具:Csysdig,它的界面和 top/htop 命令相似,並且可以接受用戶的交互。

和 sysdig 一樣,csysdig 可以實時捕獲系統事件,也可以讀取之前保存的文件。

更多文檔

這篇文章介紹的都出入門的、基礎概念性的知識,如果讀者希望進一步瞭解 sysdig,不妨繼續閱讀下面這些文章:

參考資料

這篇文章主要參考了一下的博客、文章和資料:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://cizixs.com/2017/04/27/sysdig-for-linux-system-monitor-and-analysis/