Linux中perf的使用

`perf` 是 Linux 系统中的一个强大的性能分析工具,广泛用于内核和用户态程序的性能分析。它可以帮助开发者和系统管理员深入了解程序的 CPU 使用情况、函数调用频率、缓存命中率、硬件事件等,进而优化程序的性能。

下面我将详细介绍如何在 Linux 系统中使用 `perf`,从安装到基本的使用方法。

### 1. **安装 `perf` 工具**
在大多数 Linux 发行版中,`perf` 是内核的一部分,但你需要通过软件包管理器安装它。安装命令因发行版不同而异:

- **Debian/Ubuntu**:
  ```bash
  sudo apt update
  sudo apt install linux-tools-common linux-tools-$(uname -r)
  ```
- **Fedora/RHEL/CentOS**:
  ```bash
  sudo dnf install perf
  ```
- **Arch Linux**:
  ```bash
  sudo pacman -S perf
  ```

确认 `perf` 是否安装成功,可以运行以下命令:
```bash
perf --version
```

### 2. **基本的 `perf` 使用方法**
`perf` 提供了许多子命令,以下是一些常见的用法。

#### 2.1. **分析 CPU 使用情况(`perf stat`)**
`perf stat` 是用来统计一个命令的执行过程中,硬件和软件事件发生的次数。例如,可以用它来查看程序执行期间的 CPU 周期、指令、缓存访问等硬件计数。

示例:统计 `ls` 命令的性能数据
```bash
perf stat ls
```

输出将包括程序执行期间的事件统计信息,例如:
- CPU cycles
- Instructions
- Cache misses
- Branch misses

#### 2.2. **查看程序的热点函数(`perf record` 和 `perf report`)**
`perf record` 用于记录程序的性能数据,特别是 CPU 性能数据(如函数的执行频率)。`perf report` 用于分析这些数据,查看程序的热点函数。

步骤:
1. **记录数据**:
   ```bash
   perf record <your_command>
   ```
   例如:
   ```bash
   perf record ./my_program
   ```
   这将记录 `my_program` 的执行数据,并生成一个 `perf.data` 文件。

2. **分析报告**:
   ```bash
   perf report
   ```
   这将打开一个 TUI(文本用户界面),显示执行数据的分析报告,其中包括各个函数的执行频率(如 CPU 周期占比),帮助你识别程序的热点函数(耗时多的函数)。

#### 2.3. **分析系统上的所有进程(`perf top`)**
`perf top` 类似于 `top`,但它分析的是系统上所有进程的实时性能数据,显示当前占用 CPU 最多的函数或事件。它可以帮助你了解哪些程序或函数正在消耗最多的系统资源。

运行以下命令:
```bash
perf top
```
该命令将打开一个实时监控界面,显示当前系统中 CPU 使用最多的函数(带符号表解析)。

#### 2.4. **跟踪系统调用(`perf trace`)**
`perf trace` 是一个类似于 `strace` 的工具,它可以跟踪进程的系统调用并统计其频率和开销。

例如,跟踪 `ls` 命令的系统调用:
```bash
perf trace ls
```
输出将显示 `ls` 过程中发生的所有系统调用及其耗时。

#### 2.5. **分析内核事件(`perf sched`)**
`perf sched` 可以用来分析内核中的调度事件。它可以帮助你了解进程的调度行为,分析系统中是否存在调度延迟等问题。

使用以下命令记录调度事件:
```bash
perf sched record
```
然后查看调度情况:
```bash
perf sched latency
```
或者绘制调度图:
```bash
perf sched trace
```

### 3. **常见场景下的 `perf` 使用**
#### 3.1. **程序性能瓶颈分析**
在你发现一个程序的执行时间比预期长时,可以使用 `perf record` 和 `perf report` 来分析程序的性能瓶颈:
```bash
perf record ./my_program
perf report
```
通过分析函数的 CPU 使用情况,找出最耗时的部分,进而进行优化。

#### 3.2. **CPU 资源争用分析**
当系统负载较高时,可以使用 `perf top` 查看哪些进程或者函数占用了最多的 CPU 资源:
```bash
perf top
```
这有助于定位系统性能瓶颈,分析高 CPU 占用的原因。

#### 3.3. **缓存性能分析**
如果你怀疑程序中存在缓存命中率低的问题,可以通过 `perf stat` 来分析缓存的性能。你可以查看缓存未命中(cache misses)的次数,以确定程序中的缓存利用情况:
```bash
perf stat ./my_program
```
在输出中查看 `cache-references` 和 `cache-misses` 两项。

#### 3.4. **多线程调度问题**
如果程序存在多线程调度问题,可以通过 `perf sched` 来分析调度延迟:
```bash
perf sched record
perf sched latency
```
通过分析调度延迟,找出导致系统调度不均衡的原因。

### 4. **高级用法**
#### 4.1. **采样指定硬件事件**
你可以让 `perf` 专门采样某些硬件事件(例如缓存未命中、分支预测失败等),从而针对性地分析程序的性能问题。

例如,记录程序的缓存未命中情况:
```bash
perf record -e cache-misses ./my_program
```

#### 4.2. **对指定 PID 进行性能分析**
如果你想对正在运行的某个进程进行性能分析,可以使用 `-p` 选项指定进程 ID:
```bash
perf record -p <PID>
```
这对分析后台运行的进程非常有用。

### 5. **总结**
- `perf` 是 Linux 内核中强大的性能分析工具,能够对 CPU 事件、系统调用、线程调度、硬件计数器等多种系统层面进行全面的性能分析。
- 常用命令包括:
  - `perf stat`:获取硬件事件统计。
  - `perf record`:记录程序执行过程中的性能数据。
  - `perf report`:生成性能分析报告。
  - `perf top`:实时查看系统性能。
  - `perf trace`:跟踪系统调用。
  - `perf sched`:分析调度行为。

掌握这些基本用法,可以帮助你快速分析和优化系统和程序的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式和读者写者问题

文章目录 10. 线程安全的单例模式10.1 什么是设计模式10.2 什么是单例模式10.3 单例模式的特点10.4 饿汉方式和懒汉方式10.5 单例模式的线程池 11. STL和智能指针的线程安全 问题11.1 STL中的容器是否是线程安全的?11.2 智能指针是否是线程安全的? 12. 其他常见的各种锁13. 读…

009——二叉树

目录 二叉树的五种基本形态&#xff1a; 1.二叉树可以是空树 2.只有一个根节点的树 3.斜树&#xff1a;只有左子树或右子树的树 4.左右孩子都有的树 二叉树的性质&#xff1a; 1.假设根节点是第一层&#xff0c;在二叉树的第i层上最多有2^(n-1)个结点 2.深度为k的二叉树…

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址&#xff1a;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了&#xff0c;可以参考其他…

Bash 脚本中解析 INI 文件

在 Bash 脚本中解析 INI 文件可能稍显复杂&#xff0c;因为 Bash 本身并未内置专门用于处理此类配置文件的工具。然而&#xff0c;我们可以通过一些文本处理命令&#xff08;例如 grep、sed、awk&#xff09;或借助外部工具&#xff08;如 python 脚本或 inih 库&#xff09;来…

基于SSM的旅游网站【附源码】

基于SSM的旅游网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管理 5.1.2 …

每天五分钟深度学习pytorch:基于pytorch搭建多项式线性回归模型

本文重点 我们前面学习了基于pytoch搭建一元线性回归模型,本文我们学习使用pytorch搭建多项式的回归模型,在学习这个之前我们需要了解一下什么是多项式回归模型? 多项式回归模型和多变量(多特征)的回归模型是不一样的,多变量就是一个样本有多个特征属性,而多项式就是一…

云原生化 - 工具镜像(完整版)

在微服务和云原生环境中,容器化的目标之一是尽可能保持镜像小型化以提高启动速度和减少安全风险。然而,在实际操作中,有时候需要临时引入一些工具来进行调试、监控或问题排查。Kubernetes提供了临时容器(ephemeral containers)的功能,允许在不改变原始容器镜像的情况下,…

Centos7 搭建logstash

下载并安装公共签名密钥&#xff1a; sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建一个名为 /etc/yum.repos.d/logstash.repo 的文件&#xff0c;并添加以下内容&#xff1a; [logstash-7.x] nameElastic repository for 7.x packages baseu…

【进阶】面向对象之权限修饰符代码块

文章目录 权限修饰符权限修饰符的使用规则 代码块分类局部代码块(了解就行)构造代码块(了解就行)静态代码块(重点) 权限修饰符 权限修饰符的使用规则 成员变量私有方法公开 特例&#xff1a; 如果方法中的代码是抽取其他方法中共性代码&#xff0c;这个方法一般也私有. 代码…

如何“半路出家”转行算法工程师的?

01 关于择业考虑 算法岗是什么&#xff1f; 算法岗&#xff0c;从根本内容上来说&#xff0c;是算法&#xff0c;算力&#xff0c;数据&#xff0c;应用场景的交集。从工作要求的角度来讲&#xff0c;是你的能力能够匹配大厂需要的工作要求。从个人角度来说&#xff0c;是你…

Gitea 忘记密码解决方案

一、在 Windows 上处理 Gitea 密码问题 1. 打开命令提示符&#xff1a; 以管理员身份运行命令提示符 2. 导航到 Gitea 安装目录&#xff1a; 假设你在 C:\gitea 下安装了 Gitea&#xff0c;使用以下命令导航到 Gitea 目录&#xff1a; cd C:\gitea 3. 重置密码&#xff1…

网易博客旧文----bacnet学习系列之三----读取属性程序的分析

bacnet学习系列之三----读取属性程序的分析 2014-01-21 16:29:42| 分类&#xff1a; BACnet | 标签&#xff1a; |举报 |字号大中小 订阅 先上一张自己画的流程图 bacnet学习系列之三----读取属性程序的分析 - xzhoumin - MMZHOU的博客 程序一开始就是分析命令行&#xff0c;…

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

【React】如何对组件加载进行优化

1. 懒加载 (Lazy Loading) 使用 React.lazy() 和 Suspense 来实现懒加载&#xff08;按需加载&#xff09;组件。只有在需要时才加载对应组件&#xff0c;可以减小初始加载的体积。 const LazyComponent React.lazy(() > import(./LazyComponent));function App() {retur…

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图&#xff1a;1.1.2、 LSW11.1.3、 LSW2 1.2、…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

SpringMVC源码-处理器适配器HandlerAdapter

因为定义controller的方式有三种&#xff0c;每种不同的方式调用的方法不同&#xff0c;尤其是注解修饰的 方法名是自定义的 因此需要通过适配器模式来调用方法执行 initStrategies进行适配器的初始化 处理器适配器一共有如下四种: org.springframework.web.servlet.Handl…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变&#xff0c; 原来你笃定不会变的事&#xff0c;也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

开源催生开源:Tesla 如何加速 AI 发展

特斯拉最近宣布开源其特斯拉以太网传输协议 &#xff08;TTPoE&#xff09;&#xff0c;这是一种尖端网络结构&#xff0c;专为 AI/ML 数据中心环境中的高速、低延迟数据传输而设计&#xff0c;从而掀起了波澜。此举反映了特斯拉利用开源战略加速全行业进步的更广泛历史&#x…

Spring Boot课程问答:技术难题轻松解决

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…