系统级性能优化通常包括两个阶段:性能剖析(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

LinuxCNC性能剖析相关推荐

  1. 性能服务器解读,【MySQL数据库】第三章解读:服务器性能剖析(上)

    前言: 保持空杯精神,使用性能剖析,专注于测量服务器的时间花费在哪里,思考1.如何确认服务器是否达到了性能最佳状态,2.某条语句为什么不够快,诊断被用户描述为"停顿.堆积.卡死"的 ...

  2. mysql服务器性能剖析,高性能MySQL–服务器性能剖析

    性能剖析一般有两个步骤:测量任务所花费的时间;然后对结果进行统计和排序,将重要的任务排到前面.无法测量就无法有效的优化.完成一项任务所需要的时候可以分为两部分:执行时间和等待时间. 当一个资源变得效率 ...

  3. 测试服务器性能常用算法,服务器性能剖析(profiling)之——简介

    性能剖析(profiling)是专注于测量服务器时间花费在哪里的一种技术,这里"性能即响应时间". 测量是一项很有挑战性的工作,并且分析结果也同样有挑战性,测出时间花在哪里,和知道 ...

  4. Java Switch语句及性能剖析(转载补充)

    为什么80%的码农都做不了架构师?>>>    Java Switch语句及性能剖析(转载补充) 一.基本用 switch的case语句可以处理int,short,byte,char ...

  5. android 耗电量分析,使用能耗性能剖析器检查耗电量

    能耗性能剖析器可帮助您了解应用在哪里耗用了不必要的电量. 能耗性能剖析器会监控 CPU.网络无线装置和 GPS 传感器的使用情况,并直观地显示其中每个组件消耗的电量.能耗性能剖析器还会显示可能会影响耗 ...

  6. Linux内核性能剖析的方法学和主要工具

    计算机科学的先驱Donald Knuth(高德纳)曾经说过:"过早的优化是万恶之源",更详细的原文如下:"We should forget about small eff ...

  7. 《高性能MySQL》 第三章 服务器性能剖析 读书笔记

    性能优化 基于响应时间 性能剖析 测量任务所花费的时间 对结果进行统计和排序,将重要的任务排到前面 时间分类 执行时间 等待时间 理解性能剖析 值得优化的查询 一些只占总响应时间比重很小的査询是不值得 ...

  8. Go语言性能剖析利器--pprof实战

    作者:耿宗杰 前言 关于pprof的文章在网上已是汗牛充栋,却是千篇一律的命令介绍,鲜有真正实操的,本文将参考Go社区资料,结合自己的经验,实战Go程序的性能分析与优化过程. 优化思路 首先说一下性能 ...

  9. MySQL性能剖析工具(pt-query-digest)

    MySQL性能剖析工具(pt-query-digest)[转] 这个工具同样来自percona-toolkit  该工具集合的其他工具  MySQL Slave异常关机的处理 (pt-slave-re ...

最新文章

  1. container_of分析--可用good【转】
  2. 学习笔记84—[深度学习]神经网络反向传播(BackPropagation)
  3. 一文弄懂各大池化Pooling操作
  4. 通过键盘上下键 JS事件,控制候选词的选择项
  5. 无论如何都是为了测试傻瓜搜索引擎
  6. 【SpringBoot 】 组件管理 + 属性注入
  7. ieee期刊的科技写作思路曹文平_科学网—怎样向IEEE期刊投稿* - 吴雄君的博文
  8. Linux 系统恢复误删除 Linux文件
  9. SQLHelp sql数据库的DAL
  10. 华硕主板固态硬盘不识别_主板启动设置无法识别固态硬盘 - 卡饭网
  11. 制造行业相关名词释义
  12. ArcGIS软件气象数据插值教程
  13. 2022“杭电杯”中国大学生算法设计超级联赛(7) 2022杭电多校第七场
  14. 简单创意思维导图绘制教程分享
  15. webscraper多页爬取_webscraper的常见爬取问题
  16. php输出503,php中的503是什么意思
  17. 国际“知识共享”运动的现状
  18. Android 实现SKU选择通用方式
  19. 94608000秒,1576800分,26280小时,1095天!!
  20. 红队笔记之权限维持技术要点总结

热门文章

  1. Dell戴尔游匣7559黄屏解决办法
  2. 如何根据波动率曲面设计策略
  3. Docker服务编排详解——(六)
  4. 动态规划---图像压缩
  5. Gitlab管理之十四–在Gitlab中配置wiki和通过Gollum管理wiki
  6. 删除oem、恢复分区
  7. 【BAT面试】JDK8 JVM内存模型
  8. 从零开始搭建仿抖音短视频App-前后端开发模式,前端框架的选择、前端项目搭建
  9. 怎么用pe安装服务器系统安装系统,pe下安装服务器系统安装教程
  10. PMC荣获华为质量专项奖