1. 程式人生 > >如何用 sysdig 監控和排查 Linux 服務器

如何用 sysdig 監控和排查 Linux 服務器

sysdig

如果你需要跟蹤一個進程發出和接收的系統調用,第一個想到是的什麽?你很可能想到了 strace,你是對的。 從命令行監控原始網絡通信你會用什麽工具?如果你想到了 tcpdump,你又做了明智的決定。如果你碰巧需要跟蹤打開的文件(換句 Unix 語言來講就是:一切皆文件),很可能你會用 lsof。

strace、tcpdump 和 lsof 確實了不起的工具,應該是每個系統管理員工具箱裏的一部分。這恰恰是你會喜歡 sysdig 的原因,一個強大的系統級[探索]和調試工具,開源的,並且被創始人稱作“strace + tcpdump + lsof ,頂上澆了帶有 Lua 櫻桃的美妙醬汁”。好吧,先把幽默放一邊,sysdig 的一個很棒的特性在於,它不僅能夠分析Linux 系統的 “現場”狀態,還能夠把系統狀態保存到一個轉儲文件以用於離線檢測。而且,你可以用內置(或者自己編寫)的小腳本 —— 名為“chisels(鑿子)” —— 來定制 sysdig 的行為甚至增強 sysdig 的能力。各種 chisels 都以各自不同的腳本特性來分析 sysdig 捕獲的事件流。

在本教程裏,我們將研究 sysdig 在 Linux 上的安裝和基本的系統監控和調試用法。

安裝Sysdig

為了簡單、明了和Linux發行版無關方面的考慮,本教程選擇官網描述的自動安裝流程,安裝腳本自動探查操作系統並安裝必要的依賴包。

以 root 身份運行如下指令,從官方 apt/yum 源安裝 sysdig。
curl -s http://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash
安裝完成後,我們可以像這樣運行 sysdig,來感受一下。
sysdig
屏幕上立刻充斥這系統內發生的一切信息,我們沒辦法利用這些信息,所以我們應該運行:

sysdig -cl | less
來查看已有的 chisels 列表:

to_see_a_list_of_available_chisels_15334678610_e5956a26e8_z

下列類別是默認可用的,每一類都有多個內置的 chisels。
CPU
Usage CPU 使用情況

Errors
錯誤

I/O

輸入/輸出

Logs
日誌

Misc
雜項

Net
網絡

Performance
性能

Security
安全

System
State 系統狀態
顯示一個特定chisel的信息(含詳細的命令行用法),運行:

sysdig -cl [chisel_name]
比如,查看“Net”類別下的 spy_port chisel,可以運行:
sysdig -i spy_port
sysdig_i_spy_port_15521424095_0365bf20c3_z

chisel 可以跟過濾器結合以便獲得更有用的輸出內容,過濾器可以用於現場數據也可以用於跟蹤文件。
過濾器遵循“類別.字段”的結構,比如:

fd.cip: 客戶端 IP 地址
evt.dir: 事件方向,可以是 ‘>’,代表進入事件;或 ‘<’,代表退出事件。
下面的命令顯示所有的過濾器:
sysdig -l
在剩下的教程裏,我將演示一些 sysdig 的用例。

Sysdig 示例:服務器性能調試

假設你的服務器遇到性能問題(比如無反應或嚴重的反應延遲),你可以用 bottlenecks chisel 來顯示此時最慢的 10 個系統調用。

下面的命令可以在運行中的服務器上實時做檢測。“-c” 標記後面跟著 chisel名,是告訴 sysidg 運行指定的 chisel。
sysdig -c bottlenecks
或者,你可以執行離線服務器性能分析。這種情況下,你可以把完整的 sysdig 跟蹤數據保存到一個文件裏,然後對跟蹤文件運行 bottlenecks chisel ,方法如下:

首先,保存 sysdig 跟蹤文件(用 Ctrl+c 終止數據收集):
sysdig -w trace.scap
收集完跟蹤數據,用如下命令就可以檢查跟蹤期間最慢的系統調用:
sysdig -r trace.scap -c bottlenecks
sysdig_r_trace.scap_c_bottlenecks_15334678670_ebbe93265e_z

需要註意 #2 #3 和 #4 列,它們分別代表執行時間、進程名和 PID。

Sysdig 示例:監控用戶行為

假設你作為系統管理員想要監控系統的用戶行為(比如,用戶在命令行敲了什麽指令、進入了哪些目錄),那麽 spy_user chisel 就派上用場了。

我們首先用一些額外選項來收集 sysdig 跟蹤文件:

sysdig -s 4096 -z -w /mnt/sysdig/$(hostname).scap.gz

 "-s 4096" 

告訴sysdig 對每個事件捕捉4096個字節。

"-z"

(跟 -w 一起使用)壓縮跟蹤文件。

"-w

<trace-file>"
保存 sysdig 跟蹤數據到指定文件。
在上面的例子裏,我們給壓縮的跟蹤文件按照主機名來命名。記住,你可以在任何時候敲Ctrl + c終止 sysdig 的運行。

我們采集了足夠多的數據後,可以用如下指令查看系統內每個用戶的交互行為:
sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users
sysdig_r_mnt_sysdig_debian.scap.gz_c_spy_users_15518254291_5c9671ca41_z

上面的輸出裏,第一列代表與用戶活動相關的進程PID。

如果你想把目標指向一個特定用戶,並只監控該用戶的活動該怎麽辦呢?你可以通過用戶名來過濾 spy_users chisel 的結果:
sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users "user.name=xmodulo"
sysdig_r_mnt_sysdig_debian.scap.gz_c_spy_users_user.name=xmodulo_15498248556_66d15422b1_z

Sysdig 示例:監控文件I/O

我們可以用 “-p” 標記來定制 sysdig 跟蹤的輸出格式,在雙引號內包含所需的字段(比如: 用戶名、進程名以及文件或套接字名)。在下面的例子裏,我們創建一個跟蹤文件,只包括對 home 目錄的寫入事件(過後我們可以用”sysdig -r writetrace.scap.gz” 來查看)。
sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/" -z -w writetrace.scap.gz
sysdig_p_15498248586_de5f5fc93d_z

Sysdig 示例:監控網絡I/O

作為服務器調試的一部分,你可能需要窺探網絡流量,而這一般都是用 tcpdump。用 sysdig 呢,流量嗅探同樣很容易,而且方式更加用戶友好。

例如,你可以查看服務器的某個特定進程(比如 apache2)與一個特定 IP 地址的數據交換(ASCII形式):
sysdig -s 4096 -A -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2
如果你想監控原始數據傳輸(二進制形式),把 “-A” 改為 “-X”。
sysdig -s 4096 -X -c echo_fds fd.cip=192.168.0.100 -r /mnt/sysdig/debian.scap.gz proc.name=apache2
想要更多的信息、示例和案例研究可以登錄項目官網。相信我,sysdig 擁有無限的可能性。別光聽我說,現在就安裝 sysdig,開始挖掘吧!

參考官網
https://www.ibm.com/developerworks/cn/linux/1607_caoyq_sysdig/index.html

如何用 sysdig 監控和排查 Linux 服務器