linux 性能与内存分析工具

news2024/11/24 14:12:43

linux-tools 包含了一系列性能分析工具和调试工具,用于监视和分析 Linux 系统的性能、内核活动以及其他性能相关信息。具体包含的工具可能因不同的 Linux 发行版和版本而有所不同。以下是一些常见的工具,可能包含在 linux-tools 或相关的包中:

  1. perfperf 工具集,包括 perf recordperf statperf report 等,用于性能分析、系统调用跟踪、硬件性能计数器分析等。
  2. oprofile:性能分析工具,用于 CPU 使用情况分析、性能瓶颈诊断以及优化。
  3. trace-cmd:用于跟踪和分析 Linux 内核跟踪事件的工具。
  4. sysstat:包含 sariostatmpstat 等工具,用于系统活动报告和性能监视。
  5. strace:系统调用跟踪工具,用于分析进程的系统调用和信号。
  6. ltrace:库调用跟踪工具,用于监视进程调用的共享库函数。
  7. htop:增强版的 top,用于实时监视进程和系统性能。
  8. powertop:用于监视和分析电源消耗的工具。
  9. blktrace:块设备层的性能分析工具,用于分析磁盘和存储性能。
  10. strace:用于跟踪进程的系统调用。
  11. iostat:用于监视系统的磁盘和 IO 性能。
  12. numactl:NUMA(非一致性内存访问)相关工具,用于优化 NUMA 架构系统的性能。
    请注意,具体的工具和版本可能会因 Linux 发行版和系统配置而有所不同。你可以使用包管理工具(如 aptyumdnf)来查找和安装适用于你的系统的 linux-tools 或相关工具包。在 Ubuntu 上,你可以使用以下命令来列出可用的 linux-tools 子包:
apt search linux-tools

然后,使用相应的命令来安装你需要的工具包

sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-$(uname -r)

Linux C/C+ +开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)成长体系

perf

简单用法

# kun @ kun-KLVD-WXX9 in ~/dev-home/sysmonitor/build on git:master o [15:06:30] 
$ ps -A | grep sysM
 137892 pts/4    00:00:00 sysMonitor

# kun @ kun-KLVD-WXX9 in ~/dev-home/sysmonitor/build on git:master o [15:06:39] 
$ sudo perf record -p 137892         

上述过程会阻塞,直到用户执行ctrl+c
然后会生成perf.data在当前目录
执行sudo perf report就可以看到该进程的一些信息

在这里插入图片描述
按键盘的方向键盘可以选择某个函数,回车会查看一些具体的信息
在这里插入图片描述
按下回车会看到这些
在这里插入图片描述

Annotate acpi_ns_search_one_scope   # 这是当前的函数,回车进去可以看该函数的汇编代码
Zoom into sysMonitor thread         # 聚焦sysMonitor
Zoom into the Kernel DSO (use the 'k' hotkey to zoom directly into the kernel)  # 聚焦内核的性能数据
Browse map details
Run scripts for samples of symbol [acpi_ns_search_one_scope]
Run scripts for all samples
Switch to another data file in PWD 

perf record支持的一些选项

-e event:指定要记录的性能事件。可以多次使用该选项来记录多个事件。
-a:记录所有进程的事件。
-p PID:仅记录特定进程的事件,使用进程 ID(PID)指定。
-c cpu:限制记录到指定的 CPU 上。
-o filename:指定输出文件的名称,将记录的性能数据保存到文件中。
-F frequency:设置事件记录的频率,通常以 Hz 为单位。
--call-graph:指示记录调用图信息,用于分析函数调用关系。
--no-samples:禁用采样,只记录事件计数。
--no-inherit:禁止子进程继承父进程的事件记录。
--switch-output:切换输出文件,以便定期将数据写入不同的输出文件。
--overwrite:覆盖已存在的输出文件。
--append:将记录追加到已存在的输出文件。
--time:记录事件时采用时间戳。
--time-out:设置事件记录的时间限制。
--no-buffering:禁用缓冲,直接将数据写入输出文件。
--filter:根据进程、线程或事件名称进行过滤。
--exclude-perf:排除 perf 工具自身的事件。

strace

分析进程的系统调用和了解应用程序与操作系统之间的交互

# 指定pid
sudo strace -p xxx

# 直接启动程序
sudo strace ./xxx

strace的输出是目标进程的系统调用、参数、返回值等信息:

read(4, "cpu  724574 230290 3584138 87049"..., 1024) = 1024
close(4)                                = 0
openat(AT_FDCWD, "/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 4
read(4, "0-7\n", 1024)                  = 4
close(4)                                = 0
newfstatat(AT_FDCWD, "/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...}, 0) = 0
write(1, "2023-10-20-15-26-03, CPU usage: "..., 89) = 89
newfstatat(AT_FDCWD, "/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...}, 0) = 0
openat(AT_FDCWD, "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
write(1, "2023-10-20-15-26-03, CPU freq(MH"..., 37) = 37
openat(AT_FDCWD, "/sys/class/net/wlp0s20f3/statistics/rx_bytes", O_RDONLY) = 4
newfstatat(4, "", {st_mode=S_IFREG|0444, st_size=4096, ...}, AT_EMPTY_PATH) = 0
read(4, "2207176195\n", 4096)           = 11
close(4)                                = 0
openat(AT_FDCWD, "/sys/class/net/wlp0s20f3/statistics/tx_bytes", O_RDONLY) = 4
newfstatat(4, "", {st_mode=S_IFREG|0444, st_size=4096, ...}, AT_EMPTY_PATH) = 0
read(4, "336795948\n", 4096)            = 10
close(4)                                = 0
newfstatat(AT_FDCWD, "/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...}, 0) = 0
write(1, "2023-10-20-15-26-03, net usage, "..., 58) = 58
openat(AT_FDCWD, "/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 4
read(4, "0-7\n", 1024)                  = 4
close(4)                                = 0
newfstatat(AT_FDCWD, "/etc/localtime", {st_mode=S_IFREG|0644, st_size=561, ...}, 0) = 0
openat(AT_FDCWD, "/sys/class/thermal/thermal_zone0/temp", O_RDONLY) = 4
read(4, "49000\n", 8191)                = 6
close(4)                                = 0
openat(AT_FDCWD, "/sys/class/thermal/thermal_zone1/temp", O_RDONLY) = 4
read(4, "53050\n", 8191)                = 6
close(4)                                = 0

ltrace

sudo apt install ltrace
# 监控pid
sudo ltrace -p ***

-S选项可以打印系统调用及其返回值

valgrind

sudo apt-get install valgrind
基本用法如下

在这里插入图片描述
我把程序ctrl c掉之后的输出如下:

==156612== Process terminating with default action of signal 2 (SIGINT)
==156612==    at 0x4C9B7F8: clock_nanosleep@@GLIBC_2.17 (clock_nanosleep.c:78)
==156612==    by 0x4CA0676: nanosleep (nanosleep.c:25)
==156612==    by 0x4CD211E: usleep (usleep.c:31)
==156612==    by 0x1162FC: main (main.cpp:154)
==156612== 
==156612== HEAP SUMMARY:
==156612==     in use at exit: 119,588 bytes in 108 blocks
==156612==   total heap usage: 50,265 allocs, 50,157 frees, 15,585,583 bytes allocated
==156612== 
==156612== 304 bytes in 1 blocks are possibly lost in loss record 67 of 93
==156612==    at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==156612==    by 0x40147D9: calloc (rtld-malloc.h:44)
==156612==    by 0x40147D9: allocate_dtv (dl-tls.c:375)
==156612==    by 0x40147D9: _dl_allocate_tls (dl-tls.c:634)
==156612==    by 0x4C4B7B4: allocate_stack (allocatestack.c:430)
==156612==    by 0x4C4B7B4: pthread_create@@GLIBC_2.34 (pthread_create.c:647)
==156612==    by 0x4A44328: std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30)
==156612==    by 0x118C05: std::thread::thread<void (&)(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), int&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, void>(void (&)(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), int&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (std_thread.h:143)
==156612==    by 0x1162E9: main (main.cpp:151)
==156612== 
==156612== LEAK SUMMARY:
==156612==    definitely lost: 0 bytes in 0 blocks
==156612==    indirectly lost: 0 bytes in 0 blocks
==156612==      possibly lost: 304 bytes in 1 blocks
==156612==    still reachable: 119,284 bytes in 107 blocks
==156612==                       of which reachable via heuristic:
==156612==                         newarray           : 352 bytes in 1 blocks
==156612==         suppressed: 0 bytes in 0 blocks
==156612== Reachable blocks (those to which a pointer was found) are not shown.
==156612== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==156612== 
==156612== For lists of detected and suppressed errors, rerun with: -s
==156612== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

HEAP SUMMARY:这一部分提供了内存的总结信息。它告诉你在程序退出时有多少内存仍然处于使用中,以及程序运行期间分配和释放了多少内存。在这个示例中:

“in use at exit”:119,588 字节的内存仍然在程序退出时处于使用状态。
“total heap usage”:程序运行期间共分配了 50,265 块内存,释放了 50,157 块内存,总共分配了 15,585,583 字节的内存。
304 bytes in 1 blocks are possibly lost:这一行表示 Valgrind 发现了可能的内存泄漏。具体来说,它报告了 304 字节的内存可能已经丢失。它还提供了有关问题的位置和调用堆栈。

“304 bytes”:泄漏的内存大小为 304 字节。
“in loss record 67 of 93”:这是错误的编号,有助于定位问题。
“at 0x484DA83”:泄漏发生的地址。
“by 0x40147D9” 和以下的行:显示了函数调用堆栈,以便你可以追踪泄漏的来源。
LEAK SUMMARY:这一部分总结了内存泄漏的情况。

“definitely lost”:明确泄漏的内存,但在这个示例中是零。
“indirectly lost”:间接泄漏的内存,但在这个示例中是零。
“possibly lost”:可能泄漏的内存,这里报告了 304 字节的内存泄漏。
“still reachable”:仍然可达的内存,即程序退出时尚未释放但仍然可以访问的内存块。
“of which reachable via heuristic”:仍然可达的内存块,但通过启发式方法来判断的。
“suppressed”:被抑制的错误数,这里是零。
ERROR SUMMARY:这一部分提供了总体的错误概要。

“ERROR SUMMARY”:检测到的错误总数。
“errors from”:涉及到的上下文数(即错误的数量)。
“suppressed”:被抑制的错误数。
在这个示例中,Valgrind 发现了一个可能的内存泄漏,但没有发现明确的泄漏。你可以通过查看调用堆栈信息,尝试追踪问题的来源,并在代码中采取措施来解决可能的泄漏。

Linux C/C+ +开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

整理了一些学习书籍、视频资料(Linux 内核、Linux C++后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全学习资料、教学视频和学习路线图),有需要的可以自行添加学习交流群:739729163 领取哦!!!

>>>  原文地址 https://www.cnblogs.com/feipeng8848/p/17777188.html

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

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

相关文章

JVM内存结构说明

1. 整体结构图如下 2. 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;由于JVM可以并发执行线程&#xff0c;因此会存在线程之间的切换&#xff0c;而这个时候就程序计数器会记录下当前程序执行到的位置&#xff0c;以…

Spring Boot创建多模块项目

创建一个普通的Spring Boot项目, 然后只留下 pom.xml 剩下的都删掉 删除多余标签 标识当前为父模块 创建子模块 删除子模块中多余标签 声明父模块 在父模块中声明子模块

MTK联发科、高通、紫光展锐手机SOC平台型号汇总(含详细参数)

MediaTek联发科手机平台汇总&#xff1a; Qualcomm高通SOC平台汇总&#xff1a; 紫光展锐SOC平台汇总&#xff1a; 新移科技已成功研发手机SOC平台&#xff1a; 联发科平台&#xff1a; MTK6739、MTK6761、MTK6762、MTK6765、MTK8788、MTK6853、MTK6873、MTK6833、MTK6877、…

电脑实时屏幕监管软件怎么选择,安企神企业电脑监控软件

电脑实时屏幕监管软件怎么选择&#xff0c;安企神企业电脑监控软件 下载使用安企神电脑屏幕监控软件 企业为什么要用屏幕监控软件&#xff1a; 在现代企业生产管理中&#xff0c;尤其是互联网行业公司&#xff0c;公司电脑里保存着重要信息&#xff0c;像企业信息、财务数据…

k8s:二进制搭建 Kubernetes v1.20

目录 1 操作系统初始化配置 2 部署 etcd 集群 2.1 准备签发证书环境 2.2 生成Etcd证书 3 部署 docker引擎 4 部署 Master 组件 5 部署 Worker Node 组件 k8s集群master01&#xff1a;192.168.30.105 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集…

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测(多指标、多图)

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&#xff08;多指标、多图&#xff09; 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&#xff08;多指标、多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览…

0004Java安卓程序设计-springboot基于APP的鲜花商城

文章目录 **摘 要****目录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于APP的鲜花商城。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;java技术和…

0009Java安卓程序设计-ssm基于android手机设计并实现在线点单系统APP

文章目录 **摘要**目 录系统实现开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 网络的广泛应用给生活带来了十分的便利。所以把在线点单管理与现在网络相结合&#xff0c;利用java技术建设在线点单系统&#xff0c;实现餐…

5.网络之IP

IP协议&#xff08;网络层&#xff09; 文章目录 IP协议&#xff08;网络层&#xff09;1. 报文格式2. IP地址2. 地址管理3. 特殊IP地址 IP协议&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;&#xff0c;是TCP/IP协议栈中最核心的协议之一&#xff0c;通过…

论文阅读—— BiFormer(cvpr2023)

论文&#xff1a;https://arxiv.org/abs/2303.08810 github&#xff1a;GitHub - rayleizhu/BiFormer: [CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention" 一、介绍 1、要解决的问题&#xff1a;t…

01|LangChain | 从入门到实战-介绍

​ ​ by&#xff1a;wenwenc9 一、基本知识储备 1、什么是大模型&#xff0c;LLM&#xff1f; 大模型(Large Language Model)是近年来一个很热门的研究方向。 使用大量的数据训练出一个非常大的模型。一般是数十亿到上万亿的参数规模。 这些大模型可以捕捉到非常复杂的语言…

MySQL进阶之性能优化与调优技巧

数据库开发-MySQL 1. 多表查询1.1 概述1.1.2 介绍1.1.3 分类 1.2 内连接1.3 外连接1.4 子查询1.4.1 介绍1.4.2 标量子查询1.4.3 列子查询1.4.4 行子查询1.4.5 表子查询 2. 事务2.1 介绍2.2 操作2.3 四大特性 3. 索引3.1 介绍3.2 结构3.3 语法 1. 多表查询 1.1 概述 1.1.2 介绍…

【蓝桥杯省赛真题42】Scratch舞台特效 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch舞台特效 一、题目要求 编程实现 二、案例分析 1、角色分析

Visual Studio 2010 软件安装教程(附下载链接)——计算机二级专用编程软件

下载链接&#xff1a; 提取码:2wAKhttps://www.123pan.com/s/JRpSVv-9injv.html 安装步骤如下&#xff1a; 1.如图所示&#xff0c;双击打开【Visual Studio 2010简体中文旗舰版】文件夹 2.如图所示&#xff0c;找到“Setup”文件夹打开&#xff0c;双击运行“setup” 3.如图…

【JavaEE】JVM 剖析

JVM 1. JVM 的内存划分2. JVM 类加载机制2.1 类加载的大致流程2.2 双亲委派模型2.3 类加载的时机 3. 垃圾回收机制3.1 为什么会存在垃圾回收机制?3.2 垃圾回收, 到底实在做什么?3.3 垃圾回收的两步骤第一步: 判断对象是否是"垃圾"第二步: 如何回收垃圾 1. JVM 的内…

H5ke9 异步处理

目录 .then()的使用详解 案例一:触小图标变大,移走变回 案例三:页面提交文件,我服务器端接收 上次fetvh就一个参数url,,就是get请求 fetch还可以第二个参数对象,可以指定method:改为POST 请求头header :发送txt,servlet,json给客户端,,异步请求图片 1都是客户端传到服务器端…

第二十六章 BEV感知系列三(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 BEV感知系列是对论文Delving into the De…

22吉林大学软件需求分析与规范(Software Requirements Analysis Specification)

写在前面&#xff1a; 4w多字笔记&#xff0c;可能显示有问题&#xff0c;带图片完整pdf版暂定10r一份&#xff0c;需要的同学可以加wx:fanaobo&#xff0c;备注软件需求笔记。 chapter 0 课程简介 课程简介&#xff1a; ◼ 软件工程专业核心课程之一 ◼ 软件工程课程体系最…

【完美世界】云曦被胁迫,荒天帝怒斩战王,云曦隐约猜出石昊身份

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料《完美世界云曦篇》最新一集&#xff0c;云曦的内心犹如翻江倒海一般&#xff0c;她已经无比确定魔曦就是下界的石昊&#xff0c;这让她感到有些不知所措。然而&#xff0c;石昊却始终不肯承认自己的…

(免费领源码)java#ssm#mysql宠物网站系统07183-计算机毕业设计项目选题推荐

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于B/S&#xff08;浏览器/服务器&#xff09;模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…