Linux诊断神器—sysdig工具

 2018年6月27日 16:24   Nick王   运维    0 评论   251 浏览 

操作系统版本:7.4.1708
内核版本:3.10.0-693.2.2.el7.x86_64

AA

安装sysdig

安装sysdig之前要先安装和当前内核版本一致的kernel-devel-$(uname -r)

参考文档: https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source

下载地址: http://vault.centos.org/7.4.1708/updates/x86_64/Packages/

在Docker 容器内部安装sysdig:

docker pull sysdig/sysdig

docker run -i -t --name sysdig --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro sysdig/sysdig

基本用法

最简单的使用sysdig的方法是不带任何参数的调用它。这样做会导致sysdig捕获每一个事件并写入到标准输出。

# sysdig
10 07:18:51.842298543 2 <NA> (0) > switch next=19651(mysqld) pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
11 07:18:51.842304120 2 mysqld (19651) < futex res=-110(ETIMEDOUT)
13 07:18:51.842311949 2 mysqld (19651) > futex addr=3501648 op=129(FUTEX_PRIVATE_FLAG|FUTEX_WAKE) val=1
14 07:18:51.842313391 2 mysqld (19651) < futex res=0
15 07:18:51.842315826 1 sysdig (30620) > switch next=0 pgft_maj=0 pgft_min=1425 vm_size=106208 vm_rss=5148 vm_swap=0
16 07:18:51.842426750 2 mysqld (19651) > futex addr=3501674 op=393(FUTEX_CLOCK_REALTIME|FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET) val=1561649
17 07:18:51.842432204 2 mysqld (19651) > switch next=0 pgft_maj=0 pgft_min=3 vm_size=3546020 vm_rss=383964 vm_swap=0

默认情况下,每一行表示一个event,每个event的格式如下:

*%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args
  • evt.num: 表示event序号,是自动增长的

  • evt.time: event的时间戳

  • evt.cpu: 捕获event的CPU编号

  • proc.name: 生成event的进程的名称

  • thread.tid: 生成event的TID(线程ID),对应于单线程的进程的PID

  • evt.dir: event方向,> 进入event , < 退出event

  • evt.type: event名称,比如 open 或者 read

  • evt.args: event参数列表

该输出看起来跟strace相似,但是有以下关键性的区别:

  • 对于大多数的系统调用,sysdig会有两条分开的信息:一条是> 另一条是< 。这使得在多进程的环境中更加容易的追踪输出。

  • 文件描述符已经被解析。这意味着,在可能的情况下,在FD后面会跟着一个人类可读的FD本身的表示:比如网络连接的元组,或者文件名等等。用于呈现FD的确切的格式为num(<type>resolved_string);其中:

    • num 表示FD号

    • resolved_string 表示解析后的FD,比如: 127.0.0.1:40370->127.0.0.1:80

    • type 是一个单字符,表示FD类型,可以是下面其中之一:

      • f 表示文件

      • 4 表示IPv4

      • 6 表示IPv6

      • u 表示Unix Socket

      • s 表示信号FD

      • e 表示event

      • i 表示inotify

      • t 表示timer

当然sysdig的强大不止于此。

FD文件描述符

先来看一组sysdig的输出:

1 01:40:19.601363716 1 httpd (7513) > accept
2 01:40:19.601374197 1 httpd (7513) < accept fd=14(<4t>127.0.0.1:39175->127.0.0.1:80) tuple=127.0.0.1:39175->127.0.0.1:80 queuepct=0
3 01:40:19.601506564 1 httpd (7513) > read fd=14(<4t>127.0.0.1:39175->127.0.0.1:80) size=8000

可以看到上面event的参数中有fd

如果线程ID(TID)表示执行流程,那么文件描述符(FD)则表示I/O流程。

在Unix中很多东西都会被抽象成为一个文件,包括:

  • 文件

  • 网络连接(sockets)

  • 标准输入, 标准输出, 标准错误

  • pipes

  • timers

  • 信号

进程内的FD是唯一的。这意味着你可以看到很多相同的FD,但是这些必须是在不同的进程中。

通过遵循PID/FD的组合,可以很轻松的追踪到特定的I/O,比如使用如下过滤器:

sysdig proc.name=httpd and fd.num=14

sysdig也可以将FD编号解析为人类可读的字符串。比如<4t>127.0.0.1:39175->127.0.0.1:80,这些都可以使用过滤器来进行过滤:

sysdig fd.type=ipv4
sysdig fd.l4proto=tcp
sysdig fd.sip=127.0.0.1
sysdig fd.sport=39157

Events

sysdig捕获和显示的大部分事件都是系统调用事件。与strace不同的是,sysdig不会镜像系统调用的精确用法。

如果想知道任何事件的参数,请使用如下命令:

sysdig -L

Switch Event

当存在上下文切换的时候,也就是说进程调度器让进程进入休眠状态,而去执行另一个进程的时候就会生成switch event

注意,switch并不是一个系统调用,所以你不会找到关于它的手册。它也是少数没有退出事件的sysdig事件之一。

如果你不想在输出结果中看到switch event,那么你可以使用如下过滤器:

sysdig evt.type!=switch

常用参数

  • -A --print-ascii: 把 buffer 中数据按照 ASCII 格式打印,方便用户阅读

  • -x --print-hex: 把 buffer 中数据按照十六进制格式打印

  • -X --print-hex-ascii: 把 buffer 中数据同时按照 ASCII 格式和十六进制格式打印

  • -s 1024: 捕获 buffer 的数据大小,默认为 80,如果这个值设置的过大,会产生很大的文件

  • -N: 不用把端口号转换成可读的名字,这个参数会提高处理的效率

  • -c --chisel: 指定chisel工具

  • -C: 指定文件大小

  • -cl: 列出所有可用的chisel

  • -e: 指定event的数量

  • -G: 指定多少时间之后,跳出捕获。单位是s

  • -i chiselname, --chisel-info=chiselname: 获取某个chisel的详细的描述

  • -k, --k8s-api: 指定连接的k8s的ApiServer

  • -K btfile | certfile:keyfile[#password][:cacertfile], --k8s-api-cert=btfile | certfile:keyfile[#password][:cacertfile]: k8s验证相关

  • -L, --list-events: 列出所有支持的event

  • -l, --list: 列出可用于过滤和输出格式的字段。

  • -lv: 获取每个可以用于过滤和输出格式的字段的其他信息。

  • -n num, --numevents=num: 指定的事件数量之后,停止捕获。

  • -p outputformat, --print=outputformat: 输出格式化

  • -r readfile, --read=readfile: 从文件中读取event

  • -S, --summary: 当捕获完成,打印事件概要。

  • -w writefile, --write=writefile: 保存事件到文件中。

  • -W num: 保存文件的个数。

  • -pc -pcontainer: 可以对容器进行友好的格式化输出。

  • -pk -pkubernetes: 可以对Kubernetes进行友好的格式化输出。

  • -pp: 打印默认的命令行格式并退出。


保存到文件

sysdig允许将捕获结果存储到本地磁盘,以便于后续进行分析:

$ sysdig –w myfile.scap

限制事件的数量并保存:

$ sysdig –n 100 –w myfile.scap

限制文件的大小并保存,下面表示生成1MB的文件:

sudo sysdig -C 1 -w dump.scap

限制文件大小和数量并进行保存,比如下面表示生成1MB的文件,生成5个文件:

sudo sysdig -C 1 -W 5 -w dump.scap

以时间返回进行捕获并保存,下面表示捕获1分钟内的事件到一个文件,总共生成5个文件,也就是捕获5分钟:

sudo sysdig -G 60 -W 5 -w dump.scap

保存1000个事件到一个文件,保存5个文件:

sudo sysdig -e 1000 -W 5 -w dump.scap

24小时在容器内执行的命令:

sudo sysdig -G 86400 -W 1 -w dump.scap evt.type=execve or evt.type=clone and container.name=mycontainer

捕获日志10分钟的输出:

sudo sysdig -G 600 -W 1 -w dump.scap evt.is_io_write=true and fd.name contains mylogfile

读取以前保存的文件:

$ sysdig –r myfile.scap

过滤器

sysdig的过滤器用来过滤指定的内容,跟tcpdump的用法类似。过滤器是在命令行的末尾指定的。

过滤器的语法格式为:class.field

查看所有的过滤器的列表:

# sysdig -l

----------------------
Field Class: fd

fd.num          文件描述符号码
fd.type         FD类型。可以是'file', 'directory', 'ipv4', 'ipv6', 'unix', 'pipe', 'event', 'signalfd', 'eventpoll', 'inotify' 'signalfd'
fd.typechar     FD类型,用单个字符表示。'f'表示file, 4表示IPv4 socket, 6表示IPv6 socket, 'u'表示unix socket, p表示pipe, 'e'表示eventfd, 's'表示signalfd, 'l'表示eventpoll, 'i'表示inotify, 'o'表示unknown.
fd.name         FD全名称。如果fd是一个文件,那么该字段的内容表示全路径。如果fd是一个socket,那么该字段表示一个连接的元组。
fd.directory    如果fd是文件,那么该字段表示文件路径
fd.filename     如果fd是文件,那么该字段表示文件名
fd.ip           匹配fd中的ip地址,不管是客户端还是服务端
fd.cip          客户端IP
fd.sip          服务端IP
fd.lip          本地IP
fd.rip          远端IP
fd.port         匹配fd中的端口
fd.cport        客户端端口
fd.sport        服务端端口
fd.lport        本地端口
fd.rport        远端端口
fd.l4proto      匹配IP层的协议。可以是'tcp', 'udp', 'icmp', 'raw'.
fd.sockfamily   Socket类型,可以是'ip', 'unix'.
fd.is_server    如果拥有该FD的进程是连接的服务端,则为'true'
fd.uid          a unique identifier for the FD, created by chaining the FD number and the thread ID.
fd.containername  和FD关联的容器的名称。当尝试识别FD属于哪个容器的时候是非常有用的。
fd.containerdirectory    当识别目录是哪个容器的时候非常有用。
fd.proto        匹配FD的协议
fd.cproto       客户端协议
fd.sproto       服务端协议
fd.lproto       本地协议
fd.rproto       远程协议
fd.net          匹配IP网络
fd.cnet         客户端IP网络
fd.snet         服务端IP网络
fd.lnet         本地IP网络
fd.rnet         远端IP网络
fd.connected    对于TCP/UDP,如果socket已经连接,那么为true
fd.name_changed 如果事件更改此事件使用的fd的名称,则为true。

----------------------
Field Class: process

proc.pid        生成事件的进程ID
proc.exe        命令行参数的第一个,通常是可执行的名称
proc.name       生成事件的可执行程序的名称
proc.args       传递的参数
proc.env        进程生成事件的环境变量
proc.cmdline    完整的命令行。proc.name + proc.args.
proc.exeline    proc.exe + proc.args.
proc.cwd        事件当前的工作目录
proc.nthreads   线程数,包含主线程
proc.nchilds    线程数,不包含主线程
proc.ppid       生成事件的进程的父进程ID
proc.pname      生成事件的进程的父进程名称
proc.pcmdline   生成事件的进程的父进程的完整的命令行(proc.name + proc.args)
proc.apid       进程祖先ID。通俗的说,proc.apid[0]表示当前进程,proc.apid[1]表示父进程,proc.apid[2]表示父进程的父进程。
proc.aname      同上
proc.loginshellid  该字段可用于分离不同的用户会话
proc.duration   自进程开始以来的纳秒数
proc.fdopencount  进程打开的文件描述符的数量
proc.fdlimit    进程可以打开最大文件描述符数量
proc.fdusage    进程打开的文件描述符和最大可以打开的文件描述符的比例
proc.vmsize     进程总的虚拟进程,单位是kb
proc.vmrss      常驻(不含交换内存)内存
proc.vmswap     交换内存
thread.pfmajor  自线程启动,主要页面错误数
thread.pfminor  自线程启动,次要页面错误数
thread.tid      生成事件的线程ID
thread.ismain   是否是主线程。
thread.exectime  上次调度线程所花费的CPU时间
thread.totexectime  
thread.cgroups  线程所属的cgroups,聚合为一个字符串
thread.cgroup   该线程所属的cgroup,用于特定的子系统。比如:thread.cgroup.cpuacct.
thread.vtid     
proc.vpid       
thread.cpu      线程在最近1秒消耗的CPU
thread.cpu.user 线程在最近1秒消耗的用户CPU
thread.cpu.system
thread.vmsize   
thread.vmrss    
proc.sid        生成事件的进程的session ID
proc.sname      
proc.tty        进程的控制终端
proc.exepath    进程完整的可执行路径
proc.vpgid      

----------------------
Field Class: evt

evt.num         事件号
evt.time        包含纳秒的 一个时间戳字符串
evt.time.s      不包含纳秒的一个时间戳字符串
evt.datetime    包含日期的一个时间戳字符串
evt.rawtime     一个新纪元的时间戳
evt.rawtime.s   
evt.rawtime.ns  
evt.reltime     从捕获开始,的纳秒数
evt.reltime.s   从捕获开始,的秒数
evt.reltime.ns  
evt.latency     
evt.latency.s   
evt.latency.ns  
evt.latency.human
evt.deltatime   该事件与上一个事件之间的增量,纳秒级
evt.deltatime.s 该事件与上一个事件之间的增量,整数部分
evt.deltatime.ns  该事件与上一个事件之间的增量,小数部分
evt.outputtime  
evt.dir         事件方向; ">"是进入事件  "<"是退出事件
evt.type        事件名称,比如 'open'
evt.type.is     允许指定事件类型,并未该类型的事件返回1。例如 'evt.type.is.open'针对于'open'事件会返回1, 其他都返回0
syscall.type    针对于系统调用事件,返回系统调用的名称。比如'open';取消其他事件,比如'switch'或者是sysdig内部的事件;如果要确保过滤的内容是系统调用,应该使用该字段,而不是'evt.type'
evt.category    事件类型。比如'file','net','memory'
evt.cpu         发生事件所在的CPU
evt.args        所有的事件参数,聚合成一个字符串。
evt.arg         通过名称或者是序号指定的事件的参数之一。
evt.rawarg      通过名称指定的一个事件参数,比如 'evt.rawarg.fd'.
evt.info        对于大多数事件,该字段返回与'evt.args'相同的值。
evt.buffer      
evt.buflen      事件的二进制缓冲区的长度
evt.res         事件返回的值,是一个字符串
evt.rawres      事件返回的值,是一个数字
evt.failed      如果事件返回一个错误,那么为'true'
evt.is_io       如果事件 读或者写FD,比如```read() send recvfrom()```,那么结果为'true'
evt.is_io_read  如果事件 只读FD,比如```read() recv() recvfrom()```,那么结果为'true'
evt.is_io_write 如果事件 只写FD,比如```write() send()```,那么结果为'true'
evt.io_dir      事件的IO行为,如果为'r'那么表示读,如果为'w'那么表示写
evt.is_wait     线程等待事件,那么为'true', 比如 sleep(), select(), poll().
evt.wait_latency  线程等待事件返回的时间
evt.is_syslog   线程写入到/dev/log
evt.count       计算事件个数
evt.count.error 
evt.count.error.file
evt.count.error.net
evt.count.error.memory
evt.count.error.other
evt.count.exit  
evt.around      如果事件在指定的时间间隔,那么返回该事件
evt.abspath     
evt.is_open_read
evt.is_open_write

----------------------
Field Class: user

user.uid        用户ID
user.name       用户名称
user.homedir    用户家目录
user.shell      用户shell

----------------------
Field Class: group

group.gid       组ID
group.name      组名称

----------------------
Field Class: syslog

syslog.facility.str  设备字符串
syslog.facility  设备号(0~23)
syslog.severity.str  级别,用字符串表示,可以是 emerg, alert, crit, err, warn, notice, info, debug
syslog.severity 级别,用数字表示(0~7)
syslog.message  发送给syslog的信息

----------------------
Field Class: container

container.id    容器ID
container.name  容器名称
container.image 容器镜像名称
container.image.id  容器镜像ID
container.type  容器类型,比如 docker or rkt
container.privileged  容器运行在特权模式,则为'true'
container.mounts  一个空格分割的挂在列表
container.mount  通过制定一个序号,获得单个挂在信息。比如container.mount[0], 或者是制定挂载源,比如container.mount[/usr/local]
container.mount.source
container.mount.dest
container.mount.mode
container.mount.rdwr
container.mount.propagation

----------------------
Field Class: fdlist

fdlist.nums     for poll events, this is a comma-separated list of the FD numbe
                rs in the 'fds' argument, returned as a string.
fdlist.names    for poll events, this is a comma-separated list of the FD names
                 in the 'fds' argument, returned as a string.
fdlist.cips     for poll events, this is a comma-separated list of the client I
                P addresses in the 'fds' argument, returned as a string.
fdlist.sips     for poll events, this is a comma-separated list of the server I
                P addresses in the 'fds' argument, returned as a string.
fdlist.cports   for TCP/UDP FDs, for poll events, this is a comma-separated lis
                t of the client TCP/UDP ports in the 'fds' argument, returned a
                s a string.
fdlist.sports   for poll events, this is a comma-separated list of the server T
                CP/UDP ports in the 'fds' argument, returned as a string.

----------------------
Field Class: k8s

k8s.pod.name    Kubernetes pod name.
k8s.pod.id      Kubernetes pod id.
k8s.pod.label   Kubernetes pod label. E.g. 'k8s.pod.label.foo'.
k8s.pod.labels  逗号分割的key/value labels. E.g. 'foo1:bar1,foo2:bar2'.
k8s.rc.name     Kubernetes replication controller name.
k8s.rc.id       Kubernetes replication controller id.
k8s.rc.label    Kubernetes replication controller label. E.g. 'k8s.rc.label.foo'.
k8s.rc.labels   逗号分割的 key/value labels. E.g. 'foo1:bar1,foo2:bar2'.
k8s.svc.name    Kubernetes service name
k8s.svc.id      Kubernetes service id
k8s.svc.label   Kubernetes service label. E.g. 'k8s.svc.label.foo'
k8s.svc.labels  逗号分割的 key/value labels. E.g. 'foo1:bar1,foo2:bar2'.
k8s.ns.name     Kubernetes namespace name.
k8s.ns.id       Kubernetes namespace id.
k8s.ns.label    Kubernetes namespace label. E.g. 'k8s.ns.label.foo'.
k8s.ns.labels   逗号分割的 key/value labels. E.g. 'foo1:bar1,foo2:bar2'.
k8s.rs.name     Kubernetes replica set name.
k8s.rs.id       Kubernetes replica set id.
k8s.rs.label    Kubernetes replica set label. E.g. 'k8s.rs.label.foo'.
k8s.rs.labels   逗号分割的 key/value labels. E.g. 'foo1:bar1,foo2:bar2'.
k8s.deployment.name  Kubernetes deployment name.
k8s.deployment.id  Kubernetes deployment id.
k8s.deployment.label  Kubernetes deployment label. E.g. 'k8s.rs.label.foo'.
k8s.deployment.labels  逗号分割的key/value labels. E.g. 'foo1:bar1,foo2:bar2'.

----------------------
Field Class: mesos

省略

----------------------
Field Class: span

省略

----------------------
Field Class: evtin

省略

例如,可以来过滤指定的命令,比如cat

# sysdig proc.name=cat
249088 11:25:39.387502169 3 cat (18378) < execve res=0 exe=cat args=/etc/zabbix/scripts/file_point.conf. tid=18378(cat) pid=18378(cat) ptid=18377(python) cwd= fdlimit=1024 pgft_maj=0 pgft_min=411 vm_size=336 vm_rss=4 vm_swap=0 comm=cat cgroups=cpuset=/.cpu_cgroup=/system.slice/zabbix-agent.service.cpuacct=/system.slice/... env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin._=/usr/bin/cat.CONFFIL... tty=0 pgid=18377(python)

可以发现,sysdig不会附加到进程上。它只是捕捉一些东西,然后你过滤出你想要的东西。

过滤器可以使用比较运算符(=, !=, <, >, <=, >=),还可以使用布尔运算符(and, or, not)。

捕捉catvi:

$ sysdig proc.name=cat or proc.name=vi

显示所有不是由cat打开的文件:

sysdig proc.name!=cat and evt.type=open

查看由Apache接收的网络连接:

$ sysdig evt.type=accept and proc.name!=apache

每个事件都有类型(比如,open read)和一组参数(比如,fd name)。任何事件的任何参数都可以用在过滤器中。比如,下面是查看用户在交互式bash上执行的命令:

$ sysdig evt.type=execve and evt.arg.ptid=bash

该命令会过滤系统调用为execve的事件,但是仅仅是父进程是bash的才会被过滤出来。

evt.arg和event.rawarg的区别

evt.arg和event.rawarg之间的区别在于第二个不会执行PID,FD,错误代码等的解析,并将参数保留为其原始数字形式。

过滤指定的错误码:

$ sysdig evt.arg.res=ENOENT

或者是过滤返回码为负数的,因为只要是负数就是错误的:

$ sysdig " evt.rawarg.res<0 or evt.rawarg.fd<0"

获取所有的事件列表以及其参数

说明:在下面的事件列表中,">"表示进入事件,"<"表示退出事件

# sysdig -L
> syscall(SYSCALLID ID, UINT16 nativeID)
< syscall(SYSCALLID ID)
> open()
< open(FD fd, FSPATH name, FLAGS32 flags, UINT32 mode)
> close(FD fd)
< close(ERRNO res)
> read(FD fd, UINT32 size)
……省略……

输出格式化

sysdig可以定制化输出内容,使用-p参数,语法跟C语言的语法类似,比如:

$ sysdig -p"user:%user.name dir:%evt.arg.path" evt.type=chdir
user:ubuntu dir:/root
user:ubuntu dir:/root/tmp
user:ubuntu dir:/root/Download

说明:当用户执行cd命令的时候会调用chdir过滤器,并且打印用户名和所在的目录。

$ sysdig -p"%evt.type %evt.dir %evt.arg.name" evt.type=open
open < /proc/1285/task/1399/stat
open < /proc/1285/task/1400/io
open < /proc/1285/task/1400/statm

下面是一些栗子:

$ sysdig -p"%user.name) %proc.name %proc.args" evt.type=execve and evt.arg.ptid=bash
$ sysdig -p"%user.name) %evt.arg.path" "evt.type=chdir"
$ sysdig -p"user:%user.name process:%proc.name file:%fd.name" "evt.type=write and fd.name contains /etc/"
$ sysdig -p"%fd.name" "proc.name=apache and evt.type=accept"

Chisels实用的工具箱

sysdig的chisels是非常有用的工具,用来分析sysdig事件流。chisels可以用来实时分析,也可以用于离线分析。

使用如下命令列出,所有可以使用的chisels:

# sysdig -cl

Category: Application
---------------------
……省略……

Category: CPU Usage
-------------------
……省略……

Category: Errors
----------------
……省略……

Category: I/O
-------------
……省略……

Category: Logs
--------------
……省略……

Category: Misc
--------------
……省略……

Category: Net
-------------
……省略……

Category: Performance
---------------------
……省略……

Category: Security
------------------
……省略……

Category: System State
----------------------
……省略……

使用如下命令来获取详细的chisel的详细的信息:

# sysdig -i lsof

Category: System State
----------------------
lsof            List (and optionally filter) the open file descriptors.

This chisel prints the open file descriptors for every process in the system, w
ith an output that is similar to the one of lsof. Output is at a point in time;
 adjust this in the filter.  It defaults to time of evt.num=0
Args:
[filter] filter - A sysdig-like filter expression that allows r
                estricting the FD list. E.g. 'proc.name=foo and fd.name contain
                s /etc'.

使用如下命令来执行chisel:

# sysdig -c ps
TID     PID     USER        VIRT       RES        FDLIMIT   CMD
1       1       root        186.53M    3.55M      65536     systemd
359     359     root        176.25M    92.80M     429496729 systemd-journal
395     395     root        42.74M     1.63M      429496729 systemd-udevd
416     416     root        54.15M     1.05M      429496729 auditd
……省略……

如果chisel需要参数,那么只需要在后面跟上参数即可:

$ sysdig –c spy_ip 192.168.1.157

chisel可以和过滤器结合,这样会更有用。

查看机器上访问最多的文件:

# sysdig -c topfiles_bytes
Bytes               Filename
--------------------------------------------------------------------------------
3.08KB              /proc/12083/stat
720B                /proc/net/dev
388B                /proc/1/stat
52B                 /proc/loadavg
32B                 /dev/urandom

假设我们对访问/dev的不感兴趣,那么可以这样使用:

# sysdig -c topfiles_bytes "not fd.name contains /dev"
Bytes               Filename
--------------------------------------------------------------------------------
Bytes               Filename
--------------------------------------------------------------------------------
3.85KB              /proc/12083/stat
1.39KB              /proc/stat
350B                /proc/32226/stat
24B                 /proc/uptime

或者我们也可以查看我们感兴趣的东西:

$ sysdig -c topfiles_bytes "fd.name contains /root"
Bytes     Filename
------------------------------
1.29KB    /root/agent/build/debug/test/index.html.93
1.10KB    /root/.dropbox/PENDING_aWX7WU
1.10KB    /root/.dropbox/UPDATED_UsxrsX
16B       /root/.dropbox/filecache.dbx

或者我们只想知道被某个应用程序访问的文件:

$ sysdig -c topfiles_bytes "proc.name=vi"  
Bytes     Filename
------------------------------
4.00KB    /root/agent/build/debug/test/.lo.txt.swp  
3.36KB    /usr/share/terminfo/x/xterm-256color  
2.18KB    /etc/passwd  
1.98KB    /root/agent/build/debug/test/lo.txt  
1.92KB    /etc/virc  
1.66KB    /etc/nsswitch.conf  
832B      /lib64/libpcre.so.1  
832B      /lib64/libc.so.6  
832B      /lib64/libnss_files.so.2

或者可以指定一个用户:

$ sysdig -c topfiles_bytes "user.name=loris"  
Bytes     Filename
------------------------------
3.31KB    /etc/nsswitch.conf  
2.18KB    /etc/passwd  
1.62KB    /lib64/libselinux.so.1  
1.62KB    /lib64/libc.so.6  
1.62KB    /lib64/libpcre.so.1  
1.62KB    /lib64/libdl.so.2  
1.62KB    /lib64/libnss_files.so.2  
898B      /etc/group  
54B       /proc/self/task/30414/attr/current

你也可以同时运行多个chisel:

$ sysdig -c stdin -c stdout proc.name=cat

sysdig使用案例

根据网络带宽使用来查看顶级进程

sysdig -c topprocs_net

显示与主机192.168.0.1交换的网络数据, 二进制形式:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1

显示与主机192.168.0.1交换的网络数据, ASCII形式:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1

针对本地服务端口,统计建立的连接数:

sysdig -c fdcount_by fd.sport "evt.type=accept"

针对本地服务端口,统计字节数:

sysdig -c fdbytes_by fd.sport

针对客户端IP,建立的链接:

sysdig -c fdcount_by fd.cip "evt.type=accept"

针对客户端IP,字节数:

sysdig -c fdbytes_by fd.cip

列出所有未经apache服务的传入连接:

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"

查看机器上运行的容器列表及其资源使用情况:

sudo csysdig -vcontainers

查看容器上下文的进程列表:

sudo csysdig -pc

查看在wordpress1容器内运行的进程的CPU使用情况:

sudo sysdig -pc -c topprocs_cpu container.name=wordpress1

查看在wordpress1容器内运行的进程的网络带宽使用情况:

sudo sysdig -pc -c topprocs_net container.name=wordpress1

使用wordpress1容器内的大多数网络带宽查看进程:

sudo sysdig -pc -c topprocs_net container.name=wordpress1

按照wordpress1容器内的I / O字节查看顶级文件:

sudo sysdig -pc -c topfiles_bytes container.name=wordpress1

查看wordpress1容器中的顶级网络连接:

sudo sysdig -pc -c topconns container.name=wordpress1

显示在wordpress1容器内执行的所有交互式命令:

sudo sysdig -pc -c spy_users container.name=wordpress1

查看本机所做的所有GET HTTP请求:

sudo sysdig -s 2000 -A -c echo_fds fd.port=80 and evt.buffer contains GET

查看机器所做的所有SQL select查询:

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

查看通过apache发送到实时发生的外部MySQL服务器的查询:

sysdig -s 2000 -A -c echo_fds fd.sip=192.168.30.5 and proc.name=apache2 and evt.buffer contains SELECT

根据磁盘带宽使用情况查看顶级进程:

sysdig -c topprocs_file

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

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

按照读取+写入字节查看顶部文件:

sysdig -c topfiles_bytes

打印Apache正在读取或写入的顶级文件:

sysdig -c topfiles_bytes proc.name=httpd

按照R + W磁盘活动查看顶级目录:

sysdig -c fdbytes_by fd.directory "fd.type=file"

查看/tmp目录中R + W磁盘活动的顶级文件:

sysdig -c fdbytes_by fd.filename "fd.directory=/tmp/"

观察所有名为'passwd'的文件的I / O活动:

sysdig -A -c echo_fds "fd.filename=passwd"

按FD类型显示I / O活动:

sysdig -c fdbytes_by fd.type

根据CPU使用情况查看顶级进程:

sysdig -c topprocs_cpu

观察进程的标准输出:

sysdig -s4096 -A -c stdout proc.name=cat

查看消耗时间最多的文件:

sysdig -c topfiles_time

查看apache花费最多时间的文件:

sysdig -c topfiles_time proc.name=httpd

根据I / O错误查看顶级进程:

sysdig -c topprocs_errors

根据I / O错误查看顶级文件:

sysdig -c topfiles_errors

查看所有发生故障的磁盘I / O调用:

sysdig fd.type=file and evt.failed=true

查看由httpd打开的所有失败文件:

sysdig "proc.name=httpd and evt.type=open and evt.failed=true"

查看花费时间最多的系统调用:

sysdig -c topscalls_time

查看返回错误的顶级系统调用:

sysdig -c topscalls "evt.failed=true"

打印延迟大于1ms的文件I / O调用:

sysdig -c fileslower 1

显示用户“root”访问的目录:

sysdig -p"%evt.arg.path" "evt.type=chdir and user.name=root"

观察ssh活动:

sysdig -A -c echo_fds fd.name=/dev/ptmx and proc.name=sshd

显示在/ etc中发生的每个文件:

sysdig evt.type=open and fd.name contains /etc

显示已经启动“tar”命令的所有登录shell的ID:

sysdig -r file.scap -c list_login_shells tar

显示具有给定ID的登录shell执行的所有命令:

sysdig -r trace.scap.gz -c spy_users proc.loginshellid=5459

监控系统中交互的用户活动(如,用户在命令行输入了什么命令,以及用户去了什么目录):

sysdig -c spy_users

只监控系统中root用户的活动:

sysdig -c spy_users "user.name=root"

创建一个记录文件,该文件将只包含在用户家目录中的写入事件:

sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/cyq" -w writetrace.scap

检查由特定 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

查看调用某个文件的进程:

sysdig fd.name=/etc/resolv.conf

查看操作文件大于 100ms 的进程:

sysdig -c fileslower 100

查看大于 1s 的网络请求:

sysdig -c netlower 1000

查看 nginx 进程的执行时间:

sysdig -c procexectime proc.name=nginx

查看 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 fdbytes_by fd.sport

查看某客户端连接最多的 ip:

sysdig -c fdbytes_by fd.cip

查看运行在 centos 容器里 CPU 的使用率:

sysdig -pc -c topprocs_cpu container.name=centos

查看运行在 centos 容器里网络带宽的使用率:

sysdig -pc -c topprocs_net container.name=centos

查看在 centos 容器里使用网络带宽最多的进程:

sysdig -pc -c topprocs_net container.name=centos

查看在 centos 容器里网络连接的排名情况:

sysdig -pc -c topconns container.name=centos

显示 centos 容器里所有命令执行的情况:

sysdig -pc -c spy_users container.name=centos

查看所有的 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



参考链接:



如无特殊说明,文章均为本站原创,转载请注明出处