Sysdig简介Sysdig官网自我介绍为:OpenSourceUniversalSystemVisibilityWithNativeContaierSupport。它的定位是系统监控、分析和故障排除的工具。其实在linux平台上,网上已经有很多这方面的工具,比如strace、tcpdump、htop、iftop、lsof、netstat,可以用来分析linux系统的运行情况,还有很多日志和监控工具。为什么还需要Sysdig?在我看来,Sysdig的优势可以概括为三个词:集成、强大、灵活。集成虽然Linux有很多系统分析和调优的工具,但它们一般都负责一个特定的功能,使用方法也大不相同。如果要分析和定位问题,一般需要熟练使用所需要的命令。而且,这些工具的数据不能共享,只能相互独立工作。Sysdig可以在一个工具中实现上述所有工具的功能,并提供了统一的使用语法。强大的Sysdig可以获取实时的系统数据,也可以将信息保存到文件中供以后分析。捕获的数据包括系统的方方面面:?系统参数的方方面面:CPU、内存、磁盘IO、网络IO?支持各种IO活动:进程、文件、网络连接等。除了帮助您捕获信息外,Sysdig也有了有用的工具来预先分析这些数据,从大量数据中找到有用的信息变得非常简单。例如,您可以简单地做以下事情:?根据CPU使用率对进程进行排序,找到CPU使用率最高的进程?根据发送的网络数据包数量对进程进行排序?找到打开文件描述符最多的进程?查看哪些进程修改了指定文件?打印出某个进程的HTTP请求报文?查找时间最长的系统调用?查看系统中所有用户都执行了哪些命令?...基本内置工具可以满足大部分的分析需求。FlexibleSysdig具有类似tcpdump的过滤语法,用户可以自由组合自己的过滤逻辑,从浩如烟海的数据中寻找有趣的信息。另外,用户也可以编写Lua脚本来自定义分析逻辑,基本没有任何限制。工作原理Sysdig在内核的驱动模块中注册了系统调用的钩子,这样当系统调用发生并完成时,它会将系统调用信息复制到特定的缓冲区中,然后由用户模块的组件处理数据信息(解压、解析、过滤等),最后通过Sysdig命令行与用户进行交互。更多原理请参考官方博客。除了Sysdig命令,还有一个基于终端的UI命令Csysdig,与top命令类似。它定期刷新系统状态并允许用户进行交互。本文只介绍Sysdig,不讲解Csysdig的使用。安装Sysdig的安装在官方文档中有详细介绍,这里不再赘述。需要注意的是,Sysdig对内核版本有一定的要求,请确保内核不要太旧。另外,如果使用容器安装,需要将宿主机的很多系统目录挂载到容器中:$dockerrun-i-t--namesysdig--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:rosysdig/sysdigSysdig基本用法基本格式在终端直接输入sysdig,开始抓取系统信息。此命令需要系统管理员权限。执行后,你会在终端看到一个连续的输出流。$sudosysdig因为系统一直在产生大量的系统调用,所以无法查看和分析输出信息。您可以先使用CTRL+c退出命令。在说明如何使用Sysdig的参数之前,先说明一下它的输出格式:535220911:54:08.8534796950ssh-agent(13314)clock_gettime535221111:53:agent(13314)<34394clock_gettime535222611:54:08.8535103130ssh-agent(13314)>getrusage535222811:54:08.8535110890ssh-agent(13314)clock_gettime535223111:54:08.8535120200ssh-agent(13314)stat535224111:54:08.8535323290ssh-agent(13314)stat535224311:54:08.8535339900ssh-agent(13314)writefd=16size=280所有输入按行拆分,每行是一条记录,由多个列组成,默认格式为:%evt.num%evt.outputtime%evt.cpu%proc.name(%thread.tid)%evt.dir%evt。type%evt.info中各字段的含义如下:?evt.num:递增的事件编号。?evt.time:事件发生的时间。?evt.cpu:捕获事件的CPU,即执行系统调用的CPU。对比上面的例子,值0代表机器的第一个CPU。?proc.name:生成事件的进程的名称,即正在运行的进程。?thread.tid:线程的id,如果是单线程程序,这也是进程的pid。?evt.dir:事件的方向(direction),>代表进入事件,<代表退出事件。?evt.type:事件名称,如open、stat等,一般为系统调用。?evt.args:事件的参数。在系统调用的情况下,这些对应于系统调用的参数。过滤完整的Sysdig的方式如下:sysdig[option]...[filter]因为Sysdig的输出内容很多,不管是监控还是故障排除,我们需要关注的事件只是一小部分他们中的。这时候过滤函数就是用来寻找感兴趣的事件。Sysdig的过滤功能非常强大,不仅支持非常多的过滤项,还可以在逻辑上自由组合。Sysdig的过滤器也分为不同的类别,例如:?fd:过滤文件描述符,例如fd标签(fd.num)、fd名称(fd.name)。?process:过滤进程信息,如进程id(proc.id)和进程名(proc.name)。?evt:过滤事件信息,如事件号和事件名称。?user:过滤用户信息,例如用户id、用户名、用户主目录和用户登录shell(user.shell)。?syslog:过滤系统日志,如日志严重性和日志内容。?fdlist:过滤轮询事件的文件描述符。可以使用sysdig-l查看完整的过滤器列表。比如可以查看建立TCP连接的事件:$sudosysdigevt.type=accept过滤器除了直接相等比较,还有其他操作符,包括=,!=,>=,>,<,<=,contains,inandexists,如:$sysdigfd.namecontains/etc$sysdig"evt.typein('select','poll')"$sysdigproc.nameexists更酷的,还有更多过滤条件也可以逻辑组合and,or,而not,如:$sysdig"not(fd.namecontains/procorfd.namecontains/dev)"这些强大的功能可以组合在一起,方便我们定位需要的Event,分析和监控更有目的性。自定义输出格式标准输出已经打印了常用信息。sysdig还允许您自定义打印的内容。参数-p可以加上类似C语言printf的字符串,例如:$sysdig-p"user:%user.namedir:%evt.arg.path"evt.type=chdiruser:ubuntudir:/rootuser:ubuntudir:/root/tmpuser:ubuntudir:/root/Download以上信息可以很方便的看到用户改变了当前目录。您还可以使用上面示例中的-p:?字段必须以%为前缀,可以使用sysdig-l中列出的所有字段?您可以在字符串中添加其他可读内容,它们将被忠实地打印出来?如果a某个字段在某个时间不存在,该事件将被默认过滤掉。在这个字符串的开头加上*符号会打印出所有的事件,不存在的字段会变成,例如:$sysdig-p"*%evt.type%evt.dir%evt.arg.name"evt.type=openopen>openopenopenSavetofile虽然可以使用过滤器来减少输出,但是没有办法直接在终端中查看事件流。进行深入分析。与tcpdump工具类似,Sysdig也可以让你将抓取的时间保存到本地文件中,然后读取文件内容进行分析。保存到文件可以通过-w实现,从文件读取需要-r参数,例如:#capturetheeventandsaveittoafile,这样在终端看不到输出。$sudosysdig-wsysdig-trace-file.scap#从文件中读取Sysdig格式的事件进行分析。$sudosysdig-rsysdig-trace-file.scap的另一个有用特性是您可以控制捕获到文件的内容。通常,Sysdig会捕获系统的所有活动,因此数据会非常大。如果一直捕获,会造成磁盘空间的浪费。Sysdig提供了一种类似于logrotate的方法,允许您只保存最新捕获的文件。控制捕获文件大小的一种方法是在捕获时使用过滤器。另外,也可以通过-n2000指定捕获2000个事件后退出,或者使用logrotate滚动文件:?sysdig-C5-W10-wdump.pcap:确保每个文件不超过5M大小,只保存最近的10个文件?sysdig-G60-W60-wdump.pcap:每个文件只保存一分钟内的系统活动(-G60),只保存60个文件,也就是说,捕获最近一小时的系统活动,每分钟数据一个文件?sysdig-e1000-W5-wdump.scap:保存5个文件,每个文件只有1000个事件。在使用-w保??存文件时,还可以使用-z参数对保存的内容进行压缩,进一步减少占用空间。读的时候也可以使用过滤器,如果我们只关心write系统调用:$sysdig-rsysdig-trace-nano.scapevt.type=write读的时候可以进一步划分文件,例如:$sysdig-命令rdump.scap-G300-z-wsegments.scap是读取dump.scap文件的内容,分成多个五分钟的文件(-G300s)。常用参数除了上面介绍的过滤器参数外,Sysdig还有很多可用的参数。有关完整列表和解释,请参阅mansysdig文档。下面是比较常用的:?-A--print-ascii:以ASCII格式打印缓冲区中的数据,方便用户阅读?-x--print-hex:以ASCII格式打印缓冲区中的数据十六进制格式?-X--print-hex-ascii:同时以ASCII格式和十六进制格式打印缓冲区中的数据?-s1024:捕获缓冲区的数据大小,默认为80,如果这个值设置太大,会产生非常大的Largefiles?-N:不需要将端口号转换成可读的名称,这个参数会提高处理效率Chisels:实用工具箱虽然有过滤器和文件输入输出,加上Sysdig的其他参数,我们可以根据需求对系统进行分析和监控,但是很多场景需要更复杂的数据聚合。Sysdig提供了另一个强大的功能:chisels,它是一组通过Lua脚本实现的预定义函数,用于分析特定场景。你可以通过sudosysdig-cl列出所有支持的chisels,让我们解释一些更常用的chisels:?httplog:输出所有HTTP请求。?topprocs_cpu:输出按CPU使用率排序的进程列表。?echo_fds:输出进程读写的数据。?netstat:列出网络连接。?spy_file:输出一个文件的读写数据,可以提供一个文件名作为参数,这样只输出文件的读写内容。有些凿子可能需要参数才能正常运行。如果想知道某个凿子的具体使用说明,可以使用-i参数。例如,要了解spy_file的用法:$sudosysdig-ispy_fileCategory:I/O------------spy_fileEchoanyread/writemadebyanyprocesstoallfiles.Optionally,youcanprovidethenameofonefiletoonlyinterceptreads/writestothatfile.Thischiselinterceptsallreadsandwritestoallfiles.Insteadofallfiles,youcanlimitinterception:toone[file.Argsstring]read_or_write-指定'R'只捕获读取事件;'W'只捕获写入事件;'RW'捕获读取和写入事件。默认情况下,线程和写入事件都被捕获。[string]spy_on_file_name-凿子应该监视所有读取和写入活动的文件的名称。文章开头提到了Sysdig可以满足大部分的日常分析,主要是通过chisel完成的。例如:根据网络使用情况对进程进行排序:$sysdig-ctopprocs_net根据建立的连接数对进程进行排序:$sysdig-cfdcount_byfd.sport"evt.type=accept"查看系统中用户执行的命令:$sysdig-rsysdig有关.pcap-cspy_users的更多用例,请参阅SysdigExamplewiki。在Linux机器上,这些凿子保存在/usr/share/sysdig/chisels文件夹中,每个凿子一个Lua脚本文件。如果提供的凿子不能满足要求,用户也可以根据需要自己编写凿子。对容器的支持Sysdig的另一个优势是它对容器(Docker和Kubernetes)的良好支持,这对当前使用容器化的系统管理员来说是一个很好的好处。使用-pc参数自动在打印的事件中添加容器信息(容器名称、容器id等),比如捕获所有容器名为zen_knuth的系统活动:$sysdig-pccontainer.name=zen_knuth用于容器分析和和之前一样,只需要通过container.name=apache指定要分析的容器名称即可,例如查看某个容器的网络连接情况:$sysdig-pc-ctopconnscontainer.name=wordpress1要集成Kubernetes系统监控,使用-khttp://master_ip:8080参数,后面是apiserver的地址,如果apiserver需要认证,需要指定-Kfilename,表示apiserverCA证书的文件地址。Kubernetes的监控和分析不是本文的重点。读者可以参考Sysdig的博客或其他文档。Csysdig:图形化的SysdigSysdig还提供了另一种图形化工具:Csysdig,其界面类似于top/htop命令,可以接受用户交互。与Sysdig一样,Csysdig可以实时捕获系统事件,也可以读取以前保存的文件。更多文档本文介绍基本概念知识。如果读者想进一步了解sysdig,不妨继续阅读以下文章:?sysdig与传统strace、htop、lsof、tcpdump、iftop命令的比较?理解sysdig的输出?sysdigtwitteraccount#digofthedayHowToMonitor使用Sysdig的Ubuntu16.04系统?SysdigvsDTracevsStrace:技术讨论?使用Sysdig监控服务器和Docker容器