专栏算法工具链Linux性能优化工具

Linux性能优化工具

新手村2025-09-30
54
0

 1.概述

Linux的性能问题,依赖于各类性能工具,针对不同性能场景,选择合适的工具,可以大大提高整个性能优化的效率,下图是性能问题和工具图谱:

../../_images/image-2.png

受限本文篇幅和侧重,结合征程系列SoC调优实践,主要展开介绍下面的工具及使用。

1.1. top

top 命令可以动态地持续监听系统及进程的运行状态,为用户提供CPU使用率、内存使用情况、CPU负载信息,除此之外,该命令还提供了一个交互界面,用户可以根据需要进行调整。

  • 通过top命令分析内存使用状态比较简单清晰,本文就不做赘述。

  • 由于智能驾驶的应用场景复杂,CPU处于较高水平的逻辑和运算占用,导致系统的负载和使用率长期处于较高水平,是性能优化的主要方向之一。

注:

智能驾驶应用场景中系统负载是和使用率同步升高,基本不存在IO或其他导致的负载提升,所以本文提到的负载和使用率的描述均可理解为使用率。

使用top命令监控系统及各进程的CPU使用率,是分析CPU占用高问题的主要方法,在使用前需要了解top的原理和限制,从而正确的使用和提取有效信息,进行有效分析。

1.1.1. top的原理

top命令的实现是通过采样proc下系统和进程的stat下的各类时间信息,经过计算得出来的平均使用率等信息。

  • CPU时间信息(单位为jiffies):

user

CPU上nice值不大于0的用户态任务的运行时间

nice

CPU上nice值大于0的用户态任务的运行时间

system

CPU上内核态的运行时间。包括用户态任务系统调用、异常等陷入内核消耗时间,也包括内核线程消耗的时间,但是不包括中断和软中断的执行时间

idle

处于idle任务的时间。不包括CPU上因为任务IO阻塞导致CPU上没有任务可运行、处于idle状态的时间

iowait

由于CPU上任务IO阻塞导致CPU无可运行任务、处于idle的时间。需要强调的是,iowait是在CPU处于idle状态下的一种特殊情况的时间,与上面的“idle”列互补构成CPU上真正处于idle的时间

irq

CPU进入到中断处理的时间

softirq

CPU处理软中断的时间,包括softirqd中处理软中断的时间

steal/guest

虚拟化相关

  • /proc/stat

记录了CPU从系统启动开始累计到当前时刻各类事件信息。

  • /proc/$PID/stat

记录了进程从启动开始累计到当前时刻各类事件信息。

  • 使用率计算方法

stat节点记录了的是从开机/进程启动后累计的时间信息,但这不能体现在当前时间段的实际负载情况,实际CPU使用率的计算方法如下(system、user、irq、softirq等类似):

采样的开始时间T1,结束时刻T2:

  1. Total(T1-T2) = (user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1)

  2. Idle(T1-T2) = (idle2 - idle1)

  3. CPU Usage (T1-T2) = 1 - Idle / Total

不难理解,最终CPU使用率主要受到从CPU获取到的时间信息,和采样周期时间的影响。

1.1.2. top的限制

  • CPU负载显示模式

Linux上top命令的CPU占用率显示有两种模式:

  1. Irix模式,按单个CPU上的算力计算。

  2. Solaris 模式,按所有CPU做平均计算。

例如一个8核系统,CPU0上一个进程CPU占用率是100%,其它CPU 是idle:

  • Irix模式,CPU0占用显示100%,进程的CPU也是100%。

  • Solaris模式,CPU0占用显示12.5%,进程的CPU也是12.5%。

当前Busybox的top命令,PER CPU的显示默认是Irix模式,进程显示是Solaris模式。

  • top周期的选定

CPU的使用率受到周期的影响,在CPU繁忙时使用“top -d1”和“top -d5”的结果差异是非常大的,周期越大,越接近实际平均负载。 考虑这样的一种极端场景,在1s的时间内,前100ms负载100%,后900ms CPU全部idle,以1s为周期,负载就是10%,以100ms为周期,负载就出现了100%的情况,基于以上情况考虑,我们一般建议以5s作为top的周期(“top -d5”)。

另外,需要特别注意的是,top命令适用于长时间的负载检测,对于一次性负载检查(”top -n1”),top实现中第一次top计算的周期是200ms,以200ms周期计算出来的CPU使用率非常不准,会对整体分析产生误导。

  • CPU使用率中包含iowait

一般理解中CPU使用率是指CPU忙占CPU总时间的比值,处于iowait的线程实际并不占用CPU,但是目前几乎所有的统计工具中,都把iowait统计到CPU使用率中。

1.1.3. top的使用

征程系列系统软件默认集成了top命令,使用方法如下:

1.2. df

用于显示系统磁盘使用情况,当磁盘/文件系统快满的时候,文件系统及磁盘硬件性能都会受到影响。

1.3. free&procrank

  • free用于显示系统级内存使用情况,通过/proc/meminfo可检查系统内存使用的细节。

  • procrank用于显示系统各进程的内存使用情况,查找内存使用超载或泄漏进程。

  • 当内存紧张时,系统性能表现将会受到较大影响,iowait的提升也会导致CPU使用率也会明显上升。

1.4. Perf

Perf是内置于Linux内核源码树中的性能剖析(profiling)工具,作为一款强大的综合性分析工具,能够提供从硬件到软件、从应用到内核的全栈性能分析方法,常用于性能瓶颈的查找与热点代码的定位。

1.4.1. Perf原理

Perf工具功能强大,通过下面的软、硬件能力实现性能profiling。

  1. Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。

  2. Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。

  3. Tracepoint Event是内核中静态tracepoint所触发的事件(ftrace),这些tracepoint用来判断程序运行期间内核的行为细节,perf在这种应用场景下,可理解为ftrace的一种前端工具。

1.4.2. Perf使用

Perf命令非常多,每个命令下又有很多子命令,所以本文只针对性介绍一些常用命令。

1.4.2.1. perf list

查看当前系统软、硬件支持的性能事件。

1.4.2.2. perf stat

统计cache、branch、context-switches等软硬件底层性能指标。

  • 使用ctrl+c退出。

  • perf stat -p 追踪指定进程的性能指标:

../../_images/image-3.png

1.4.2.3. perf top

  • 实时查看当前系统中所有(kernel,app)函数占用率情况,及irq统计。

  • “perf top -U”,U统计kernel中符号占用率。

  • “perf top -K”,K统计应用符号占用率。

  • “perf top -p ”,统计制定进程的符号占用情况。

  • “perf top -g”,记录占用率的同时保存函数调用栈情况。

  • “perf top -s dso”,以library&executed进行占用排序。

  • “perf top -s pid”,以pid进行占用排序。

../../_images/image-4.png

1.4.2.4. perf sched

  1. perf sched依赖开启ftrace,用于统计分析调度相关信息。

  2. perf sched record -p ,可抓取指定进程调度信息。

  3. perf sched latency --sort max,对record的数据进行runtime、delay等时间分析。

  4. perf sched timehist -wM,对record的数据进行调度时延的分析。

1.4.2.5. 火焰图

火焰图是分析系统、进程热点的强大工具,原理是通过PMU对CPU当前运行符号(PC)进行采样,再通过火焰图工具还原整个调用栈。

通过火焰图可以查看kernel+app的调用栈耗时状态,查找性能瓶颈。

  1. perf record -g -p ,记录系统/进程的堆栈采样数据,默认perf.data。

  2. perf script > perf.unflod,对record的调用栈等信息进行解析。

  3. 将perf.unflod导入PC机,使用火焰图工具出解析perf.svg。

  4. FlameGraph/stackcollapse-perf.pl perf.unflod FlameGraph/flamegraph.pl > perf.svg。FlameGraph工具从https://github.com/brendangregg/FlameGraph.git获取。

  5. 使用chrome浏览器打开。

../../_images/image-6.png

1.5. Ftrace功能

Ftrace功能的作用是帮助开发人员了解 Linux内核的运行时行为,以便进行故障调试或性能分析。

  • Ftrace通过静态和动态插装,实现对内核核心及热点函数的profiling,对于调度、io等问题是最重要的分析手段。

  • Ftrace需要使能内核CONFIG_FTRACE,当前默认打开。

  • Ftrace使用per-cpu的ring-buffer,内容为二进制格式,执行效率高。设置CONFIG_DYNAMIC_FTRACE后,加入的trace功能在不使用时对运行时系统性能几乎没有影响(初始化会对开机时间有一定影响),动态使能ftrace后,对运行时性能会有一定副作用。

  • Ftrace的调度profiling在内核中对热点函数大量埋点,导致系统会在几秒内产生百兆以上的log,通过log直接分析性能难度较大,所以一般会引入一些ftrace前端工具。

  • perf、trace-cmd、systemtap、bcc、kernelshark都是优秀的ftrace前端工具。可以通过这些工具去分析ftrace日志。

算法工具链
社区征文技术深度解析杂谈
评论0
0/1000