设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 11212|回复: 1

[性能测试] 系统调试工具之sysdig [复制链接]

Rank: 6Rank: 6

签到
43
注册时间
2010-4-6
最后登录
2014-7-12
在线时间
27 小时
阅读权限
70
积分
2808
帖子
145
主题
30
精华
0
UID
8723
发表于 2014-6-24 12:03:41 |显示全部楼层
本帖最后由 mygirl 于 2014-6-24 12:04 编辑

sysdig 文档见
http://www.sysdig.org/wiki/sysdig-user-guide/


基本用法

最简单的使用方法是不使用任何参数 直接调用sysdig.执行以后sysdig将捕获系统的所有事件并输出到标准输出,这点很像strace
3660 16:14:48.354527256 1 sysdig (24934) > switch next=46 pgft_maj=0 pgft_min=2807 vm_size=43908 vm_rss=7164 vm_swap=0
3661 16:14:48.354527599 2 sshd (22975) < rt_sigprocmask
3662 16:14:48.354528414 2 sshd (22975) > rt_sigprocmask
3663 16:14:48.354528667 2 sshd (22975) < rt_sigprocmask
3664 16:14:48.354529401 1 <NA> (46) > switch next=24934(sysdig) pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
3665 16:14:48.354529885 2 sshd (22975) > write fd=3(<4t>168.168.11.47:13277->168.168.11.40:22) size=164
3666 16:14:48.354532032 1 sysdig (24934) > switch next=46 pgft_maj=0 pgft_min=2807 vm_size=43908 vm_rss=7164 vm_swap=0
3667 16:14:48.354533615 1 <NA> (46) > switch next=24934(sysdig) pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0

sysdig默认把每个事件打印在一行,输出格式如下:
%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args

evt.num 是个自增的事件号
evt.time 是事件发生的时间
evt.cpu  该事件运行的CPU号
proc.name 产生事件的进程名
(thread.tid) 是产生该事件进程的线程id.如果为单线程程序,此id同进程id
evt.dir   事件的direction     >表示进入事件 < 表示离开事件
evt.type  事件名 例如 open read
evt.args 事件的参数 在有些系统调用中 这些参数可以看做 系统调用的参数  而在另外有些系统调用中出于性能或者精简输出的的目的并没有显示

注意: sysdig不能解析所有系统调用。不能被解析的系统调用依旧显示在输出中 但是不带参数

通过查看输出,你可能一眼就可以看出这些输出和strace 有些不同:
.大部分系统调用 sysdig 分两条显示:一个进(>标记) 一个退出(<标记) 。这样 在多进程环境下更容易追踪问题。
.文件描述符被解析。这意味着只要可能的话 文件句柄号 将跟随着一个可读性比较好的显示:网络连接元组,文件名 等等。更准确的FD格式为 num(<type>resolved_string)
num 代表 文件描述符
resolved_string  代表这个文件描述符的解析 例如 127.0.0.1:40370->127.0.0.1:80  这个事一个tcp连接
type: 是一个字符的 可以使下面的任意一个值
f for files            
4 for IPv4 sockets
6 for IPv6 sockets
u for unix sockets
s for signal FDs
e for event FDs
i for inotify FDs
t for timer FDs
跟踪文件:
    sysdig 允许你保存捕获的事件以便时候可以分析。语法如下

        $ sysdig –w myfile.scap

    如果你想限制跟踪的事件数 你可以使用 -n 标记
     
     $ sysdig –n 100 –w myfile.scap

sysdig 在每个捕获文件中保存了当时完整的系统快照,(正在运行的进程,打开的文件,用户名) 这意味着 在做离线分析的时候不会错过任何信息。你可以下载windows和mac版本的sysdig,虽然他们不能在线捕获,
但是可以用他们来分析在linux下的捕获文件



过滤:

现在我们已经有了一定的基础了,我们来看点有趣的。sysdig的过滤系统非常强大,他设计用来从海量信息中过滤出有用数据。过滤器和tcpdump一样在命令行的最后指定,在在线分析和离线分析时都可以使用过滤器,我们来看一个例子
$ ./sysdig proc.name=cat

21368 13:10:15.384878134 1 cat (8298) < execve res=0 exe=cat args=index.html. tid=8298(cat) pid=8298(cat) ptid=1978(bash) cwd=/root fdlimit=1024
21371 13:10:15.384948635 1 cat (8298) > brk size=0
21372 13:10:15.384949909 1 cat (8298) < brk res=10665984
21373 13:10:15.384976208 1 cat (8298) > mmap
21374 13:10:15.384979452 1 cat (8298) < mmap
21375 13:10:15.384990980 1 cat (8298) > access
21376 13:10:15.384999211 1 cat (8298) < access
21377 13:10:15.385008602 1 cat (8298) > open
21378 13:10:15.385014374 1 cat (8298) < open fd=3(/etc/ld.so.cache) name=/etc/ld.so.cache flags=0(O_NONE) mode=0
21379 13:10:15.385015508 1 cat (8298) > fstat fd=3(/etc/ld.so.cache)
21380 13:10:15.385016588 1 cat (8298) < fstat res=0
21381 13:10:15.385017033 1 cat (8298) > mmap
21382 13:10:15.385019763 1 cat (8298) < mmap
21383 13:10:15.385020047 1 cat (8298) > close fd=3(/etc/ld.so.cache)
21384 13:10:15.385020556 1 cat (8298) < close res=0


正如你所见到的,sysdig 并没有附加到任何进程。它捕获所有数据,然后你可以过滤出你感兴趣的事件。过滤器可以使用比较操作符 如  (=, !=, <, <=, >, >=, contains)   且可以联合布尔操作符 (and, or and not)   还有括号。 例如:


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

可以捕获所有cat 和vi进程

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

可以捕获所有非 cat 打开的文件 ,过滤器字段 通用用 class.filed 表示。 你可以通过下面的命令获得所有过滤器
$ sysdig -l


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

fd.num            the unique number identifying the file descriptor.
fd.type           type of FD. Can be 'file', 'ipv4', 'ipv6', 'unix', 'pipe', 'e
                  vent', 'signalfd', 'eventpoll', 'inotify' or 'signalfd'.
fd.typechar       type of FD as a single character. Can be 'f' for file, 4 for
                  IPv4 socket, 6 for IPv6 socket, 'u' for unix socket, p for pi
                  pe, 'e' for eventfd, 's' for signalfd, 'l' for eventpoll, 'i'
                   for inotify, or 's' for signalfd, 'o' for uknown.
fd.name           FD full name. If the fd is a file, this field contains the fu
                  ll path. If the FD is a socket, this field contain the connec
                  tion tuple.
fd.ip             matches the ip address (client or server) of the fd.
fd.cip            client IP address.
fd.sip            server IP address.
fd.port           matches the port (client or server) of the fd.
fd.cport          for TCP/UDP FDs, the client port.
fd.sport          for TCP/UDP FDs, server port.
fd.l4proto        the IP protocol of a socket. Can be 'tcp', 'udp', 'icmp' or '
                  raw'.
fd.sockfamily     the socket family for socket events. Can be 'ip' or 'unix'.
fd.is_server      'true' if the process owning this FD is the server endpoint i
                  n the connection.

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

proc.pid          the id of the process generating the event.
proc.exe          the full name (including the path) of the executable generati
                  ng the event.
proc.name         the name (excluding thr path) of the executable generating th
                  e event.
proc.args         the arguments passed on the command line when starting the pr
                  ocess generating the event.
proc.cwd          the current working directory of the event.
proc.nchilds      the number of child threads of that the process generating th
                  e event currently has.
proc.parentname   the name (excluding thr path) of the parent of the process ge
                  nerating the event.
thread.tid        the id of the thread generating the event.
thread.ismain     'true' if the thread generating the event is the main one in
                  the process.
thread.exectime   Thread execution time. Exported only by switch events.

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

evt.num           event number.
evt.time          event timestamp as a time string that includes the nanosecond
                   part.
evt.time.s        event timestamp as a time string with no nanoseconds.
evt.datetime      event timestamp as a time string that inclused the date.
evt.rawtime       absolute event timestamp, i.e. nanoseconds from epoch.
evt.rawtime.s     integer part of the event timestamp (e.g. seconds since epoch
                  ).
evt.rawtime.ns    fractional part of the absolute event timestamp.
evt.reltime       number of nanoseconds from the beginning of the capture.
evt.reltime.s     number of seconds from the beginning of the capture.
evt.reltime.ns    fractional part (in ns) of the time from the beginning of the
                   capture.
evt.latency       delta between an exit event and the correspondent enter event
                  .
evt.latency.s     integer part of the event latency delta.
evt.latency.ns    fractional part of the event latency delta.
evt.dir           event direction can be either '>' for enter events or '<' for
                   exit events.
evt.type          For system call events, this is the name of the system call (
                  e.g. 'open').
evt.cpu           number of the CPU where this event happened.
evt.args          all the event arguments, aggregated into a single string.
evt.arg           one of the event arguments specified by name or by number. So
                  me events (e.g. return codes or FDs) will be converted into a
                   text representation when possible. E.g. 'resarg.fd' or 'resa
                  rg[0]'.
evt.rawarg        one of the event arguments specified by name. E.g. 'arg.fd'.
evt.buffer        the binary data buffer for events that have one, like read(),
                   recvfrom(), etc. Use this field in filters with 'contains' t
                  o search into I/O data buffers.
evt.res           event return value, as an error code string (e.g. 'ENOENT').
evt.rawres        event return value, as a number (e.g. -2). Useful for range c
                  omparisons.
evt.failed        'true' for events that returned an error status.
evt.is_io         'true' for events that read or write to FDs, like read(), sen
                  d, recvfrom(), etc.
evt.is_io_read    'true' for events that read from FDs, like read(), recv(), re
                  cvfrom(), etc.
evt.is_io_write   'true' for events that write to FDs, like write(), send(), et
                  c.
evt.is_wait       'true' for events that make the thread wait, e.g. sleep(), se
                  lect(), poll().
evt.count         This filter field always returns 1 and can be used to count e
                  vents from inside chisels.

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

user.id           user ID.
user.name         user name.
user.homedir      home directory of the user.
user.shell        user's shell.

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

group.gid         group ID.
group.name        group name.

正如你所见  这些足够去组合成各种过滤需求。 如:


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

可以查看所有非apache的网络连接

但 这不是全部。
还有两个特别的fields,evt.arg ,evt.rawarg, 所有的事件都有类型 例如 open read 和一组参数,这两个fields的好处是 所有的参数都可以在过滤器中使用。  下面的命令显示了所有非活动用户运行的进程。

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

过滤器接受 execve 系统调用(这个调用 用于执行程序),且父进程的名字是bash. evt.arg 与evt.argv 不同的是 后者不解析  PIDs FDs err codes,etc 保留了参数原有数值形式, 如

$ sysdig evt.arg.res=ENOENT

这个可以用来捕获一个特定的I/O错误,因为这个值通常是负数,

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

会给你所有产生错误的系统调用。你可以通过以下命令获得所有你可以使用的系统调用

$ sysdig –L



输出格式化

你可以使用 -p 标记来格式化sysdig的输出。

$ 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


未完待续
建议大家把每天遇到的小问题都发布到troubleshooting分类

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2019-3-21
在线时间
847 小时
阅读权限
90
积分
231961
帖子
2158
主题
2
精华
0
UID
15647
发表于 2014-6-25 09:11:09 |显示全部楼层
感谢楼主分享!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2019-3-21 12:12 , Processed in 0.022898 second(s), 14 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部