Skip to main content

moregeek program

bcc 和 ftrace 追踪内核网络模块实战_mb60939e30d6d2e的博客-多极客编程

今天给技术伙伴们分享一下 BCC 和 Ftrace 的使用方法,在开发实践过程中会遇到哪些问题,本篇文章都将一一道来~

BCC 一个用于跟踪内核和操作程序的工具集,其软件包中包含了一些有用的工具和例子,是 eBPF 技术的一个前端,集成了 ebpf/kprobe/uprobe 等工具,可以使用 Python 来封装,对一些常见功能进行了整合。

而 eBPF 是近几年比较热门的一项技术,它的前身是 BPF(Berkeley Packet Filter),也就是 tcpdump 使用过滤数据包的技术。eBPF 对 BPF 进行了扩展,它能在内核中运行自定义程序,而无需修改内核源码或者加载内核模块。

Ftrace 有两种概念,一种是广义的 Ftrace 框架,一种是狭义的追踪技术。广义的 Ftrace 框架包含了 krpobe trace event 很多追踪技术,而狭义的 Ftrace 也就是本期的重点内容,今天会对其中一种 Ftrace 的使用做着重介绍。

BCC 和 Ftrace 追踪内核网络模块实战_文件存储

Tracer 的概念直译为追踪器,可以直观理解为内核提供的一些追踪技术,比如有 function tracer,function graph tracer 等等,今天将着重介绍 function graph tracer,因为 function tracer 的很多功能用 BCC 就可以实现,而 function graph 却是 BCC 没有的功能。

function graph tracer 的效果如图:

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_02

BCC 效果如图:

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_03

如何使用 BCC Ftrace?

>>>> 安装

BCC 使用 yum install bcc -y 就能安装。Ftrace 不用安装,是内核提供的,只要开启 CONFIG_DYNAMIC_FTRACE 就行,而这个选项我们是默认开启的。

内核版本越高,BCC 和 Ftrace 能使用的功能就越多。也就是说,在低内核版本上,可能一些功能并没有集成进去所以就不能使用这个功能。

BCC 安装完成后如图所示:

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_04

而 Ftrace 需要手动开启内核一些选项:

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_05

Trace 语法:

  • name 或者 p:name:对内核函数 name() 进行插桩
  • r::name:对内核函数 name() 的返回值进行插桩
  • lib:name 或者 p:lib:name:对用户态 lib 库中的函数 name() 进行插桩
  • r:lib:name:对用户态 lib 库中的函数 name() 进行插桩
  • path::name:对位于 path 路径下的用户态函数 name() 进行插桩
  • r:path:name:对位于 path 路径下的用户态函数 name() 的返回值进行插桩
  • t:system:name:对名为 system:name 的跟踪点进行插桩
  • u:lib:name:对 lib 库中名为 name 的 USDT 探针进行插桩

*: 用来匹配任意字符的通配符。-r 选项允许使用正则表达式。

详细可见《bpf之巅——洞悉linux系统和应用性能》

开发过程中的实际案例

>>>> 安装

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_06

可以看到环境上有两个同网段的 ip,这个环境作为 client 向 server 发消息,server 地址是 100.1.1.21。

>>>> ifdown 测试

在 client 和 server 的正常通信中通过 ifdown 把网卡 down 掉,会发生什么呢?

BCC 和 Ftrace 追踪内核网络模块实战_云计算_07

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_08

我们可以看到,client 在 down 掉网卡后,返回值还是正常的,但是 server 阻塞在 read(),就已经接收不到数据。

>>>> ip link set down 测试

在 client 和 server 的正常通信中通过 ip link set ens192 down 把 link down 掉,会发生什么呢?

BCC 和 Ftrace 追踪内核网络模块实战_高性能_09

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_10

可以看到,client 和 server 都还可以正常收发!

这里有两个问题:

  1. 为什么 ifdown 之后,client 还是可以发送成功?
  2. 为什么 ifdown 之后,server 收不到消息,而 ip link set down 测试中 server 可以接收到消息?

接下来,我们将通过 BCC 和 Ftrace 追踪工具解答这两个问题。

BCC Trace 追踪 __sk_dst_check()

根据排查定位,我们定位到了路由这一块。而路由是在 ip 层做的事情,所以我们来看 ip 层的代码:

ip_queue_xmit() -> ip_queue_xmit() ip_queue_xmit() 是 ip 层的入口函数。

BCC 和 Ftrace 追踪内核网络模块实战_文件存储_11

可以看到,ip 层的第一步就是一个检查,那么我们需要看一下对两种测试来说,检查的结果是什么,有什么不同?

我们需要用 BCC 自带的 Trace 工具来查看 sk_dst_check() 的返回值。

>>>> ip link set down 测试

BCC 和 Ftrace 追踪内核网络模块实战_应用程序_12

>>>> ifdown

BCC 和 Ftrace 追踪内核网络模块实战_应用程序_13

可以看到,在 ifdown 测试中,后面的返回值全部变为了 NULL ,而 ip link set down 测试中,只有一次变为了 NULL ,而后面就恢复了正常。

经过了解后,变为 NULL 的原因很简单。因为 struct sock 里缓存了上次成功的路由,而这 sk_dst_check() 检查路由缓存是否还可用, ifdown 和 ip link set down 后肯定就不可用了。

梳理代码逻辑后可以观察到,如果路由缓存不可用的话,会通过 ip_route_output_ports() -> ip_route_output_flow() 来查找路由表,如果查找成功会再次将其缓存起来。所以这里发生的事情是, ifdown 路由缓存失效后,查找路由表找不到有效路由。而 ip link set down 后,查找路由表可以找到有效路由。

那么要通过 Ftrace 看一下,在两种测试中,ip_route_output_flow() 的逻辑到底有什么不同?

Ftrace 追踪 ip_route_output_flow()

Ip link set down后,路由查找的过程:

BCC 和 Ftrace 追踪内核网络模块实战_应用程序_14

ifdown 后,路由查找的过程:

BCC 和 Ftrace 追踪内核网络模块实战_应用程序_15

对比两种输出的不同和内核代码,可以发现,ifdown 后会直接查找设备失败,进而直接返回给上层 (tcp)-EHOSTUNREAD。而 ip link down 后,会查找设备成功,进而查找路由成功。

再对比内核代码中的查找路由过程,发现在 fib_table_lookup() 中,有以下逻辑:

BCC 和 Ftrace 追踪内核网络模块实战_高性能_16

然后发现 /proc/sys/net/ipv4/conf/ens40/ignore_routes_with_linkdown 这个选项,控制了 link down 后,原来路由是否还会生效,而这个值默认是 0,也就是不忽略原来的路由项。

至此,终于可以解答前面的两个疑问了:

  1. 为什么 ifdown 之后,client 还是可以发送成功?
  2. 因为 ip 层向 tcp 返回了 EHOSTUNREACH,而 tcp 进行了重试,再次收到 EHOSTUNREACH,再达到重试 /proc/sys/net/ipv4/tcp_retries2 这么多次之前,tcp 是不会返回失败的。
  3. 为什么 ifdown 之后,server 收不到消息,而 ip link set down 测试中 server 可以接收到消息。
  4. 因为 ifdown 后,设备被删除了,直接向 tcp 层返回了 EHOSTUNREACH,而下一次重试又会失败。所以消息发布出去, sever 收不到消息。
  5. 而 ip link set down 后,设备没有被删除,而 /proc/sys/net/ipv4/conf/ens40/ignore_routes_with_linkdown 默认为 0,也就是不忽略已经 down 掉 Link 的路由,所以会查找路由成功,进而发送成功,server 接收成功。

脚本

BCC 和 Ftrace 追踪内核网络模块实战_高性能_17

通过本期文章的分享,大家应该对 BCC 和 Ftrace 的使用方法有了一定的了解,我们后续还会有更多技术文章的分享,可以持续关注。

©著作权归作者所有:来自51CTO博客作者YRCloudFile的原创作品,请联系作者获取转载授权,否则将追究法律责任

详解云端 kop——streamnative cloud for kafka_wx630f055ce23fc的博客-多极客编程

StreamNative Cloud for Kafka目前 StreamNative Cloud for Kafka 服务是预测试版本,只对少数用户定向开放体验。StreamNative Cloud 简介StreamNative Cloud 提供了全托管(Cloud-Hosted)和半托管(Cloud-Managed)两种云端服务,前者是由 StreamNative 提供的全 SaaS 服务,用

如果你还没玩过docker stack管理服务,你已经out了,(送portainer集群管理教程)_博学谷狂野架构师的博客-多极客编程

我们上面使用swarm部署服务,单个服务还好,如果很多个服务怎么来解决呢,这里就用到了Docker Stack管理服务。 ​ 在上面我们学会了如何配置一个swarm集群,并且知道如何在swarm集群上部署应用,现在,我们开始了解Docker层级关系中的最高一个层级——stack。一个stack就是一组有关联的服务的组合,可以编排在一起,一起管理。 ​ 单机模式下,我们可以使用 Docke

g029-op-coa-open-02 centos 8.4 通过 packstack 安装开源 openstack(v版)_cloudcs的博客-多极客编程

1 您需要了解 虚拟化平台版本 VMware Workstation 16.2.0 操作系统版本 CentOS Linux release 8.4.2105 ,可参考下方相关文章 G003 完成系统安装,步骤一致 安装源您可访问 CentOS官网 / 阿里永久镜像站 / 华为永久镜像站 或其他镜像站进行下载 环境用到 2台 虚拟机,单网卡,并为其配置 静态 IP 及 DNS,具体规划请参考 第

etcd v3版本生产级集群搭建以及实现一键启动脚本_字母哥博客的博客-多极客编程

一、准备工作1.1. 规划主机服务器1.2. 新建etcd用户1.3.开放防火墙端口1.4.创建必要的目录1.5.下载etcd并解压1.6. 集群主机免密登陆二、集群启动与验证2.1. 一键启动脚本实现2.2.验证集群本专栏的上一篇文章写了《长篇图解etcd核心应用场景及编码实战》,本文继续。后续计划章节内容如下:《长篇图解etcd核心应用场景及编码实战》《搭建高可用etcd集群》《基于etcd实

k8s学习-配置客户机访问kubernetes集群资源_年轻人,少吐槽,多搬砖的博客-多极客编程

需求我们需要一台单独的机器访问kubernetes资源,这样的好处就是避免直接通过 root身份登录kubernetes的master节点访问,提高了安全性,同时可以避免直接操作而带来的风险。客户机访问如下:要求:客户机访问任意的master节点就可以操作k8s集群客户机的登录账号不能是root客户机只有查看k8s资源的权限,不能修改,删除资源,即list,watch,get客户机可以查看任意na

最新的稳定版kubernetes1.24.4安装部署_巧妙绝情 - 李靖的博客-多极客编程

最新的稳定版kubernetes1.24.4安装部署一、使用最新稳定版背景 和contianerd背景和参考官方说明二、节点规划三、初始化sysctl,repo,modules四、方案一:使用 cri-docker docker五、方案二:使用 contianerd六、Node节点安装七、安装 kubeadm、kubelet 和八、导入官网镜像九、Kubeadm 初始化安装十、加入control节

详解云端 kop——streamnative cloud for kafka_wx630f055ce23fc的博客-多极客编程

StreamNative Cloud for Kafka目前 StreamNative Cloud for Kafka 服务是预测试版本,只对少数用户定向开放体验。StreamNative Cloud 简介StreamNative Cloud 提供了全托管(Cloud-Hosted)和半托管(Cloud-Managed)两种云端服务,前者是由 StreamNative 提供的全 SaaS 服务,用

企业上云的关键安全问题和应对之道_mb62f1cd5a97d30的博客-多极客编程

现在企业都希望可以通过云的能力,来提升自己的业务能力,artner预测:到2025年,将有85%的企业和组织采用云优先原则,云计算已经成为企业和组织IT战略的一部分,企业对于上云已经不陌生。在企业上云过程中,如果不能保证安全和可靠,那往往会带来无尽的隐患。一个错误配置的服务器可能会给你的公司带来财务或声誉损失,这需要几年的时间才能挽回。虽然这个过程充满挑战,我们依然有信心去安全的完成云迁移,首先我

免费搭建亚马逊云环境(4)—— aws的网络vpc_书山有路的博客-多极客编程

一、简介VPC(Amazon Virtual Private Cloud​)是将 AWS 资源启动到定义的虚拟网络中,这个虚拟网络与数据中心中运行的传统网络极其相似,提供可扩展的基础设施。VPC在AWS里面是基础但又是较为复杂的功能,本文会从实战的角度来梳理VPC的使用。二、基础概念​首先我们要了解几个基础概念,可用区,子网,网关,路由表,对等连接。1、可用区一个可用区(Available Zon

【直冲“云”霄种子计划】训练营考证心得_指剑fs的博客-多极客编程

一、什么是[直冲“云”霄种子计划]? 亚马逊云科技拥有全球云计算的先进知识与技术,为诸多大型跨国企业提供完善的云服务,其提供的培训与认证也在业内备受青睐。 对于企业,亚马逊云科技的培训与认证可以提升员工的技能,提高企业投资回报率。 对于技术人员,拥有亚马逊云科技认证资格证书更是成为了技术能力的证明和职业领域的金字招牌。 为了帮助更多的架构师、开发者更快地成长,亚马逊云科技联合51CTO推出了“ 直

slurm和laxcus分布式操作系统的同与不同_赵大奇的博客-多极客编程

这个问题是公号一位网友提出来的,因为近期工作事情实在太多拖了很久,今天周末有空写篇文章正式回复这位网友。​先说结论:Slurm和Laxcus的差别,其实非常大。Slurm是Simple Linux Utility for Resource Management的缩写,它的产品定位是分布任务调度工具,用来管控分布式业务,应用方向在超算和科研领域。而Laxcus的产品定位是操作系统,作为操作系统自然需

零信任安全:spiffe 和 spire 通用身份验证的标准和实现_云原生指北的博客-多极客编程

最近正在读 《Solving the Bottom Turtle》 这本书,这篇是对部分内容的总结和思考,由于内容较多,会分几篇来发。 这本书的副标题是: a SPIFFE Way to Establish Trust in Your Infrastructure via Universal Identity. 通过通用身份以 SPIFFE 的方式在基础设施中建立信任。 大家记住其中的有几