sysdig案例分析 - 用fdbytes_by chisel來分析磁盤I/O活動

sysdig's chisels 是內置的腳本,供使用者來追蹤系統調用或者查看系統的性能瓶頸,它是用強大而且高效的腳本語言Lua寫的。

今天來分享一下fdbytes_by的用法,該案例可以探測到系統的那個文件的I/O佔用最高(不光是file,還可以是network I/O),而且可以查到哪個進程在讀寫該文件,並且可以查看到內核級的I/O活動明細。應用場景可以觀察一下你的文件系統是否是在高效運轉,或者調查一個磁盤I/O延遲的故障。配合dstat --top-io可以更容易定位到進程名字,但是今天介紹的主要是sysdig的fdbytes_by chisel用法,可以想象成沒有dstat工具可用的場景下。


首先我們先來看一下今天的主角fdbytes_by的用法明細:

# sysdig -i fdbytes_by 
Category: I/O
-------------
fdbytes_by      I/O bytes, aggregated by an arbitrary filter field
Groups FD activity based on the given filter field, and returns the key that ge
nerated the most input+output bytes. For example, this script can be used to li
st the processes or TCP ports that generated most traffic.
Args:
[string] key - The filter field used for grouping

答題意思是以文件描述符的各種活動所產生的IO大小來進行排序。


首先我們來抓取30M的sysdig包來用分析使用。


sysdig -w fdbytes_by.scap -C 30


然後我們來分析這次抓包沒個文件描述符對文件系統的I/O活動:


# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.type
Bytes               fd.type             
--------------------------------------------------------------------------------
45.16M              file
9.30M               ipv4
87.55KB             unix
316B                <NA>
60B                 pipe


可以看到file佔用的45.16M,是最大的FD,然後我們來看一下按目錄的I/O活動來排序:


# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.directory
Bytes               fd.directory        
--------------------------------------------------------------------------------
38.42M              /etc
7.59M               /
5.04M               /var/www/html
1.38M               /var/log/nginx
304.73KB            /root/.zsh_history/root
7.31KB              /lib/x86_64-linux-gnu
2.82KB              /dev
2.76KB              /dev/pts
1.62KB              /usr/lib/x86_64-linux-gnu


發現訪問最多的是/etc目錄,那我們看一下,具體訪問的是哪個文件呢?


# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.name fd.directory=/etc
Bytes               fd.name             
--------------------------------------------------------------------------------
38.42M              /etc/services

Bingo!找到了,原來是/etc/services被訪問的最多,因爲services是系統文件,所以可以判斷肯定是read的操作達到了38.42M,那我們來看一下哪個進程訪問的此文件呢?

# sysdig -r fdbytes_by.scap0 -c fdbytes_by proc.name "fd.filename=services and fd.directory=/etc"
Bytes               proc.name           
--------------------------------------------------------------------------------
38.42M              nscd


找到元兇了,原來是nscd緩存程序,那他爲什麼會讀取這麼多次的services文件呢?在繼續看:

# sysdig -r fdbytes_by.scap0 -A -s 4096 -c echo_fds proc.name=nscd 
------ Read 12B from   ffff880009dc6900->ffff880009dc6180 /var/run/nscd/socket (nscd)
------ Read 6B from   ffff880009dc6900->ffff880009dc6180 /var/run/nscd/socket (nscd)
hosts
------ Write 14B to   ffff880009dc6900->ffff880009dc6180 /var/run/nscd/socket (nscd)
hostsO
------ Read 12B from   ffff880009dc6900->ffff880009dc6180 /var/run/nscd/socket (nscd)
------ Read 7B from   ffff880009dc6900->ffff880009dc6180 /var/run/nscd/socket (nscd)
28060/
------ Read 4.00KB from   /etc/services (nscd)
# Network services, Internet style
#
# Note that it is presently the policy of I
------ Read 4.00KB from   /etc/services (nscd)
# IPX
ipx213/udp
imap3220/tcp# Interactive Mail Access
imap3220/udp
------ Read 4.00KB from   /etc/services (nscd)
nessus1241/tcp# Nessus vulnerability
nessus1241/udp#  assessment scann
------ Read 4.00KB from   /etc/services (nscd)
qmaster6444/tcpsge_qmaster# Grid Engine Qmaster Service
sge-qmaster6444/udp
------ Read 3.10KB from   /etc/services (nscd)

原來是nscd在讀取services中定義的端口跟服務名稱之間的關係,我在抓包的過程中是運行了ab做nginx的靜態頁面壓力測試,本來希望看到的是nginx的讀寫會很高,沒想到中途出現了這個nscd來搗亂:

ab -k -c 2000 -n 300000 
http://shanker.heyoa.com/index.html
# sysdig -r fdbytes_by.scap0 -c topprocs_file 
Bytes               Process             PID                 
--------------------------------------------------------------------------------
38.42M              nscd                1343
6.43M               nginx               4804
304.89KB            zsh                 32402
9.20KB              ab                  20774
2.79KB              screen              18338
2.37KB              sshd                12812


後來我分別測試了一下開啓nscd的情況下ab的測試時間,和不開nscd做緩存的情況下,確實開啓nscd做本地services的緩存會提高10.189%。

ab -k -c 2000 -n 300000 http://shanker.heyoa.com/index.html  0.94s user 2.77s system 9% cpu 38.561 total
ab -k -c 2000 -n 300000 http://shanker.heyoa.com/index.html  0.93s user 2.79s system 10% cpu 34.632 total


nscd緩存加速可以參考之前的這篇文章

http://shanker.blog.51cto.com/1189689/1735058


至此,整個分析就結束了,本文只是一個例子,跟大家分享如何使用chisel的fdbytes_by,sysdig還提供了很多chisel共大家分析系統。


歡迎補充!

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