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

superx001 8年前發布 | 18K 次閱讀 Linux

來自: http://blog.jobbole.com/98717/

如果你需要跟蹤一個進程發出和接收的系統調用,第一個想到是的什么?你很可能想到了 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 https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash

安裝完成后,我們可以像這樣運行 sysdig,來感受一下。

# sysdig

屏幕上立刻充斥這系統內發生的一切信息,我們沒辦法利用這些信息,所以我們應該運行:

# sysdig -cl | less

來查看已有的 chisels 列表:

下列類別是默認可用的,每一類都有多個內置的 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

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

需要注意 #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 跟蹤數據到指定文件。</pre> 

在上面的例子里,我們給壓縮的跟蹤文件按照主機名來命名。記住,你可以在任何時候敲Ctrl + c終止 sysdig 的運行。

我們采集了足夠多的數據后,可以用如下指令查看系統內每個用戶的交互行為:

# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users

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

如果你想把目標指向一個特定用戶,并只監控該用戶的活動該怎么辦呢?你可以通過用戶名來過濾 spy_users chisel 的結果:

# sysdig -r /mnt/sysdig/debian.scap.gz -c spy_users "user.name=xmodulo"

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 示例:監控網絡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,開始挖掘吧!

</div>

 本文由用戶 superx001 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!