像 Boss 一樣用 sysdig 來排查問題

至秦發表於2015-10-17

你可能還不知道,現在有一個新工具sysdig,可以用它來排查故障。它被鼓吹是 strace 和 tcpdump 的合體,我認為這是一種炒作。我倒覺得可以把 sysdig 同 SystemTap 和 tcpdump一起比較,因為它的命令語法類似tcpdump,而功能像 SystemTap 一樣強大。

我在本文中會介紹關於 sysdig 的一些基礎知識和很棒的例子,你可以在 sysdig wiki 上找到更為詳細的資訊。然而,即便是 sysdig 的官方文件,也只涉及 sysdig 功能的皮毛而已。

安裝

本文中我們將在 Ubuntu 上使用 apt-get 安裝sysdig。如果你執行的是基於 rpm 的發行版,你可以在wiki上找到通過 yum 安裝的細節。

準備 apt 倉庫

通過 apt 安裝sysdig,我們需要準備好 apt 倉庫,由 sysdig 後面的 Draios 公司來維護。可以執行下面的 curl 命令來完成:

第一行命令下載 Draios gpg 金鑰並把它加入 apt 金鑰庫。第二行從 Draios 下載 apt 原始檔,並把它放到 /etc/apt/sources.list.d/ 路徑下。

更新 apt 的索引

一旦安裝好原始檔列表和 gpg 金鑰,需要執行 apt-get update 來重新同步 apt 包的索引。

核心標頭檔案包

sysdig 工具需要用到核心標頭檔案包,開始安裝前,需要確認核心標頭檔案包已安裝上。

檢查核心標頭檔案是否安裝

在這個例子中,我使用的系統已經安裝了核心標頭檔案包,你可以使用 dpkg 命令檢視你的系統上是否有安裝。

有一點要特別注意,核心標頭檔案包必須和你係統上的核心版本相匹配。從上面的輸出,你可以看到 linux-generic 包的版本號是3.11.0.12,標頭檔案包也是3.11.0.12。如果你有多個核心,你可以通過 uname 命令來確認你正在執行哪個版本。

安裝核心標頭檔案包

你可以用 apt-get 安裝與核心匹配的標頭檔案包。記住,你必須確認核心的版本資訊,可以通過 uname -r 來獲得。

例如

安裝 sysdig

既然 apt repo 安裝完成,那麼所需的依賴條件都已滿足。下面可以安裝 sysdig 命令了。

使用 sysdig

基本操作

sysdig 語法和 tcpdump類似,特別是儲存和讀取記錄檔案的時候。與tcpdump 一樣,sysdig 所有的輸出都可以存成一個檔案方便後面閱讀。如果你正在執行一個程式或者遇到一個問題,希望之後再來通過資訊深入挖掘,這個功能就很有幫助。

寫入記錄檔案

語法:

例子:

像tcpdump一樣,sysdig 命令也可以用 CTRL+C 來停止。

讀取記錄檔案

你一旦寫了一個記錄檔案,就需要用 sysdig 讀取這個檔案,這可以通過 -r 標記來完成。

語法:

例子:

按 ASCII 格式輸出

sysdig 預設按照二進位制儲存檔案,但你可以通過使用-A 標記得到 ASCII 格式的輸出。

語法:

例子:

上面的例子把輸出重定位到一個文字檔案。如果你想儲存檔案並在一個沒有安裝 sysdig 的系統上檢查資料,就可以這樣做。

sysdig 過濾器

和 tcpdump 很像,sysdig 命令也有過濾器,可以用來過濾輸出,得到特定的資訊 。你可以通過-l 標記列出所有可用的過濾器。

例子:

過濾器例子

抓取特定的程式

你可以使用“proc.name” 過濾器去抓取特定程式的所有 sysdig 事件。下面的例子中,我過濾了所有名字中包含 sshd 的程式。

例子:

抓取開啟一個特定檔案的所有程式

fd.name這個過濾器用在過濾一個特定檔名的事件。這樣可以看到有哪些程式來讀取或者寫入特定的檔案或 socket。

例子:

抓取開啟一個特定檔案系統的所有程式

你也可以在過濾器中使用比較運算子,例如包含、=、!=、<=、>=、< 和 >。

例子:

從上面這些例子,你可以看出過濾器可以用來讀取檔案或者活動的事件流 。

鑿子

前面我把 sysdig 類比 SystemTap 的原因就在於 鑿子(Chisels)。類似 SystemTap 這類工具都有它自己的指令碼語言,可以用來擴充 SystemTap 的功能。在 sysdig 中,它們叫做鑿子,可以用 LUA 這種常見程式語言來編寫。我個人認為選擇使用 LUA 是一個好點子,這可以讓新手很容易擴充 sysdig。

列出可用的鑿子

可以通過 -cl 標記,列出所有可以使用的鑿子。

例子:

雖然 sysdig 還很新,但這個列表相當長,而且 sysdig 在 GitHub 上,你可以很容易擴充和貢獻自己的鑿子。

顯示鑿子的資訊

列表命令可以讓你大致瞭解每個鑿子,你還可以通過 -i 標記加鑿子名來獲取更詳細的資訊。

例子:

執行鑿子

你可以通過 -c 標記和指定鑿子名,讓 sysdig 來執行這個鑿子。

例子:

帶過濾器執行鑿子

你在執行鑿子時候,仍然可以使用對特定的事件使用過濾器。

抓取一個特定程式的所有網路流量

下面這個例子顯示對 apache2 程式使用 echo_fds 鑿子。

抓取一個特定 IP 的網路流量交換

我們使用 echo_fds 鑿子和fd.cip 過濾器 ,顯示單獨一個 IP 所有的網路流量。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

像 Boss 一樣用 sysdig 來排查問題 像 Boss 一樣用 sysdig 來排查問題

相關文章