oprofile交叉编译、移植使用

oprofile 简介

oprofile 检测哪个程序,以及哪个函数消耗的CPU时间较多,CPU负荷,性能比较关注的时候可以使用此工具检测以及对程序以及相应程序进行优化。

其原理是: CPU都提供一个所谓性能计数器的东西(performance counter),大致的原理就是程序可以注册告诉CPU对什么event感兴趣(比如CPU_CYCLE,CPU经历了一次时钟周期),然后CPU在执 行了相应的操作后,就会在性能计数器上加1,这样程序就可以取出。所以,使用OProfile来定位CPU使用率的问题,就变成了让oprofile收集 程序运行过程中哪个可执行程序(或是so)中的哪个function,消耗的CPU CYCLE最多。这种测试方法结果更符合实际情况。

1.oprofile 编译前下载依赖库

oprofile 工具交叉编译前需要的依赖库有popt、binutils库、oprofile工具。我使用的库popt库版本1.18,下载地址: [(https://ftp.osuosl.org/pub/blfs/conglomeration/popt/popt-1.18.tar.gz)] binutils库版本2.33.1 下载地址:[https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.gz] ,oprofile我在此下载版本是oprofiel-1.1.10.tar.gz,下载地址:[https://oprofile.sourceforge.io/about/]。下载此三个文件后首先进行popt库、binutils依赖库的交叉编译。

2 popt 库的交叉编译

	将下载的popt库按照如下命令操作进行交叉编译,在编译前首先将交叉编译工具配置于环境变量中,我使用的交叉编译链工具是arm-linux-gnueabihf-gcc ,arm-linux-gnueabihf-g++. 在linux下的操作命令:
export PATH=$PATH:/home/arm-linux/bin #此文件为交叉编译链工具存放的哦目录
tar -zxvf popt-1.18.tar.gz
cd popt-1.18.0
./configure --host=arm-linux-gnueabihf  CC=arm-linux-gnueabihf-gcc  --enable-host-shared  AR=arm-linux-gnueabihf-ar   --prefix=/home/popt # 设置安装popt库的目录  此步生成Makefile 文件
make #等待编译完成
make install #此步完成后在/home/popt 生成了bin include share 等文件即popt库交叉编译完成

3 binultils 库的交叉编译

将下载的binutils2.33.1库,进行解压编译。我们在编译oprofile工具的时候还需要libiberty库依赖,但是在我们binultis库中的libiberty需要单独编译,再编译完binultis后,需要进入binutils目录下再进入libiberty 然后进行配置重新生成编译libiberty库的Makefile文件。如下操作命令:
	tar -zxvf binultis-2.33.1.tar.gz 
	cd binutils-2.33.1
	./configure --host=arm-linux-gnueabihf  CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar  --enable-shared=yes  --enable-libiberty    --prefix=/home/bitnuts  # 生成Makefile 
	make & make install # 编译生成相应的bin include lib shared 文件
	# 生成libiberty库命令
	cd binutils/libiberty
    ./configure --enable-install-libiberty  --host=arm-linux-gnueabihf  CC=arm-linux-gnueabihf-gcc --enable-shared=yes --prefix=/home/bitnutils	 
    make & make install #此步操作完成即完成了所有的binutils的库的操作

4 编译oprofile-1.1.0工具

在编译oprofile工具的时候我们需要依赖编译生成的popt库,binutils库。操作命令如下

# 首先通过.configure 文件生成Makefile文件   --with-binutils=/home/binutils binutils库的路径,--with-kernel=/home/kernel/linux-4.4.32内核源码的路径
./configure  --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc  CXX=arm-linux-gnueabihf-g++  AR=arm-linux-gnueabihf-ar  CPPFLAGS="-I/home/zhoushanlin/popt/include" LDFLAGS="-L/home/zhoushanlin/popt/lib" --with-binutils=/home/binutils --with-kernel=/home/kernel/linux-4.4.32  --prefix=/home/oprofile

make & make install # 在oprofile 文件下生成bin 、include lib  shared 

通过上面的命令将生成的bin,include lib shared 文件移植在开发板即可。

5 oprofile 使用

我将oprofile 移植在了/opt/oprofile目录下。在/opt/oprofile/bin下我们使用operf 和opreport即可 。
我们使用如下操作即可通过日志观察我们程序中一段时间采样到的函数使用CPU的占比,opreport获取采样信息。

export PATH=$PATH:/opt/oprofile/bin/ # 配置临时环境变量
./operf -p PID # 检测固定PID进程
ctrl+c # 进行采样一段时间后我们手动结束掉
./opreport --exclude-dependent 查看占比cpu的信息
./opreport --exclude-dependent --demangle=smart --symbols `which PID_name`# 查看具体日志内容 opreport将本地存放的日志进行分析

如下图所示,是我们通过operf抓到的分析日志。
在这里插入图片描述

总结

在折腾了两天后oprofile 可以正常使用了,主要通过operf 以及opreport 配合使用,分析应用程序中函数的使用占比CPU有助于我们分析程序进行优化,减少CPU不必要的负荷。能准确的帮我们分析应用程序定位程序。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…