目录
自定义过滤条件采集数据,对系统调用的事件编号和cpu进行采集1秒
sysdig
命令安装
1.导入官方yum源的key,下载官方draios源。
sudo rpm --import https://download.sysdig.com/DRAIOS-GPG-KEY.public
sudo curl -s -o /etc/yum.repos.d/draios.repo https://download.sysdig.com/stable/rpm/draios.repo
2.配置epel源的目的是需要安装dkms依赖包,后安装sysdig。
sudo yum install epel-release -y
sudo yum -y install sysdig
3.加载到内核中,加载成功可以查看到scap驱动模块。
sudo scap-driver-loader
常用参数
参数 | 说明 |
---|---|
-L, --list | 列出可用于过滤和输出的字段。 |
-M < num_seconds > | 多少秒后停止收集。 |
-p < output_format>, --print=< output_format>, 使用-pc或-pcontainer 容器友好的格式, 使用-pk或-pkubernetes k8s友好的格式 | 指定打印事件时使用的格式。 |
-c < chiselname > < chiselargs > | 指定内置工具,可直接完成具体的数据聚合、分析工作。 |
-C 5 | 每个文件不超过5M |
-W 10 | 保留不超过10个文件 |
-G 60 | 每个文件只保留一分钟内的系统活动 |
-w dump.pcap || -w < filename > | 保存到文件 ,特定格式,要用sysdig打开。 |
-e 1000 | 每个文件只有1000个事件 |
-z | 参数对保存的内容进行压缩 |
-A --print-ascii | 把buffer中数据按照ASCII格式打印,方便阅读 |
-x --print-hex | 把buffer中数据按照十六进制打印 |
-X --printhex-ascii | 把buffer中数据同时按照ASCII格式和十六进制打印 |
-s 1024 | 捕获buffer的数据大小,默认为80,设置过大,文件会很大 |
-N | 不用把端口号转成可读名字 |
-r < filename > | 从文件读取 |
输出含义
事件 | 说明 |
---|---|
evt.num | 递增的事件号 |
evt.time | 事件发生的时间 |
evt.cpu | 事件被捕获时所在cpu |
proc.name | 生成事件的进程名字 |
thread.tid | 线程id,单线程则为进程id |
evt.dir | 事件方向(direction), > 代表进入事件, < 代表退出事件 |
evt.type | 事件的名称,比如open、stat等,一般为系统调用 |
evt.args | 事件的参数。如果为系统调用,则对应系统调用的参数 |
chisels常用工具
事件 | 说明 |
---|---|
httplog | 输出所有的http请求 |
topprocs_cpu | 输出按照cpu使用率排序 |
topprocs_net | 按照网络使用情况对进程排序 |
fdcount_by | 按照建立连接书对进程排序 |
echo_fds | 输出进程读写数据 |
netsata | 列出网络连接情况 |
spy_file | 输出文件的读写数据,可以提供某个文件名作为参数 |
spy_ip | 抓取给定ip的数据交换 |
spy_port | 抓取给定端口的数据交换 |
命令帮助
sysdig -l #事件类型
sysdig -cl #chisels工具类型
常用查看IO占用命令
#查看io错误最多的进程
$ sysdig -c topprocs_errors
查看io错误最多的文件
$ sysdig -c topfiles_errors
#查看磁盘io失败的调用
$ 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
#查看使用硬盘带宽最多的进程
sysdig -c topprocs_file
#列出大量使用文件描述符的进程
sysdig -c fdcount_by proc.name "fd.type=file"
#查看读写bytes最多的文件
sysdig -c topfiles_bytes
#打印nginx进程已经读取中和写入中的文件
sysdig -c topfiles_bytes proc.name=nginx
#查看活跃中的读和写最多的目录
sysdig -c fdbytes_by fd.directory "fd.type=file"
#查看目录/tmp活跃中的读写最多的文件
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
常用查看网络占用命令
#抓取kubernetes pod 的客户端ip为172.119.110.17,3000端口的的请求内容
$ sudo sysdig -A -c echo_fds k8s.pod.name contains piller-datacenter-web-dev and fd.port=3000 and evt.type=read and fd.cip=172.119.110.17 fd.proto=UDP
#查看占用网络带宽最多的进程
sysdig -c topprocs_net
#显示主机192.168.0.1的网络传输数据
as binary:
sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1
as ASCII:
sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1
#查看连接最多的服务器端口
in terms of established connections:
sysdig -c fdcount_by fd.sport "evt.type=accept"
in terms of total bytes:
sysdig -c fdbytes_by fd.sport
#查看客户端连接最多的ip
in terms of established connections
sysdig -c fdcount_by fd.cip "evt.type=accept"
in terms of total bytes
sysdig -c fdbytes_by fd.cip
#列出所有不是访问apache服务的访问连接
sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
#显示 wordpress1 容器在端口 80 上发送和接收的数据:
sysdig -A -cecho_fds container.name=wordpress1 and fd.port=80
#实时打印 mysql 容器接收的所有新连接
sysdig -p"%fd.name" container.name=mysql and evt.type=accept
常用查看进程占用命令
#查看哪些文件花费时间做多
sysdig -c topfiles_time
#查看httpd进程哪些文件花费最多时间
sysdig -c topfiles_time proc.name=httpd
#查看io错误最多的进程
sysdig -c topprocs_errors
#查看io错误最多的文件
sysdig -c topfiles_errors
#查看磁盘io失败的调用
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"
#查看打开文件失败
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open and evt.failed=true
#打印延迟大于1ms的文件I/O调用
sysdig -c fileslower 1
常用总结
采集分析
采集数据示例:
59509 23:59:19.023099531 0 kubelet (1738) < epoll_ctl
采集数据格式:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
字段说明:
evt.num: 递增的事件号。
evt.time: 事件发生的时间。
evt.cpu: 事件被捕获时所在的 CPU,也就是系统调用是在哪个 CPU 执行的。
proc.name: 生成事件的进程名字。
thread.tid: 线程的 id,如果是单线程的程序,这也是进程的 pid。
evt.dir: 事件的方向(direction),> 代表进入事件,< 代表退出事件。
evt.type: 事件的名称,比如 open、stat等,一般是系统调用。
evt.args: 事件的参数。如果是系统调用,这些对应着系统调用的参数
采集系统调用事件
65611 05:29:20.772919597 1 sshd (22944.22944) > write fd=3(<4t>192.168.130.1:58986->192.168.130.147:22) size=4148
第一列(65611):事件编号,从1开始记录。
第二列(05:29:20.772919597):时间。
第三列(1):进程当前工作所在的cpu编号,从0开始。
第四列(sshd):进程名称。
第五列(22944.22944) :括号里是线程id,两个数值相同说明就一个线程。
第六列( > ): 进入事件,<代表退出事件。
第七列(write):事件名称。
第八列:事件信息,fd=3 是指打开的文件描述符是3,这里就是建立了一条TCP链接。
自定义过滤条件采集数据,对系统调用的事件编号和cpu进行采集1秒
sysdig -M 1 -p "%evt.num,%evt.cpu"
实例
sysdig常用过滤目标
fd:根据文件描述符过滤,比如 fd 标号(fd.num)、fd 名字(fd.name)
process:根据进程信息过滤,比如进程 id(proc.id)、进程名(proc.name)
evt:根据事件信息过滤,比如事件编号、事件名
user:根据用户信息过滤,比如用户 id、用户名、用户 home 目录
syslog:根据系统日志过滤,比如日志的严重程度、日志的内容
container:根据容器信息过滤,比如容器ID、容器名称、容器镜像
支持运算操作符:
=、!=、>=、>、<、<=、contains、in 、exists、and、or、not
查看某进程系统调用事件
查看kubelet进程的系统调用
sysdig proc.name=kubelet
查看nginx进程的系统调用
sysdig proc.name=nginx
查看建立TCP连接事件
tcp三次握手时,有个标识是accept
sysdig evt.type=accept
查看某目录下打开的文件描述符
查看/etc/当前目录下打开的文件描述符
sysdig fd.name=/etc
查看/etc/目录下所有目录打开的文件描述符
sysdig fd.name contains /etc
Chisels工具
Chisels是个实用的工具箱,一组预定义的功能集合,用来分析特定的场景。
sysdig –cl 列出所有Chisels,常用的如下:
topprocs_cpu:输出按照 CPU 使用率排序的进程列表
topprocs_net:输出进程使用网络TOP
topprocs_file:进程读写磁盘文件TOP
topfiles_bytes:读写磁盘文件TOP
netstat:列出网络的连接情况
网络类
sysdig -c topprocs_net 查看使用网络的进程TOP
sysdig -c fdcount_by fd.sport “evt.type=accept” -M 10 查看建立连接的端口
sysdig -c fdbytes_by fd.sport 查看建立连接的端口
sysdig -c fdcount_by fd.cip “evt.type=accept” -M 10 查看建立连接的IP
sysdig -c fdbytes_by fd.cip 查看建立连接的IP
硬盘类
sysdig -c topprocs_file 查看进程磁盘I/O读写
sysdig -c fdcount_by proc.name “fd.type=file” -M 10 查看进程打开的文件描述符数量
sysdig -c topfiles_bytes||sysdig -c topfiles_bytes proc.name=etcd 查看读写磁盘文件
sysdig -c fdbytes_by fd.filename “fd.directory=/tmp/” 查看/tmp目录读写磁盘活动文件
cpu类
sysdig -c topprocs_cpu 查看CPU使用率TOP
sysdig -pc -c topprocs_cpu container.name=web 查看容器CPU使用率TOP
sysdig -pc -c topprocs_cpu container.id=web 查看容器CPU使用率TOP
容器类
csysdig –vcontainers 查看机器上容器列表及资源使用情况
sysdig -c topcontainers_cpu/topcontainers_net/topcontainers_file 查看容器资源使用TOP
实例
1.查看当前系统cpu使用占比最高的进程
sysdig -c topprocs_cpu
2. 查看网络
sysdig -c topprocs_net
3.查看哪些进程在磁盘读写
sysdig -c topprocs_file
4.查看哪些文件在磁盘读写
sysdig -c topfiles_bytes
5.查看端口被链接的数量
sysdig -c fdcount_by fd.sport