NXP i.MX8系列平台开发讲解 - 5.4 调试篇 - 掌握perf 工具调试(一)

专栏文章目录传送门返回专栏目录

Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】


文章目录

目录

掌握perf 工具调试(一)

1. Perf 工具介绍

1.1 Perf 工作原理

1.2 Perf 工具基本功能

2. Perf 安装和基本使用

2.1 perf list

2.2 perf probe

2.3 perf stat

2.4 perf record/report

2.5 perf annotate

2.6 perf top

3. 总结


掌握perf 工具调试(一)

在作为一个嵌入式软件工程师中,置身于Linux 当中,无论在在做系统方面还是应用方面,满足了基本功能需求,后期还需要去考量性能方面的问题,需要考虑自身添加的部分是否带来一些隐患,或者起到一定的优化,结构代码设计是合理等。

对于性能分析工具目前有很多种如下图,做过性能分析都看过这张图,本章节主要介绍Perf工具;

1. Perf 工具介绍

Perf(Performance Analysis Tools for Linux)是一个功能强大且灵活的性能分析工具,主要用于 Linux 系统中的性能调优和分析。它能够帮助开发者深入了解系统和应用程序的性能瓶颈,并提供详细的分析报告。作为嵌入式软件工程师,掌握和使用 Perf 工具可以显著提升开发效率和产品性能。

Perf 主要包含两个部分:

  • perf 命令,用户空间的应用程序

  • perf_events ,Linux 内核中的一个子系统

perf 命令

Perf 命令是一个用户空间工具,具备 profiling、tracing 和脚本编写等多种功能,是内核子系统 perf_events 的前端工具。通过 perf 命令,用户可以设置和操作内核子系统 perf_events,完成系统性能数据的收集和分析。

perf_events 子系统:

内核子系统 perf_events 提供了性能计数器(hardware performance counters)和性能事件的支持。它采用事件驱动的方式,通过收集特定事件(如 CPU 时钟周期、缓存未命中等)来跟踪和分析系统性能。perf_events 于 2009 年被合并到 Linux 内核源代码中,成为内核的一个子系统。

1.1 Perf 工作原理

Perf 工具依赖于硬件性能计数器(Performance Monitoring Unit, PMU),这些计数器存在于现代 CPU 中,用于跟踪和记录各种硬件事件,如 CPU 周期、缓存命中/未命中、分支预测命中/未命中等。

工作过程:

  • 用户通过输入perf命令进行设置相关的需要的时间类型;

  • perf 定制读取计数器的值,获取采用数据,并将存放在ring bufferr中;

  • 用户通过perf report 和 perf script 从ring buffer 中读取数据生成分析报告。

perf工具是一个功能强大且灵活的性能分析工具。它提供了多种功能。首先,perf可以用于收集各种系统性能数据,包括CPU利用率、内存使用情况、磁盘IO、网络传输等等。通过收集和分析这些数据,可以了解系统的瓶颈和性能瓶颈,并针对性地进行优化。

1.2 Perf 工具基本功能

事件采集:Perf 能够捕获各种硬件和软件事件,包括 CPU 周期、缓存命中/未命中、中断、系统调用等。

统计分析:对采集到的事件进行统计分析,生成性能报告。

热点分析:通过分析程序执行中的热点代码,定位性能瓶颈。

跟踪和测量:可以对系统调用、上下文切换、任务调度等进行详细跟踪和测量。

火焰图:生成可视化的火焰图,帮助开发者直观地理解性能问题。

2. Perf 安装和基本使用

在ubuntu 系统直接安装命既可:

sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

假如是在嵌入式设备中,需要内核配置支持:

CONFIG_PERF_EVENTS=y

命令结构:

perf <command> [options] [arguments]

常用的命令语法:

#
perf stat 

2.1 perf list

perf list 该命令列出特定机器上可用的性能事件。不同电脑配置可能存在不一样的差异。

perf list
# 硬件事件
perf list hw
# 软件事件
perf list sw

事件类型一般有三种:

  • Hardware events: 硬件事件是直接由处理器性能监视单元(PMU)提供的数据,通常用于分析处理器内部行为,比如L2 缓存命令等;

  • Software events : 软件事件由内核提供,用于跟踪操作系统级别的活动。

  • Hardware cache events: 这些事件专门用于分析不同层次缓存的性能。

  • Kernel PMU events : 内核 PMU 事件由内核性能监视单元提供,专用于分析内核级别的行为。

2.2 perf probe

perf probe 允许用户动态地向正在运行的内核或用户空间应用程序中插入探针(probe)。这些探针可以用于监控特定函数的调用,记录函数的参数值和返回值等,用于性能分析和调试。perf probe 可以帮助开发人员深入了解程序的运行行为,从而识别和优化性能瓶颈。

perf probe [<options>] <probe-point> [<probe-point> ...]
​
# 例子:添加一个探针,在do_sys_open入口插入一个
perf probe do_sys_open
# 带参数的探针
perf probe 'do_sys_open filename'
​
# 查看已经添加的探针
perf probe -l
​
# 删除探针
perf probe -d do_sys_open
​
# 使用探针进行性能分析
# 例子:在系统运行 10 秒钟内记录 do_sys_open 函数的调用,并生成一份性能报告
perf record -e probe:do_sys_open -aR sleep 10
perf report

2.3 perf stat

perf stat 命令执行指定的命令,对命令执行期间发生的硬件和软件事件进行持续计数,并生成这些计数的统计数据。

Usage: perf stat [<options>] [<command>]
​
# 命令perf stat -p <pid>可以采集某一个进程的运行信息
perf stat -p 344
​
# 例子: zero文件读取输入写到空设备中,连续写888888个block:
perf stat -B dd if=/dev/zero of=/dev/null count=888888

2.4 perf record/report

perf record 命令进行采集数据,把数据写入数据文件从,后续可以通过perf report命令对数据进行分析。

perf stat 
​
# 例子:用1000统计频率,统计一个sleep 5秒过程中
perf record -a -F 1000 sleep 1
perf report

2.5 perf annotate

perf annotate 命令主要读取perf.data文件(由perf record命令创建)并显示注释后的代码。 可以去展现源代码和汇编代码的对应关系,帮助开发者找到性能瓶颈和热点代码。

 Usage: perf annotate [<options>]

# 注释汇编代码
perf annotate -i perf.data

2.6 perf top

perf top 是一个实时性能监控工具,类似于 top 命令,但专注于性能事件。它能够实时显示系统中消耗 CPU 周期最多的函数和代码段,帮助开发者快速定位性能瓶颈。

perf top [<options>]


# 监控指定进程的性能事件
perf top -p 12345

# 监控指定用户的性能事件
perf top -u john

# 监控特定事件
perf top -e cycles

3. 总结

本章节主要对Perf 的基本定义还有一些功能进行一个了解,主要用于在开发工程中调试,优化有一定的作用,下一个章节将以实际例子进行如何去使用它,分析开发过程中遇到的问题。

参考:

Linux Performance

<think>我们正在分析用户的问题:用户在使用iperf3进行TCP性能测试时遇到了性能差的问题,想要查找原因。根据用户提供的引用内容,我们可以获得些线索:引用[1]中展示了个使用perf工具分析CPU性能的示例,其中iperf进程的CPU时间主要消耗在内核空间的网络相关函数中(如tcp_sendmsg,tcp_transmit_skb等)。这表明网络栈的处理可能成为瓶颈。引用[2]提到火焰图(flamegraphs)是种有效的可视化CPU性能分析的工具,可以帮助我们找到性能瓶颈。它不仅可以揭示CPU问题,还可以揭示锁竞争、内存分配问题等。引用[3]是关于串行端口设备名的解释,与当前问题关系不大,但用户之前可能涉及串口配置,不过当前问题聚焦在iperf3的TCP性能。因此,我们可以从以下几个方面进行排查:1.CPU性能分析:使用perf工具分析CPU使用情况,查看是否在内核网络栈上花费过多时间。2.网络配置检查:检查网络接口的配置,包括MTU、TCP窗口大小、拥塞控制算法等。3.系统参数调优:检查并调整TCP相关的系统参数,如TCP缓冲区大小。4.其他因素:如网卡性能、中间网络设备、系统负载等。下面我们将详细展开。</think>### iperf3 TCP性能测试缓慢的原因分析 使用iperf3进行TCP性能测试时出现速度慢的情况,可能涉及多个层面的问题。以下是常见原因及排查方法: #### 1. **网络栈瓶颈分析** - **内核网络路径优化不足** 如引用[1]所示,当TCP性能瓶颈出现在内核网络栈时(如`tcp_sendmsg`、`tcp_transmit_skb`等函数),可使用perf工具分析: ```bash perf record -e cpu-clock -g -p <iperf_pid> -F 99 perf script | flamegraph.pl > iperf.svg ``` 火焰图能清晰展示CPU时间消耗热点(如图1.6所示)[^2]。 - **TCP缓冲区设置不当** 检查并调整系统TCP缓冲区参数: ```bash sysctl net.ipv4.tcp_rmem # 接收缓冲区 sysctl net.ipv4.tcp_wmem # 发送缓冲区 ``` 建议值(示例):`net.ipv4.tcp_rmem = 4096 87380 16777216` #### 2. **硬件与驱动层问题** - **网卡队列配置** 检查多队列网卡配置: ```bash ethtool -l eth0 # 查看队列数量 ethtool -L eth0 combined 8 # 启用多队列 ``` - **中断均衡** 使用`irqbalance`服务或手动设置CPU亲和性: ```bash echo 0-7 > /proc/irq/<irq_num>/smp_affinity_list ``` #### 3. **TCP协议参数调优** | 参数 | 建议值 | 检查命令 | |---------------------|---------------|-----------------------| | 拥塞控制算法 | BBR或CUBIC | `sysctl net.ipv4.tcp_congestion_control` | | 窗口缩放因子 | 启用 | `sysctl net.ipv4.tcp_window_scaling=1` | | TIME_WAIT回收 | 快速回收 | `sysctl net.ipv4.tcp_tw_recycle=1` | #### 4. **iperf3特定因素** - **测试参数验证** 排除反向测试(`-R`)、并行流(`-P`)的影响: ```bash iperf3 -c server -P 4 -t 30 # 测试4个并行流 ``` - **CPU亲和性绑定** 避免CPU资源竞争: ```bash taskset -c 0-3 iperf3 -c server # 绑定到0-3号CPU核心 ``` #### 5. **环境干扰排查** - **中间网络设备** 检查交换机/路由器QoS策略、MTU设置(`ping -M do -s 1472 server`) - **系统负载** 使用`vmstat 1`监控CPU空闲和上下文切换(`cs`)值 > **关键诊断步骤**: > 1. 在服务器端运行`iftop -P`观察实时流量 > 2. 客户端执行`ss -ti`检查TCP连接状态(如`ssthresh`、`cwnd`值) > 3. 通过`ethtool -S eth0`查看网卡丢包统计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码思途远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值