用 Sysdig 監控服務器和 Docker 容器

前言

伴隨着容器技術的普及和落地,許多圍繞在容器的開源工具也逐漸獲得關注。新版本 Sysdig 在設計上充分運用了容器技術的成果,這主要體現在兩個方面。一方面是 Sysdig 提供了可以快速運行的 Docker 容器鏡像,這使得用戶能夠很方便地在任何安裝了 Docker 的 Linux 環境中快速使用它進行系統數據的收集和分析。另一方面是 Sysdig 專門提供了容器級別的信息採集命令,支持查看指定容器之間的網絡流量、查看特定容器的 CPU 使用情況。本文介紹 Sysdig 監控 Docker 的方法,對於經常使用容器作爲產品運行方式的用戶,它是這是一款值得使用服務器和容器“故障定位和排除工具”。


簡介

Sysdig 就是 system(系統)+dig(挖掘)的組合。Sysdig 是一個開源系統發掘工具,用於系統級別的勘察和排障,我們也可以把它看作一系列傳統的 unix 系統工具的組合,主要包括:

  • strace:追蹤某個進程產生和接收的系統調用。

  • tcpdump:分析網絡數據,監控原始網絡通信。

  • lsof: list opened files, 列出打開的文件。

  • top:監控系統性能工具。

  • htop :交互式的進程瀏覽器,可以用來替換 top 命令。

  • iftop :主要用來顯示本機網絡流量情況及各相互通信的流量集合。

  • lua:一個小巧的腳本語言。該語言的設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。

另外 Sysdig 的特性之一在於它不僅能分析 linux 系統的“現場”狀態,也能將該狀態保存爲轉儲文件以供離線分析檢查。你也可以自定義 Sysdig 的行爲,通過內建的名爲鑿子(chisel)的小腳本增強其功能。所以 Sysdig 經常被翻譯爲

系統之鍬。通過 Sysdig 工具,用戶能夠很方便地查看到主機上所有應用程序的 cpu、文件 i/o、網絡訪問狀況,這個工具最初的產生就是爲了取代傳統服務器上的一系列系統檢測工具如 strace、tcpdump、htop、iftop、lsof 等。它的 logo 被設計爲一個鏟子的輪廓,寓意着 Sysdig 對系統信息的強大挖掘能力。

結構

Sysdig 的結構非常相似 libpcap/tcpdump/wireshark。Sysdig 的數據處理分成用戶空間和內核空間兩個部分。首先在內核有一個組件叫 sysdig-probe(也可以把它稱爲數據探頭),它通過跟蹤 linux 內核來進行數據抓獲。事件緩衝器(event buffer)用來

把存儲器映射到用戶空間。scap 組件用來進行:捕獲控制和轉儲文件,以及數據的狀態採集。sinsp 組件用來進行事件分析、執行鑿子(chisel),設置過濾和輸出格式化。最後 Sysdig 工具在命令行解析採集的數據。圖 1 是 Sysdig 的工作流程示意圖

圖 1.Sysdig 的工作流程示意圖

sysdig 的工作流程示意圖

最新版本的 Sysdig 還可以用來監控 Docker 容器的運行。一方面是 Sysdig 提供了可以快速運行的 Docker 容器鏡像,這使得用戶能夠很方便地在任何安裝了 Docker 的 Linux 環境中快速使用它進行系統數據的收集和分析。另一方面是 Sysdig 專門提供了容器級別的信息採集命令,支持查看指定容器之間的網絡流量、查看特定容器的 CPU 使用情況等。圖 2 是 Sysdig 監控 Docker 容器的示意圖。

圖 2.Sysdig 監控 Docker 容器的示意圖

Sysdig 監控 Docker 容器的示意圖

軟件包安裝

對於一般的 Linux 發行版,都可以通過下面這個命令直接安裝 Sysdig 工具。

  $ curl -s
https://s3.amazonaws.com/download.draios.com/stable/install-sysdig| sudo bash

這是一個在線的自動安裝工具,是一個 shell 腳本,會識別常用的 linux 發行版本,並根據對應的版本配置源,最後是安裝 Sysdig 包。

對於中國的部分用戶,可能是防火牆的問題不能在線完成安裝。可以分步安裝:

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

第一行命令下載 Draios gpg 密鑰並把它加入 yum 密鑰庫。第二行從 Draios 下載 yum 源文件,並把它放到 /etc/yum.repos.d/ 路徑下。

 #rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public  
 #wget -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo 
 #rpm -i http://mirror.us.leaseweb.net/epel/6/i386/epel-release-6-8.noarch.rpm

Sysdig 工具需要用到內核頭文件包,開始安裝前,需要確認內核頭文件包已安裝上。

 #yum -y install kernel-devel-$(uname -r) 
 #yum -y install sysdig


默認按上面的方法安裝好以後,執行sysdig是會出錯的。提示如下:


# sysdigUnable to load the drivererror opening device /dev/sysdig0. Make sure you have root credentials and that the sysdig-probe module is loaded.

所以執行之前還需要使用/usr/bin/sysdig-probe-loader命令裝載內核模塊,該命令也是一個shell腳本,執行時會從aws s3上下載一個ko模塊文件。不過我在linux測試主機上下載多次都未成功。查看該腳本文件後,發現其調用下載的地址是:https://s3.amazonaws.com/download.draios.com/stable/sysdig-probe-binaries/sysdig-probe-0.6.0-x86_64-2.6.32-504.el6.x86_64-e065a96a1a7343d57e26548de23096e3.ko

注:該ko文件的URL不用記,執行該腳本時會有相應的提示“Trying to download precompiled module from” ,而且不同的內核版本下的對應ko文件也是不同的。我這裏的內核版本是2.6.32-504.el6 。下載完成後會存放在~/.sysdig 目錄。

完成後再執行sysdig-probe-loader命令就可以執行sysdig命令了,而且開機後不會自動加載,所以在不使用的情況下,該包是對主機無影響的。

sysdig 的命令輸出

首先看看 sysdig 的輸出內容,這裏使用 more 分隔符如圖 3

 #sysdig |more
圖 3.Sysdig 的輸出內容

Sysdig 的輸出內容

第一列是事件序號,它是自動增長的;
第二列是發生事件的時間戳;
第三列是 CPU ID;
第四列是命令;
第五列是線程 ID;
第六列是事件方向,比如進入 ioctl 函數爲 >,離開爲 <;
第七列是事件名稱(比如 ioctl);
第八列是事件參數。

說明:像 tcpdump 一樣,Sysdig 命令也可以用 CTRL+C 來強制停止命令行輸出。

Sysdig 的輸出文件的基本操作

Sysdig 語法和 tcpdump 類似,特別是保存和讀取輸出文件的時候。Sysdig 所有的輸出都可以保存成一個文件。

寫入輸出文件:

# sysdig -w <output file>

例如:

# sysdig -w cyq.scap

讀取記錄文件

你一旦寫了一個輸出文件,就需要用 Sysdig 讀取這個文件,這可以通過 -r 參數:

# sysdig -r output file

清單 1 是操作過程和輸出界面。

清單 1. Sysdig 監控 Docker 容器的示意圖
 #sysdig -r cyq.scap
  1 23:44:57.964150879 0 <NA> (7) > switch next=6200(sysdig)
  2 23:44:57.966700100 0 rsyslogd (358) < read res=414 data=<6>
[ 3785.473354] sysdig_probe: starting capture.<6>[ 3785.473523] sysdig_probe:
  3 23:44:57.966707800 0 rsyslogd (358) > gettimeofday
  4 23:44:57.966708216 0 rsyslogd (358) < gettimeofday
  5 23:44:57.966717424 0 rsyslogd (358) > futex addr=13892708 
op=133(FUTEX_PRIVATE_FLAG|FUTEX_WAKE_OP) val=1
  6 23:44:57.966721656 0 rsyslogd (358) < futex res=1
  7 23:44:57.966724081 0 rsyslogd (358) > gettimeofday
  8 23:44:57.966724305 0 rsyslogd (358) < gettimeofday
  9 23:44:57.966726254 0 rsyslogd (358) > gettimeofday
  10 23:44:57.966726456 0 rsyslogd (358) < gettimeofday

按 ASCII 格式輸出

sysdig 默認按照二進制保存文件,但你可以通過使用 -A 標記得到 ASCII 格式的輸出。

 # sysdig -A

例如

 # sysdig -A > /tmp/cjhout.txt 
 # cat /tmp/cjhout.txt 
 1 22:26:15.076829633 0 <NA> (7) > switch next=11920(sysdig)

上面的例子把輸出重定位到一個文本文件。如果你想保存文件並在一個沒有安裝 Sysdig 的系統上檢查數據,就可以這樣做。

Sysdig 的過濾器

Sysdig 過濾器和 tcpdump 很像,Sysdig 命令也有過濾器,可以用來過濾輸出,得到特定的信息 。通過過濾器(可同時應用於實時數據和記錄文件)組合,以獲取更多有用的輸出。

過濾器遵從“類 . 字段”結構。例如:

fd.cip:客戶端 IP 地址。

evt.dir:事件方向,可以是‘ > ’用於進入事件,或‘ < ’用於退出事件。

完整的過濾器列表可以通過以下命令顯示:

 # sysdig -l

使用過濾器例子

抓取特定的進程

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

 # sysdig -r cyq.scap proc.name=docker

Sysdig 中的 chisel(鑿子)

chisel 是用 Lua 語言編寫的腳本,用來分析和處理 Sysdig 產生的事件。 Sysidg 會在下列目錄中查找 chisel:., ./chisels, ~/chisels 和 /usr/share/sysdig/chisels。

首先列出 Sysdig 所有可以使用的 chisel 如圖 4 。

# sysdig -cl

圖 4.Sysdig 的 chisel(鑿子)

圖 3 Sysdig 的 chisel(鑿子)

默認有以下類目可用,各個類目中分佈有多個內建的 chisel。

CPU Usage:CPU 使用量

Errors:錯誤

I/O

Logs:日誌

Misc:混雜

Net:網絡

Performance:性能

Security:安全

System State:系統狀態

如果想查看關於某個 chisel 的詳細信息,可以使用 -i 選項:

要顯示指定 chisel 的信息(包括詳細的命令行用法),運行以下命令:

 # sysdig – i [chisel 名稱 ]

例如,我們可以檢查“CPU”類目下關於 topprocs_cpu 鑿子的信息:

 # sysdig – i topprocs_cpu

你可以通過 -c 標記和指定 chisel,讓 Sysdig 來運行這個 chisel。

例如:

 # sysdig -c topprocs_net

帶過濾器運行 chisel

運行 chisel 時候,可以使用對特定的事件使用過濾器。例如抓取一個特定進程的所有網絡流量

下面這個例子顯示對 sshd 進程使用 echo_fds 鑿子。

 # sysdig -A -c echo_fds proc.name=sshd

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

這裏使用 echo_fds chisel 和 fd.cip 過濾器 ,顯示單獨一個 IP 所有的網絡流量。

 # sysdig -A -c echo_fds fd.cip=192.168.1.11

使用 csysdig

csysdig 就是運 ncurses 庫的用戶界面的 sysdig 軟件包,Ncurses 是一個能提供功能鍵定義 ( 快捷鍵 ), 屏幕繪製以及基於文本終端的圖形互動功能的動態庫。在 sysdig 軟件包裏還提供了一個工具 csysdig,該工具執行後,運行界面和 top 命令類似。csysdig 工作界面如圖 5。

圖 5.csysdig 工作界面

csysdig 工作界面

csysdig 使用如下快捷鍵:

P:暫停屏幕輸出信息

Enter:進入當前突出顯示的條目。

Ctrl+F:列表搜索。

F1- 幫助信息

F2- 顯示視圖選擇器。這將讓你切換到另一個視圖。

F4- 使用過濾器

F5- 查看 IO 輸出信息

F7 顯示幫助頁面當前顯示的視圖。

F8 打開視圖的操作面板。

F9,打開列排序面板。

Q 放棄退出。

Arrows, PgUP, PgDn, Home, End:圖標上下左右的移動控制。

下面看看兩個例子

查看計算機上運行的容器列表及其資源使用情況 如圖 6。

#csysdig -vcontainers

圖 6.查看計算機上運行的容器列表及其資源使用情況

圖 6 查看計算機上運行的容器列表及其資源使用情況

查看容器上下文的進程列表如圖 7 。

#csysdig -pc

圖 7. 查看容器上下文的進程列表

查看容器上下文的進程列表

Sysdig 應用實例

監控交互用戶活動

假定你作爲系統管理員想要監控系統中交互的用戶活動(如,用戶在命令行輸入了什麼命令,以及用戶去了什麼目錄),這時 spy_user 這個鑿子就派上用場了。

 # sysdig  -c spy_users 

 2486 02:43:07 root) ls --color=auto

上面輸出的第一欄表示與指定用戶的活動相關進程的 PID。如果你想要定位一個指定的用戶(例如 root 用戶),以及只監控該用戶的活動又怎麼樣呢?你可以通過用戶名對 spy_users 鑿子的結果進行過濾:

 # sysdig  -c spy_users "user.name=root"
 2486 02:40:56 root) ls --color=auto 
 2486 02:41:00 root) su cjh

監控文件 I/O

我們可以使用“-p”標識來自定義 Sysdig 記錄的輸出格式,並指定雙引號括起來的想要的字段(如用戶名、進程名,以及文件或套接口名稱)。在下面的例子,我們將創建一個記錄文件,該文件將只包含在用戶家目錄中的寫入事件。

點擊查看代碼清單

查看使用硬盤帶寬最多的進程

 #sysdig -c topprocs_file

列出使用大量文件描述符的進程

 #sysdig -c fdcount_by proc.name "fd.type=file"

查看所有的 SQL select 查詢

 #sysdig -s 2000 -A -c echo_fds evt.buffer contains SELECT

監控網絡 I/O

作爲服務器排障的一部分,你可能想要監聽網絡通信對於 Sysdig,可以很容易進行通信嗅探,其風格更爲對用戶友好。

例如,你可以檢查由特定 IP 地址,特定進程(如 sshd)提供的數據(ASCII 編碼格式):

 # sysdig -s 4096 -A -c echo_fds fd.cip=192.168.1.100 -r /mnt/sysdig/debian.scap.gz proc.name=sshd

如果你想要監控原生數據傳輸(二進制格式),請把“-A”替換爲“-X”:

 # sysdig -s 4096 -X -c echo_fds fd.cip=192.168.1.100 -r /mnt/sysdig/debian.scap.gz proc.name=sshd

查看調用某個文件的進程

 #sysdig fd.name=/etc/resolv.conf

性能分析

查看操作文件大於 100ms 的進程

 #sysdig -c fileslower 100

查看大於 1s 的網絡請求

 #sysdig -c netlower 1000

查看 nginx 進程的執行時間

 #sysdig -c procexectime proc.name=nginx

查看 hhvm 大於 1s 的系統調用

 #sysdig -c scallslower 1000 proc.name=hhvm

查看 hhvm 耗時的系統調用

 #sysdig -c topscalls_time proc.name=hhvvm

查看 cpu0 佔用資源最多的進程

 #sysdig -c topprocs_cpu evt.cpu=0

查看佔用流量最大的端口

 #sysdig -c topports_server

查看佔用流量最大的進程

 #sysdig -c topprocs_net

查看 io 最高的文件

 #sysdig -c topfiles_bytes

查看 io 最高的進程

 #sysdig -c topprocs_file

網絡相關操作

查看佔用網絡帶寬最多的進程

 #sysdig -c topprocs_net

查看連接最多的服務器端口

 #sysdig -c fdbytes_by fd.sport

查看某客戶端連接最多的 ip

 #sysdig -c fdbytes_by fd.cip

容器相關的操作

查看容器上下文的進程列表

 #csysdig -pc

查看運行在 cnetos 容器裏 CPU 的使用率

 #sysdig -pc -c topprocs_cpu container.name=cnetos

查看運行在 cnetos 容器裏網絡帶寬的使用率

 #sysdig -pc -c topprocs_net container.name=cnetos

查看在 cnetos 容器裏使用網絡帶寬最多的進程

 #sysdig -pc -c topprocs_net container.name=cnetos

查看在 cnetos 容器裏佔用 I/O 字節最多的文件

#sysdig -pc -c topfiles_bytes container.name=cnetos

查看在 cnetos 容器裏網絡連接的排名情況

 #sysdig -pc -c topconns container.name=cnetos

顯示 cnetos 容器裏所有命令執行的情況

 #sysdig -pc -c spy_users container.name=cnetos

HTTP 抓包分析

查看所有的 http 請求

 #sysdig -c httplog

查看 http url top 統計

 #sysdig -c httptop

查看 8080 端口 post 的請求

 #sysdig -A -c echo_fds fd.port=8080 and evt.buffer contains POST

查看 nginx 進程的 accept 鏈接

 #sysdig proc.name=nginx and evt.type=accept

總結

這些示例僅僅是展示了 Sysdig 能力的冰山一角,在目前的其他系統監控類工具中,筆者還沒有看到像 Sysdig 這樣功能如此強大、而又對容器支持這樣好的。所以,對於經常使用服務器特別是 Docker 容器作爲產品運行方式的用戶,這是一款值得使用的系統工具。

參考資料

學習

  • 訪問 sysdig 官方網址 http://www.sysdig.org/ ,可以查看更多關於 sysdig 操作的信息。

  • 訪問 Sysdig 命令手冊頁,獲取 sysdig 命令行詳細參數。

  • 訪問 Docker 容器系列文章 Docker 容器系列文章,其中包括使用 sysdig 監控 Docker 容器的一些例子。

  • 訪問 developerWorks Linux 專區,瞭解關於信息管理的更多信息,獲取技術文檔、how-to 文章、培訓、下載、產品信息以及其他資源。

討論

  • 加入 developerWorks 中文社區。查看開發人員推動的博客、論壇、組和維基,並與其他 developerWorks 用戶交流。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章