[转帖]Perf分析CPU性能问题笔记

perf,分析,cpu,性能,问题,笔记 · 浏览次数 : 0

小编点评

**CPU使用情况分析方法** **1. 使用 perf top 命令** * 使用 `sudo perf top -p <pid>` 命令在容器内观察进程的 CPU 使用情况。 * 观察函数调用链:`sudo perf top -g -p <pid>`。 **2. 使用 perf record 命令** * 使用 `sudo perf record -g -p <pid>` 命令在容器内记录采样数据。 * 将容器内文件系统绑定到主机上:`bindfs /proc/$PID/root /tmp/fooperf`。 * 使用 `sudo perf report --symfs <path>` 命令指定符号目录。 **3. 使用 perf report 命令** * 使用 `sudo perf report -p <pid>` 命令在容器内观察进程的 CPU 使用情况。 * 使用 `sudo perf report --symfs <path>` 命令指定符号目录。 **4. 使用 perf-java-top 命令** * 安装 `perf-map-agent`:`sudo apt install perf-map-agent`。 * 在启动 Java 进程时添加 `-XX:+PreserveFramePointer` 参数:`java -XX:+PreserveFramePointer <pid>`。 * 使用 `perf-java-top <pid>` 等命令监控 Java 进程的 CPU 使用情况。 **5. 使用 perf-java-record-stack 命令** * 使用 `perf-java-record-stack <pid>` 等命令记录 Java 进程的堆栈。 **6. 使用 perf-java-flames 命令** * 安装 `FlameGraph`:`sudo apt install FlameGraph`。 * 从 GitHub 上下载并安装 `FlameGraph`:`git clone --depth 1 -b flamegraph-build openjdk-8-jdk.git && cd flamegraph-build && mkdir -p /usr/local/bin && ./configure && make && sudo make install`。 **注意:** * 以上方法需要在 Ubuntu 16.04 系统上安装。 * 请根据您的实际环境和需求进行调整。

正文

https://cloud.tencent.com/developer/article/1416234

 

本文仅仅是一个笔记。

场景

观察进程的CPU使用情况

观察进程内各个函数的CPU使用情况:

sudo perf top -p <pid>

同时显示函数调用链:

sudo perf top -g -p <pid>

记录采样结果,以供后续分析,加上-g会记录调用链:

sudo perf record -g -p <pid>

读取采样结果:

sudo perf report

观察容器内进程CPU使用情况

容器内的进程实际上可以在host machine上看到,ps -ef | grep <text>可以找得到。

因此同样可以用perf top -p <pid>观察,但是会出现无法显示函数符号的问题,注意观察perf top最下面一行:

Failed to open /opt/bitnami/php/lib/php/extensions/opcache.so, continuing without symbols

解决办法是先用perf record记录采样数据,然后将容器内文件系统绑定到host上,然后用perf report --symfs <path>指定符号目录。你得先安装bindfs(下面有安装方法)。

mkdir /tmp/foo
PID=$(docker inspect --format {{.State.Pid}} <container-name>)
bindfs /proc/$PID/root /tmp/foo
perf report --symfs /tmp/foo

# 使用完成后不要忘记解除绑定
umount /tmp/foo/

把上面的<container-name>改成你要观察的容器名。

观察Java进程的CPU使用情况

你得要先安装perf-map-agent(下面有安装方法),在启动Java进程的时候添加-XX:+PreserveFramePointer参数,下面是几个用法:

  • perf-java-top <pid> <perf-top-options>
  • perf-java-record-stack <pid> <perf-record-options>
  • perf-java-report-stack <pid> <perf-report-options>

更多用法见官网说明。

还可以使用perf-java-flames <pid> <perf-record-options>生成火焰图,你得先安装FlameGraph(下面有安装方法)。关于火焰图的解读看netflix的这篇博客

观察容器内Java进程CPU使用情况

目前没有办法。

附录:安装方法

下面讲的都是在Ubuntu 16.04系统上的安装方法。

perf

安装perf

$ sudo apt install -y linux-tools-common

运行perf会出现:

$ perf
WARNING: perf not found for kernel 4.4.0-145

  You may need to install the following packages for this specific kernel:
    linux-tools-4.4.0-145-generic
    linux-cloud-tools-4.4.0-145-generic

  You may also want to install one of the following packages to keep up to date:
    linux-tools-generic
    linux-cloud-tools-generic

于是安装:

sudo apt install linux-tools-4.4.0-145-generic linux-cloud-tools-4.4.0-145-generic linux-cloud-tools-generic

bindfs

bindfs官网下载源码包(本文写是版本为1.13.11)。

先安装编译需要的工具:

sudo apt install -y cmake pkg-config libfuse-dev libfuse2 autoconf 

解压缩源码包,进入bindfs目录,编译:

./configure && make && sudo make install

perf-map-agent

github clone perf-map-agent的源码仓库。

安装JDK,你之后要监测的程序都得用这个JDK启动,这个JDK也用来编译perf-map-agent。用apt安装openjdk的方法见下面。

编译:

cmake .
make

# will create links to run scripts in /usr/local/bin
sudo bin/create-links-in /usr/local/bin

安装openjdk

sudo apt-get install -y openjdk-8-jdk

通过这种方式安装是没有JAVA_HOME环境变量的,因此我们要自己设置一个,查找openjdk的安装路径:

dpkg-query -L openjdk-8-jdk

将发现结果写到~/.bashrc里:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

FlameGraph

github clone FlameGraph的源码仓库。

~/.bashrc设置环境变量:

export FLAMEGRAPH_DIR=<path-to-flame-graph>

与[转帖]Perf分析CPU性能问题笔记相似的内容:

[转帖]Perf分析CPU性能问题笔记

https://cloud.tencent.com/developer/article/1416234 本文仅仅是一个笔记。 场景 观察进程的CPU使用情况 观察进程内各个函数的CPU使用情况: sudo perf top -p 复制 同时显示函数调用链: sudo perf top -

[转帖]《Linux性能优化实战》笔记(23)—— 内核线程 CPU 利用率过高,perf 与 火焰图

在排查网络问题时,我们还经常碰到的一个问题,就是内核线程的 CPU 使用率很高。比如,在高并发的场景中,内核线程 ksoftirqd 的 CPU 使用率通常就会比较高。回顾一下前面学过的 CPU 和网络模块,你应该知道,这是网络收发的软中断导致的。 要分析 ksoftirqd 这类 CPU 使用率比

[转帖]人工智能 Java混合模式火焰图

https://www.dazhuanlan.com/smallnight/topics/1040103 在做性能调优的时候,我们通常会借助一些性能分析工具(比如 perf,DTrace)分析系统资源的使用情况,比如 CPU、内存等,但这些工具分析的结果通常是文本形式,不够直观,不便于快速定位系统瓶

[转帖]人工智能 Java混合模式火焰图

https://www.dazhuanlan.com/smallnight/topics/1040103 在做性能调优的时候,我们通常会借助一些性能分析工具(比如 perf,DTrace)分析系统资源的使用情况,比如 CPU、内存等,但这些工具分析的结果通常是文本形式,不够直观,不便于快速定位系统瓶

[转帖]linux 性能分析工具 perf + FlameGraph

https://www.cnblogs.com/lausaa/p/12098716.html 常用命令: perf record -e cpu-clock -g -p $pid sleep 10 perf script -i perf.data > perf.unfold /FlameGraph-m

[转帖]Perf IPC以及CPU性能

https://plantegg.github.io/2021/05/16/Perf_IPC%E4%BB%A5%E5%8F%8ACPU%E5%88%A9%E7%94%A8%E7%8E%87/ 为了让程序能快点,特意了解了CPU的各种原理,比如多核、超线程、NUMA、睿频、功耗、GPU、大小核再到分支

[转帖]perf学习-linux自带性能分析工具

目前在做性能分析的事情,之前没怎么接触perf,找了几篇文章梳理了一下,按照问题的形式记录在这里。 方便自己查看。 什么是perf? linux性能调优工具,32内核以上自带的工具,软件性能分析。在2.6.31及后续版本的Linux内核里,安装perf非常的容易。 几乎能够处理所有与性能相关的事件。

[转帖]perf学习-linux自带性能分析工具

目前在做性能分析的事情,之前没怎么接触perf,找了几篇文章梳理了一下,按照问题的形式记录在这里。 方便自己查看。 什么是perf? linux性能调优工具,32内核以上自带的工具,软件性能分析。在2.6.31及后续版本的Linux内核里,安装perf非常的容易。 几乎能够处理所有与性能相关的事件。

[转帖]perf学习-linux自带性能分析工具

存储技术为满足层出不穷应用的海量数据存储需求,从物理介质到技术架构也同样发生了天翻地覆的变革。无论技术如何更新换代,其目的都是为了更好的提供高性能,高容量,高可用的数据服务。本系列文章会对存储系统的测试和调试工具做一个介绍。 dd - Linux世界中的搬运工 FIO – IO压力测试工具 vdbe

[转帖]Linux tracing/profiling 基础:符号表、调用栈、perf/bpftrace 示例等(2022)

http://arthurchiao.art/blog/linux-tracing-basis-zh/ 1 引言 1.1 热点与调用栈分析(perf record/report/script) 1.2 符号(symbols) 1.3 小结 2 极简程序 hello-world:探究符号 2.1 C