Linux的系统级性能剖析工具-perf-1
- 格式:pdf
- 大小:680.08 KB
- 文档页数:9
linux上perf工具使用方法
Perf是用来进行软件性能分析的工具,它可以分析指定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,还可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。
使用Perf可以分析程序运行期间发生的硬件事件,比如instructions retired、Processor clock cycles等;也可以分析软件事件,比如Page Fault和进程切换。
它还具有众多的性能分析能力,例如,可以计算每个时钟周期内的指令数(IPC),IPC偏低表明代码没有很好地利用CPU;可以对程序进行函数级别的采样,从而了解程序的性能瓶颈究竟在哪里。
总的来说,Perf是一款强大的性能分析工具,可以帮助用户深入了解应用程序和内核的性能。
在使用Perf时,用户需要根据具体的需求和场景选择适当的命令和参数,以获得准确的分析结果。
perf 命令实例# 使用perf命令进行系统性能分析。
在Linux系统中,perf命令是一个非常强大的性能分析工具,它可以用来对系统的各种性能指标进行监测和分析。
通过perf命令,我们可以了解系统的CPU利用率、内存使用情况、磁盘IO性能等关键指标,帮助我们找出系统性能瓶颈并进行优化。
下面我们来看一个实际的perf命令使用实例。
## 实例,监测CPU利用率。
假设我们想要监测系统中某个进程的CPU利用率,我们可以使用perf命令来实现。
首先,我们需要安装perf工具(在大多数Linux发行版中,它会随着内核一起安装)。
bash.perf stat -p <pid>。
上面的命令将监测指定进程的CPU利用率,并在监测结束后显示统计结果。
## 实例,性能事件采集。
除了监测CPU利用率,perf还可以用来采集各种性能事件,比如指令执行、缓存命中率等。
以下是一个示例命令,用来采集指令执行事件:bash.perf record -e instructions -p <pid>。
上面的命令将采集指定进程的指令执行事件,并将结果保存到perf.data文件中。
## 实例,性能图形化展示。
perf还提供了一些工具来对采集到的性能数据进行图形化展示,比如perf report和perf annotate。
这些工具可以帮助我们更直观地了解系统的性能状况,并找出性能瓶颈。
bash.perf report.上面的命令将以图形化界面展示perf.data文件中的性能数据统计结果。
总结来说,perf命令是一个非常强大的系统性能分析工具,通过它我们可以方便地监测系统各种性能指标,并进行深入的性能分析。
希望本文的实例能够帮助你更好地使用perf命令进行系统性能分析。
perf用法详解perf是Linux系统下的性能分析工具,可以用于分析程序的性能瓶颈和优化程序。
下面将详细介绍perf的用法和常见用法。
一、perf的基本用法1.安装perf在Ubuntu系统下,可以使用以下命令安装perf:2.使用perf record记录性能事件使用以下命令可以记录程序运行时的性能事件:其中,-g表示记录调用栈信息,-p表示记录指定进程的pid。
执行完毕后,会生成一个名为perf.data的文件,其中包含了程序运行时的性能事件信息。
3.使用perf report分析性能事件使用以下命令可以分析perf.data文件中的性能事件:该命令会显示程序运行时的性能事件报告,包括每个函数的CPU占用情况、调用栈信息等。
二、perf的常见用法1.性能分析使用perf record和perf report可以分析程序的性能瓶颈,找到CPU占用较高的函数或线程,从而进行优化。
2.内存泄漏检测使用perf工具可以检测程序的内存泄漏情况。
例如,可以使用以下命令检测程序是否存在内存泄漏:其中,-o表示输出结果到指定文件,--表示后面的参数为程序和参数。
执行完毕后,生成一个名为output_file的文件,其中包含了程序运行时的性能事件信息。
然后可以使用以下命令分析内存泄漏:其中,--sort=dso表示按照共享库名称进行排序,--dso表示只显示共享库名称。
执行完毕后,会显示程序运行时的内存占用情况报告,包括每个共享库的内存占用情况、调用栈信息等。
如果某个共享库的内存占用较高,则可能是该共享库存在内存泄漏问题。
3.缓存失效分析使用perf工具可以分析程序的缓存失效情况。
例如,可以使用以下命令分析程序运行时的缓存失效情况:其中,--表示后面的参数为程序和参数,--表示其他选项参数。
执行完毕后,生成一个名为output_file的文件,其中包含了程序运行时的性能事件信息。
然后可以使用以下命令分析缓存失效情况:其中,--sort=sym表示按照函数名称进行排序。
Linux高级系统调优使用perf和sysstat工具Linux是一种开放源代码的操作系统,具有很强的可定制性和可扩展性,因此被广泛应用于服务器和高性能计算领域。
随着软硬件技术的不断进步,对Linux系统的性能优化需求也越来越高。
在这篇文章中,我们将介绍如何使用perf和sysstat工具进行Linux高级系统调优。
一、perf工具的介绍和使用perf工具是Linux上的性能分析工具,可以对系统的各种资源进行跟踪和分析,以帮助开发人员深入了解系统的运行情况。
下面我们将介绍几个常用的perf命令。
1. perf topperf top命令可以显示当前运行进程中的资源消耗最多的函数,以及它们在代码中的位置。
这对于快速定位性能瓶颈非常有用。
2. perf recordperf record命令可以跟踪指定进程或命令的系统调用和函数调用,生成一个数据文件用于后续的分析。
例如,可以使用以下命令跟踪一个名为"example"的进程的系统调用:perf record -p example3. perf reportperf report命令可以分析perf record生成的数据文件,并以报告的形式展示各种性能指标。
它可以展示函数的调用关系、执行时间、资源占用等信息,帮助我们全面理解系统的性能状况。
二、sysstat工具的介绍和使用sysstat工具是Linux上的系统状态统计工具,可以收集和分析系统的各种资源使用情况,如CPU、内存、磁盘和网络等。
下面我们将介绍几个常用的sysstat命令。
1. sarsar命令用于收集和报告系统的各种资源使用情况,可以显示CPU 的利用率、内存的使用情况、磁盘的IO等信息。
例如,可以使用以下命令显示CPU的利用率和平均负载:sar -u2. iostatiostat命令用于显示磁盘IO的情况,可以查看磁盘的读写速度、IO 等待时间等信息。
例如,可以使用以下命令显示磁盘的IO情况:iostat -d3. mpstatmpstat命令用于显示多核CPU的利用率,可以查看每个核心的平均负载、用户态和内核态的CPU时间等信息。
linux perf 案例摘要:1.Linux Perf 简介2.Linux Perf 案例分析a.性能瓶颈识别b.性能分析工具使用c.优化方案及实践3.总结与展望正文:Linux Perf 是一款用于分析系统性能的工具,它能够帮助用户识别性能瓶颈,找到性能优化的方法。
本文将通过一个实际案例,详细介绍如何使用Linux Perf 工具进行性能分析与优化。
1.Linux Perf 简介Linux Perf,全称Linux Performance Analysis,是Linux 内核中提供的一款性能分析工具。
它通过收集和分析系统各个方面的性能数据,帮助用户了解系统性能状况,从而找到性能优化的方法。
Linux Perf 具有丰富的功能和灵活的定制选项,可以满足不同场景下的性能分析需求。
2.Linux Perf 案例分析在一个实际的Linux 系统性能优化案例中,我们首先需要识别性能瓶颈。
这里,我们通过使用Linux Perf 工具,对系统进行全面的性能分析。
a.性能瓶颈识别在进行性能分析之前,需要确保Linux Perf 已经安装并配置好。
然后,通过运行`perf record`命令,对系统进行实时性能数据采集。
采集完成后,使用`perf report`命令生成性能报告,从而直观地了解系统性能状况。
b.性能分析工具使用在性能报告中,我们可以看到系统各个方面的性能数据,如CPU 使用率、内存使用情况、磁盘I/O 性能等。
结合这些数据,我们可以初步判断性能瓶颈所在。
例如,如果CPU 使用率过高,可能是因为程序算法不够优化;如果内存使用率过高,可能是因为程序存在内存泄漏问题。
c.优化方案及实践根据性能报告,我们找到了性能瓶颈所在,接下来就是制定优化方案并实践。
这里,我们以CPU 使用率过高为例,介绍优化过程。
首先,可以通过调整CPU 调度策略,如使用`scheduler- governor`工具,优化CPU 负载均衡。
perf 用法perf 是 Linux 系统下一个用于性能优化的工具,它可以对系统进行采样分析,对系统瓶颈进行定位。
以下是 perf 的用法:1. 安装 perf通常在 Linux 系统中,可以使用以下命令来安装 perf:```sudo apt-get install linux-tools-commonsudo apt-get install linux-tools-`uname -r````安装后可以用以下命令检查 perf 是否安装成功:```perf --version```2. perf 的基本用法perf 的基本用法为:```perf [record|stat] [options] [command [arguments...]]```其中 record 和 stat 分别表示采样和统计模式,options 为 perf 命令的选项,command 和 arguments 是 perf 采集数据所需的命令。
例如:```perf record -o perf.data ls```表示在执行 ls 命令时,采集性能数据并将结果存储在 perf.data 文件中。
3. 使用 perf report 分析 perf 数据当 perf 采集到性能数据后,可以使用 perf report 命令进行展示和分析。
例如:```perf report -i perf.data```即可展示 perf.data 文件中记录的数据。
4. 使用 perf top 监控 CPU 占用率perf top 是一种交互式监控工具,可以实时展示 CPU 占用情况。
例如:```perf top```即可实时监控系统进程占用情况。
5. perf 故障排查perf 还可以在出现故障时进行 debug,例如:```perf record -g ./my_programperf report -g```该命令将采集 my_program 进行运行时的函数调用栈,通过 perf report -g 命令可以展示和分析故障。
Linux的系统级性能剖析工具‐perf(一)承刚TAOBAO Kernel Teamchenggang.qin@前言在软件规模庞大与硬件成本相对廉价的时代,系统级性能分析和优化常被开发与测试人员忽视。
但是随着虚拟化和云计算时代的到来,对计算资源按需付费的盈利模式要求系统软件与应用软件的开发者们必须对硬件资源的使用效率精益求精。
在嵌入式领域更是如此。
而且在互联网企业中,应用程序的性能提升对节约服务器成本来说至关重要。
由于服务器集群异常庞大,软件性能的些许提升都有可能带来成本的大幅降低[1]。
系统级性能优化是提升程序性能的重要步骤。
但是,目前针对系统级性能优化的参考资料很稀缺,开发与测试人员往往不了解系统级性能优化的意义和方法。
系统级性能优化是指为了提高应用程序对操作系统资源与硬件资源的使用效率,或者为了提高操作系统对硬件资源的使用效率而进行的代码优化。
通过提高对操作系统资源与硬件资源的利用率,使得应用程序与基础软硬件平台具有更好的交互性,往往可以显著提升应用程序的执行速度和稳定性。
系统级性能优化通常包括2个阶段,分别是性能剖析(performance profiling)和代码优化。
性能剖析阶段的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。
代码优化阶段的目标是针对具体的性能问题而优化代码与编译选项,以改善软件性能。
在代码优化阶段往往需要凭借开发者的经验,编写简洁高效的代码,甚至在汇编语言级别合理使用各种指令,合理安排各种指令的执行顺序。
而在性能剖析阶段,则需要借助于现有的profiling工具,如perf,VTune,Oprofile等。
其中perf相比较于其它工具而言,具有特殊的优势。
它不仅开源,而且内置于内核源码树。
在如今upstream kernel的开发中,perf是发展较快的领域之一。
淘宝内核组也介入了perf的开发工作。
本文是系统级性能分析系列文章的第一篇,主要介绍性能分析工具perf的使用方法。
后续还会有介绍系统级性能分析方法以及代码优化方法的文章。
第一章 Perf简介1.1 perf的基本原理Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。
它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。
可用于性能瓶颈的查找与热点代码的定位。
我们先通过一个例子来看看perf究竟能干什么。
程序[code1]是一个简单的计算pi的计算密集型程序。
很显然,[code1]的热点在函数do_pi()中。
[code1]#include <stdio.h>#include <math.h>#include <sys/types.h>#include <linux/unistd.h>int do_pi(){double mypi,h,sum,x;long long n,i;n = 5000000;h = 1.0 / n;sum=0.0;for (i = 1; i <= n; i+=1 ) {x = h * (i ‐ 0.5);sum += 4.0 / (1.0 + pow(x,2));}mypi = h * sum;return 0;}int main(){printf("pid: %d\n", getpid());sleep(8);do_pi();return 0;}运行[code1]后,根据程序显示的pid在命令行中执行:$perf top ‐p $pid该命令利用默认的性能事件”cycles”对[code1]进行热点分析。
”cycles”是处理器周期事件。
这条命令能够分析出消耗处理器周期最多的代码,在处理器频率稳定的前提下,我们可以认为perf给出热点代码的就是消耗时间最多的代码段。
执行上述命令后,Perf会给出如下结果:图1. Perf对程序[code1]的分析结果从图1上可以看到,在[code1]执行期间,函数do_pi()消耗了99.54%的CPU 周期,是消耗处理器周期最多的热点代码。
这跟我们预想的一样。
那么perf是怎么做到的呢?首先,perf会通过系统调用sys_perf_event_open 在内核中注册一个监测“cycles”事件的性能计数器。
内核根据perf提供的信息在PMU上初始化一个硬件性能计数器(PMC: Performance Monitoring Counter)。
PMC 随着CPU周期的增加而自动累加。
在PMC溢出时,PMU触发一个PMI (Performance Monitoring Interrupt)中断。
内核在PMI中断的处理函数中保存PMC的计数值,触发中断时的指令地址(Register IP:Instruction Pointer),当前时间戳以及当前进程的PID,TID,comm等信息。
我们把这些信息统称为一个采样(sample)。
内核会将收集到的sample放入用于跟用户空间通信的Ring Buffer。
用户空间里的perf分析程序采用mmap机制从ring buffer中读入采样,并对其解析。
perf根据pid,comm等信息可以找到对应的进程。
根据IP与ELF文件中的符号表可以查到触发PMI中断的指令所在的函数。
为了能够使perf读到函数名,我们的目标程序必须具备符号表。
如果读者在perf的分析结果中只看到一串地址,而没有对应的函数名时,通常是由于在编译时利用strip删除了ELF文件中的符号表。
建议读者在性能分析阶段,保留程序中的symbol table,debug info 等信息。
根据上述的perf采样原理可以得知,perf假设两次采样之间,即两次相邻的PMI中断之间系统执行的是同一个进程的同一个函数。
这种假设会带来一定的误差,当读者感觉perf给出的结果不准时,不妨提高采样频率,perf会给出更加精确的结果。
1.2 perf功能概述Perf是一个包含22种子工具的工具集,功能很全面。
表1给出了各个子工具的功能描述。
表1. Perf中的子工具1 annotate根据数据文件,注解被采样到的函数,显示指令级别的热点。
2 archive 根据数据文件中记录的build‐id,将所有被采样到的ELF 文件打成压缩包。
利用此压缩包,可以在任何机器上分析数据文件中记录的采样数据。
3 benchPerf中内置的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。
4 buildid‐cache管理perf的buildid缓存。
每个ELF文件都有一个独一无二的buildid。
Buildid被perf用来关联性能数据与ELF文件。
5 buildid‐list 列出数据文件中记录的所有buildid。
6 diff对比两个数据文件的差异。
能够给出每个符号(函数)在热点分析上的具体差异。
7 evlist 列出数据文件中的所有性能事件。
8 inject 该工具读取perf record工具记录的事件流,并将其定向到标准输出。
在被分析代码中的任何一点,都可以向事件流中注入其它事件。
9 kmem 针对内存子系统的分析工具。
10 kvm此工具可以用来追踪、测试运行于KVM虚拟机上的Guest OS。
11 list列出当前系统支持的所有性能事件。
包括硬件性能事件、软件性能事件以及检查点。
12 lock分析内核中的加锁信息。
包括锁的争用情况,等待延迟等。
13 record收集采样信息,并将其记录在数据文件中。
随后可通过其它工具对数据文件进行分析。
14 report读取perf record创建的数据文件,并给出热点分析结果。
15 sched 针对调度器子系统的分析工具。
16 script执行perl或python写的功能扩展脚本、生成脚本框架、读取数据文件中的数据信息等。
17 stat剖析某个特定进程的性能概况,包括CPI、Cache丢失率等。
18 test Perf对当前软硬件平台的测试工具。
可以用此工具测试当前的软硬件平台(主要是处理器型号和内部版本)是否能支持perf的所有功能。
19 timechart 生成一幅描述处理器与各进程状态变化的矢量图。
20 top 类似于Linux的top命令,对系统性能进行实时分析。
21 trace strace inspired tool.22 probe 用于定义动态检查点。
本文介绍了这22个工具中的绝大部分,由于精力与时间所限,忽略了几个不常用的工具,或许会在下一版中补充完全。
第二章 perf list工具和性能事件2.1 perf list简介利用perf剖析程序性能时,需要指定当前测试的性能事件。
性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件。
比如Cache丢失,流水线停顿,页面交换等。
这些事件会对程序的执行时间造成较大的负面影响。
在优化代码时,应尽可能减少此类事件发生。
因此,必须先利用perf等性能剖析工具查找到引发这些性能事件的热点代码以及热点指令。
perf定义的性能事件分为3类,分别是硬件性能事件、软件性能事件与Tracepoint Events.不同型号的CPU支持的硬件性能事件不尽相同。
不同版本的内核提供的软件性能事件与Tracepoint events也不尽相同。
因此,perf提供了list工具用以查看当前软硬件平台支持的性能事件列表。
list工具的使用方法如下:$perf list执行该命令后,perf将给出当前软硬件平台上支持的所有性能事件。
输出结果如图2所示。
每行后面括弧里的信息表示该事件是硬件事件、软件事件还是Tracepoint events。
2.2 性能事件的属性硬件性能事件由处理器中的PMU提供支持。
如前文所述,perf会对PMI中断发生时的PC寄存器进行采样。
由于现代处理器的主频非常高,再加上深度流水线机制,从性能事件被触发,到处理器响应PMI中断,流水线上可能已处理过数百条指令。
那么PMI中断采到的指令地址就不再是触发性能事件的那条指令的地址了,而且可能具有非常严重的偏差。
为了解决这个问题,Intel处理器通过PEBS机制实现了高精度事件采样。
PEBS通过硬件在计数器溢出时将处理器现场直接保存到内存(而不是在响应中断时才保存寄存器现场),从而使得perf能图2. Perf list工具的输出结果够采到真正触发性能事件的那条指令的地址,提高了采样精度。
在默认条件下,perf不使用PEBS机制。
用户如果想要使用高精度采样,需要在指定性能事件时,在事件名后添加后缀”:p”或”:pp”。
如:$perf top ‐e cycles:ppPerf在采样精度上定义了4个级别,如表2所示。