本文分享自天翼云开发者社区《使用 ftrace 跟踪内核丢包问题定位的实践》,作者:f****n

数据包的丢失可能会导致性能下降或服务中断。为了诊断内核中是否有丢包问题,我们可以使用 ftrace 工具进行内核级别的跟踪,定位导致数据包丢失的原因。下面通过一个实际的例子,来展示如何使用 ftrace 来跟踪网络丢包的问题。

一、背景

在一个高流量的网络环境中,可能会发生数据包丢失。这种丢包可能是由于内核中的调度延迟、网络驱动问题或资源争用等原因导致的。通过分析内核的网络栈,可以帮助我们定位丢包的具体原因。

二、启用 ftrace 并开始跟踪

首先,确保你的系统已经启用了 ftrace。你可以通过以下命令检查系统是否支持 ftrace:ls /sys/kernel/debug/tracing如果返回了相关的文件和目录,说明系统支持 ftrace。

接下来,我们将使用 ftrace 跟踪内核中与网络相关的函数调用,查看是否有异常的情况发生。

三、跟踪 tcp 发送和接收

丢包通常与 TCP 发送和接收有关,因此我们首先从 tcp_sendmsg 和 tcp_recvmsg 函数入手。可以通过以下步骤开启 ftrace 跟踪:

选择跟踪点:

我们将跟踪 tcp_sendmsg 和 tcp_recvmsg
这两个函数,它们分别处理数据包的发送和接收。

打开
ftrace 调试接口:echo function >
/sys/kernel/debug/tracing/current_tracer

启用 tcp_sendmsg 和 tcp_recvmsg 跟踪:

在 ftrace 中,我们可以选择对特定的内核函数进行跟踪。我们将追踪 TCP 发送和接收相关的函数:

echo
tcp_sendmsg > /sys/kernel/debug/tracing/set_ftrace_filter

echo tcp_recvmsg > /sys/kernel/debug/tracing/set_ftrace_filter

开始跟踪:

启动 ftrace 来记录内核函数的调用。

echo 1
> /sys/kernel/debug/tracing/tracing_on

查看跟踪结果:

通过查看 /sys/kernel/debug/tracing/trace 文件,我们可以看到 tcp_sendmsg 和 tcp_recvmsg 函数的调用情况。

cat
/sys/kernel/debug/tracing/trace

这时,ftrace 会输出类似如下的内容:

<...>-1234
 [000] ....  10938.567892: tcp_sendmsg: skb=0x1234, len=1500,
dest=192.168.1.10

<...>-1234  [000] ....  10938.567895: tcp_sendmsg: skb=0x1235,
len=1500, dest=192.168.1.10

<...>-1234  [000] ....  10938.568002: tcp_recvmsg: skb=0x1236,
len=1500, src=192.168.1.10

每一条记录都包含了发送和接收数据包的具体信息,例如数据包的长度、源/目标ip等。

四、分析丢包现象

假设在跟踪结果中,我们注意到 tcp_sendmsg 和 tcp_recvmsg 的日志显示有发送的数据包,但接收端并没有相应的接收记录。通过分析这些日志,我们可以判断出以下几种可能性:

网络层丢包:

如果发送的数据包数量大于接收的数据包数量,可能是由于网络层的丢包。此时,可以查看其他网络设备的日志,如交换机、路由器等,确认是否存在网络丢包。

内核队列拥塞:

如果发送的数据包都显示成功发送,但由于内核网络栈中存在队列拥塞,接收端可能无法及时接收数据包。在 ftrace
中,我们还可以查看 tcp_retransmit_skb 函数的调用情况。如果这个函数被频繁调用,说明存在数据包重传,可能是由于网络拥塞或内核的调度延迟导致的。

可以通过以下命令启用 tcp_retransmit_skb 跟踪:

echo
tcp_retransmit_skb > /sys/kernel/debug/tracing/set_ftrace_filter

查看跟踪结果时,如果出现大量的重传记录,这就说明丢包发生的原因可能是网络拥塞或系统资源不足。

硬件问题:

如果数据包在网络接口上确实被成功发送,但没有到达接收端,可能是由于硬件问题(如网卡驱动故障或硬件故障)。此时可以通过查看 netif_receive_skb 和网卡驱动的 net_device 函数来分析是否存在硬件故障或驱动问题。

echo
netif_receive_skb > /sys/kernel/debug/tracing/set_ftrace_filter

五、禁用跟踪和清理

完成分析后,记得停止跟踪并清理 ftrace 配置,以较少对系统性能产生影响。

停止跟踪:echo
0 > /sys/kernel/debug/tracing/tracing_on

清理过滤器:echo >
/sys/kernel/debug/tracing/set_ftrace_filter

六、总结

通过使用
ftrace 工具跟踪内核中的网络函数调用,我们可以非常方便地分析网络丢包的问题。在本例中,我们通过跟踪
tcp_sendmsg 和 tcp_recvmsg 函数,结合
tcp_retransmit_skb 和 netif_receive_skb 等内核函数的日志,能够帮助我们快速定位丢包的原因。无论是网络拥塞、内核调度问题,还是硬件故障,ftrace 提供了一个非常强大的工具来诊断内核中的各类问题。

使用 ftrace 跟踪内核丢包问题定位的实践的更多相关文章

  1. 利用ftrace跟踪内核static tracepoint——实例writeback event

    摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求.关于linux tracepoint的详细信息,我们可以在 ...

  2. 利用ftrace跟踪内核static tracepoint

    摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求.关于linux tracepoint的详细信息,我们可以在 ...

  3. linux 从softnet_stat查看内核丢包信息

    1.从系统整体来考虑,通过netstat 查看: [root@localhost net]# netstat -s |grep drop 3168 outgoing packets dropped 1 ...

  4. ECS实例中的应用偶尔出现丢包现象并且内核日志(dmesg)存在“kernel: nf_conntrack: table full, dropping packet”的报错信息

    问题描述 连接ECS实例中的应用时偶尔出现丢包现象.经排查,ECS实例的外围网络正常,但内核日志(dmesg)中存在"kernel: nf_conntrack: table full, dr ...

  5. 七种可能 | Linux丢包故障的定位与解决

    出处[云英公众号]:https://mp.weixin.qq.com/s?__biz=MzI1NzM3NTYxMw==&mid=2247483685&idx=1&sn=95c8 ...

  6. [转]nf_conntrack: table full, dropping packet 连接跟踪表已满,开始丢包 的解决办法

      nf_conntrack: table full, dropping packet  连接跟踪表已满,开始丢包 的解决办法 中午业务说机器不能登录,我通过USM管理界面登录单板的时候发现机器没有僵 ...

  7. libpcap丢包原理分析及Fedora 9 内核2.6.25.14下安装PF-RING的详细过程

    看到网上有人讲解fedora 9下安装PF-RING的过程,都是几年前的了,比较老了,我安装PF-RING就是为了使用libpcap库,libpcap的原理是通过socket 将数据包从网卡 捕获数据 ...

  8. linux fedora 14(内核2.6.35.6) PF_RING+libpcap 极速捕获千兆网数据包,不丢包

    前面讲到了libpcap 捕获数据包,尤其在千兆网的条件下,大量的丢包,网上搜索好久,大概都是PF_PACKET +MMAP,NAPI,PF_RING之类的方法,我对PF_RING+libpcap进行 ...

  9. 定位公网丢包的工具 mtr

    1.使用mtr工具,可以显示从本机到目的ip之间的沿途路由器,从而可以确定丢包的位置. 2.windows 系统,可以使用winmtr工具.

  10. openStack 云平台管理节点管理网口流量非常大 出现丢包严重 终端总是时常中断问题调试及当前测试较有效方案

    tuning for Data Transfer hosts connected at speeds of 1Gbps or higher <一.本次OpenStack系统调试简单过程简单记录& ...

随机推荐

  1. laravel proc_get_status() has been disabled for security reasons

    解决办法: 在php.ini中,找到disable_functions选项,看看后面是否有proc_open函数被禁用了,去掉proc_get_status,proc_open即可

  2. delphi 让子窗体显示最大化

    procedure TForm2.FormCreate(Sender: TObject); begin perform(WM_SIZE,SIZE_MAXIMIZED,0); end;

  3. MySQL 的 JSON 查询

    MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件] 路 ...

  4. 《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理

    <机器人SLAM导航核心技术与实战>第1季:第3章_OpenCV图像处理 视频讲解 [第1季]3.第3章_OpenCV图像处理-视频讲解 [第1季]3.1.第3章_OpenCV图像处理_认 ...

  5. 比cat更好用的命令!

    大家好,我是良许. 作为程序员,大家一定对 cat 这个命令不陌生.它主要的功能就是用来显示文本文件的具体内容. 但 cat 命令两个很重大的缺陷:1. 不能语法高亮输出:2. 文本太长的话无法翻页输 ...

  6. HTB打靶记录-EscapeTwo

    信息收集 nmap -sV -sC -O 10.10.11.51 Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-05 14:52 CST Sta ...

  7. eolinker环境变量配置:用例执行前给把某参数设置为全局参数的方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 1.场景分析 注册会员流程共计有添加数据,校验数据,提交 ...

  8. MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?

    MySQL InnoDB 引擎中的聚簇索引和非聚簇索引的区别 在 MySQL 的 InnoDB 存储引擎中,聚簇索引和非聚簇索引是两种常见的索引类型,它们在数据存储结构和使用场景上有显著区别. 1. ...

  9. 技术-Todo

    本文描述下一步调研的技术系统 技术 地址 状态 数据库中间件 https://vitess.io/zh/ Todo

  10. 学习nodejs的一点笔记

    >>1.模块:一个文件即为一个模块 1)global可以声明全局变量 (跨模块) 例如:global a = 100; console.log(global.a);   //输出100 2 ...