jjzjj

kubernetes--分析容器系统调用:Sysdig

弓长丿 2024-07-17 原文

目录

Sysdig介绍:

sysdig工作流程

安装Sysdig

sysdig常用参数:

sysdig过滤:

sysdig之Chisels(工具箱):

其他常用命令


Sysdig介绍:

       Sysdig是一个非常强大的系统监控分析和故障排查工具。汇聚strace+tcpdump+iftop+lsof工具功能为一身。

       sysdig除了能获取系统资源利用率、进程、网络连接、系统调等信息,还具备了很强的分析能力,例如:

       1.按照CPU使用率对进程排序

       2.按照数据包对进程排序

       3.打开最多文件描述符进程

       4.查看进程打开了哪些文件

       5.查看进程HTTP请求报文

       6.查看机器上容器列表及资源使用情况

项目地址:https://github.com/draios/sysdig

文档:https://github.com/draios/sysdig/wiki

sysdig工作流程

sysdig通过内核的驱动模块注册系统调用hook,这样当有系统调用发生和完成的时候,它会把系统调用信息拷贝到特定的bugger,然后用户态组件对数据信息处理(解压、解析、过滤等,)并最终通过sysdig命令行和用户进行交互

在内核中加入了模块,通过该模块获取了系统调用的信息,该模块类似与拦截器,当有系统调用时,就会把系统调用所涉及的信息捕捉,用户层面的模块会对该数据就行解析过滤。

安装Sysdig

先升级下内核

【】yum -y install kernel-3.10.0-1160.el7.x86_64

【】yum -y install kernel-devel-3.10.0-1160.el7.x86_64

【】awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

【】grub2-set-default 0

自动安装

curl -s https://download.sysdig.com/stable/install-sysdig | sudo bash

上面是一个shell 脚本,会识别常用的linux发行版本,并根据对应的版本配置源,最后是安装sysdig包。在redhat/centos上首先会配置的是epel ,配置该源的目的是安装dkms包;然后会配置draios源,通过该源可以安装sysdig包。最后在装sysdig包之前还会先安装kernel-devel包。

手动安装

默认源里少个依赖需要repo源

【】rpm --import https://download.sysdig.com/DRAIOS-GPG-KEY.public

 

【】curl -s -o /etc/yum.repos.d/draios.repo https://download.sysdig.com/stable/rpm/draios.repo

【】yum install epel-release -y

【】yum install sysdig -y

【】yum -y install kernel-devel-$(uname -r)

 

【】/usr/bin/sysdig-probe-loader # 加载驱动模块

 

执行sysdig命令,实时输出大量系统调用。

示例: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 事件的名称,比如 openstat等,一般是系统调用

• evt.args 事件的参数。如果是系统调用,这些对应着系统调用的参数

自定义格式输出:sysdig -p "user:%user.name time:%evt.time proc_name:%proc.name"

sysdig -l列出支持字段

sysdig常用参数:

sysdig命令直接执行后显示的是个进程对linux的系统调用

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

• -M <num_seconds> :多少秒后停止收集

• -p <output_format>, --print=<output_format> :指定打印事件时使用的格式

    • 使用-pc-pcontainer 容器友好的格式

    • 使用-pk-pkubernetes k8s友好的格式

• -c <chiselname> <chiselargs>:指定内置工具,可直接完成具体的数据聚合、分析工作

• -w <filename>:保存到文件中

• -r <filename>:从文件中读取

sysdig过滤:

• fd:根据文件描述符过滤,比如 fd 标号(fd.num)、fd 名字(fd.name

• process:根据进程信息过滤,比如进程 idproc.id)、进程名(proc.name

• evt:根据事件信息过滤,比如事件编号、事件名

• user:根据用户信息过滤,比如用户 id、用户名、用户 home 目录

• syslog:根据系统日志过滤,比如日志的严重程度、日志的内容

• container:根据容器信息过滤,比如容器ID、容器名称、容器镜像

示列:

1、查看一个进程的系统调用

【】sysdig proc.name=kubelet

2、查看建立TCP连接的事件

【】sysdig evt.type=accept

3、查看/etc目录下打开的文件描述符

【】sysdig fd.name contains /etc

4、查看容器的系统调用

【】docker run -d --name=web --image=nginx

【】sysdig -M 10 container.name=web

注:还支持运算操作符,=、!=、>=、>、<、<=、contains、in 、exists、and、or、not

被黑后可用观察资源占用大的节点,通过sysdig对容器逐个分析

sysdig之Chisels(工具箱):

Chisels:实用的工具箱,一组预定义的功能集合,用来分析特定的场景。

sysdig –cl 列出所有Chisels以下是一些常用的:

• topprocs_cpu:输出按照 CPU 使用率排序的进程列表,例如sysdig -c

• topprocs_net:输出进程使用网络TOP

• topprocs_file:进程读写磁盘文件TOP

• topfiles_bytes:读写磁盘文件TOP

• netstat:列出网络的连接情况

网络

# 查看使用网络的进程TOP

sysdig -c topprocs_net

# 查看建立连接的端口10秒内

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

# 查看建立连接的端口10秒内

sysdig -c fdbytes_by fd.sport

# 查看建立连接的IP10秒内

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

# 查看建立连接的IP

sysdig -c fdbytes_by fd.cip

硬盘

# 查看进程磁盘I/O读写

sysdig -c topprocs_file

# 查看进程打开的文件描述符数量

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

# 查看读写磁盘文件

sysdig -c topfiles_bytes

sysdig -c topfiles_bytes proc.name=etcd

# 查看/tmp目录读写磁盘活动文件

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

CPU

# 查看CPU使用率TOP

sysdig -c topprocs_cpu

# 查看容器CPU使用率TOP

sysdig -pc -c topprocs_cpu container.name=web

sysdig -pc -c topprocs_cpu container.id=web

容器

# 查看机器上容器列表及资源使用情况

csysdig –vcontainers

# 查看容器资源使用TOP  CPU  net  file

sysdig -c topcontainers_cpu/topcontainers_net/topcontainers_file

其他常用命令

csysdig #图形化所有进程

sysdig -c netstat  #查看所有网络连接

sysdig -c ps    #类似于os命令

sysdif -c lsof     #查看所有打开的文件

有关kubernetes--分析容器系统调用:Sysdig的更多相关文章

  1. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  5. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. ruby - 如何找到调用当前方法的方法 - 2

    如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====

  10. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

随机推荐