LinuxCNC性能剖析

系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。

性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。

在性能剖析阶段,需要借助于现有的 profiling 工具,探测相关模块的热点路径、耗时统计和占比。在代码优化阶段往往需要借助开发者的经验,编写简洁高效的代码,甚至在汇编级别合理使用各种指令,合理安排各种指令的执行顺序。

本文主要讲述性能剖析的方法,在这方面,Linux 操作系统自带了多种灵活又具有针对性的工具,此外一些厂家也开源了不少优秀的性能分析工具。下面介绍几种主流工具的使用方法。

perf

perf简介

perf 是 google 提供的一款强大的性能分析工具,它被广泛应用在内核和应用程序的性能分析当中。

Linux 性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。通过 perf,应用程序可以利用 PMU、tracepoint 和内核中的计数器来进行性能统计。

perf安装

在终端中输入 perf,如果提示 perf 的用法,则表明 perf 已经安装。如果提示命令未找到

$ perf
/usr/bin/perf: line 24: exec: perf_3.4: not found
E: linux-tools-3.4 is not installed.

由于 perf 命令包含在 linux-tools 包中,因此先查询其版本

$ apt-cache search linux-tools
linux-tools - Performance analysis tools for Linux (meta-package)
linux-tools-2.6 - Performance analysis tools for Linux (dummy package)
linux-tools-3.2 - Performance analysis tools for Linux 3.2
linux-tools-3.4 - Performance analysis tools for Linux 3.4

如果存在对应版本的 linux-tools 包,则直接安装即可

$ sudo apt-get install linux-tools-3.4

如果没有对应版本的 linux-tools,则可下载安装最新版本的 linux-tools-x.x,然后修改文件 /usr/bin/perf,将 exec "perf_$version" "$@" 修改为 exec "perf_x.x" "$@"

perf使用

假设 linuxcnc 程序的执行脚本在 /usr/linuxcnc2.7.14/scripts 下,则用 perf record 启动 linuxcnc

$ cd /usr/linuxcnc2.7.14/scripts/
$ sudo perf record -e cpu-clock --call-graph ./linuxcnc

软件启动后,执行加工,等到自动加工完成后,关闭软件。在当前目录下会生成 perf.data,使用 perf report -v -i perf.data,可以看到调用过程和执行时间统计

在这里插入图片描述

为了方便查看函数调用的细节,可以将分析报告导出到文件中

root@debian:/usr/linuxcnc2.7.14/scripts# perf report -v -i perf.data > report.log

该工具的详细介绍及其它选项见:https://www.cnblogs.com/arnoldlu/p/6241297.html

oprofile

oprofile简介

oprofile 库是 Linux 平台上的一个功能强大的性能分析工具,支持两种采样方式:基于事件的采样和基于时间的采样。

  1. 基于事件的采样:oprofile 只记录特定事件(比如 L2 cache miss)的发生次数,当达到用户设定的值时,oprofile 就记录一下(采样一次)。这种方式需要 CPU 内部有性能计数器。
  2. 基于时间的采样:oprofile 借助 OS 时钟中断的机制,每个时钟中断 oprofile 都会记录一次(采样一次),其精度相对于基于事件的采样要低。因为要借助 OS 时钟中断的支持,对禁用中断的代码 oprofile 不能对其进行分析。

oprofile 在 Linux 上分为两部分,一个是内核模块(oprofile.ko),一个是用户空间的守护进程(oprofiled)。

  1. oprofile.ko 负责访问性能计数器或者注册基于时间采样的函数(使用 register_timer_hook 注册之,使时钟中断处理程序最后执行 profile_tick 时可以访问之),并将采样置于内核的缓冲区内。
  2. oprofiled 在后台运行,负责从内核空间搜集数据,写入文件。

注意事项

  1. 不建议在虚拟机里利用 oprofile 来测试性能,因为虚拟机对 oprofile 支持不好。
  2. 调试的内核最好是原生的内核,发行版 Linux(比如 redhat)自带的内核一般都是经过大量修改的,对 oprofile 支持不好,所以我们最好从 kernel 官方网站上下载源码后自行编译生成内核,重启机器对新内核环境进行性能测试。另外,oprofile 需要的是未经压缩的内核镜像,所以 /boot 目录的 vmlinux-x.x.xx 是不能用的,而需要使用 Linux 源码编译目录里的未压缩镜像文件,比如 /usr/src/linux-2.6.30/vmlinux。
  3. 需要添加内核配置文件

oprofile 需要内核的支持,2.6 的 Linux 内核已经支持了这个功能,可以编译成模块或者直接编译进内核。一般发行版本是没有将此项功能编译进内核的,因此需要手动编译一个内核版本,

$ cat /boot/config-`uname -r` | grep OPROFILE
CONFIG_OPROFILE=m
CONFIG_HAVE_OPROFILE=y

如果没有则加上,CONFIG_OPROFILE=m 表示编译成模块,CONFIG_OPROFILE=y 表示直接编译进内核。如果 oprofile 编成了模块,则需要加载 oprofile 模块。

oprofile安装

直接到 http://oprofile.sourceforge.net/download/ 下载 oprofile 源码包到目标机器上,编译并安装。注意:安装时需要 root 权限。

$ sudo ./configure
$ sudo make
$ sudo make install

如果要卸载 oprofile,请执行如下命令

$ sudo make uninstall
版本说明

在 1.0 版本以前,oprofile 使用脚本命令 opcontroloprofiled 守护进程进行采样分析;在 0.9.8 版本,其被弃用,并引入 operf 工具进行采样分析。

一些旧的处理器和平台可能不支持 operf,运行 operf 会得到类似如下的提示信息

$ operf
Your kernel's Performance Events Subsystem does not support your processor type
Please use the opcontrol command instead of operf.

这时应该安装包含 opcontroloprofiled 的最新版本 0.9.9。

依赖库缺失

在执行 sudo ./configure 时,如果提示依赖库缺失

$ sudo ./configure
......
configure: error: liberty library not found

liberty 包含在 binutils-dev 包中,安装包

$ sudo apt-get install binutils-dev

oprofile使用

由于没有实体机做实验,这里只能用虚拟机代替,并且使用 opcontrol 命令进行演示。

  • 加载内核模块
# modprobe oprofile
  • 设置监视内核

第一次调用 opcontrol 时,必须告诉它想统计内核还是用户空间数据,由于没有可供调试的内核,因此用 --no-vmlinux 选项来取消内核统计

# opcontrol --no-vmlinux
  • 利用 oprofile 进行数据收集
# opcontrol --init		加载oprofile模块、oprofile驱动程序
# opcontrol --reset		清空之前检测的数据记录
# opcontrol --start		启动数据收集
# program run			运行被监视的应用程序
# opcontrol --dump		将oprofile检测到的数据写入文件
# opcontrol --stop		停止数据收集
# opcontrol --shutdown	停止数据收集,并关闭oprofile进程
# opcontrol --deinit	关闭oprofile后台进程,卸载oprofile模块
  • 查看结果
# opreport:默认查看oprofile检测结果
# opreport -l:以函数的角度显示检测结果
# opreport -l oprofile_test:以函数的角度,针对oprofile_test进程显示检测结果
# opannotate -s oprofile_test:以代码的角度,针对oprofile_test进程显示检测结果
# opannotate -s /lib64/libc-2.12.so:以代码的角度,针对libc-2.4.so库显示检测结果

可能是由于虚拟机或内核的缘故,这里用 oprofile 没有监测出应用程序的性能指数,如下图所示

在这里插入图片描述

疑难问题

如果启动 opcontrol --start 时,提示如下信息

# opcontrol --start
Cannot find event CPU_CLK_UNHALTED
Using default event: CPU_CLK_UNHALTED:100000:0:1:1
Cannot find event CPU_CLK_UNHALTED

则表明当前 CPU 不被 oprofile 识别,或者识别有问题,此时需进行基于时间的采样,在加载内核模块时强制使用 timer=1

# modprobe oprofile timer=1
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值