Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3449175
  • 博文数量: 198
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7256
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-23 18:56
个人简介

将晦涩难懂的技术讲的通俗易懂

文章分类

全部博文(198)

文章存档

2024年(1)

2023年(9)

2022年(4)

2021年(12)

2020年(8)

2019年(18)

2018年(19)

2017年(9)

2016年(26)

2015年(18)

2014年(54)

2013年(20)

分类: LINUX

2019-12-29 20:02:42

Off-CPU 性能分析

提起off-CPU就不得不提on-cpuon-cpu是在线程(进程)在CPU上运行的消耗,off-cpu就是进程(线程)由于某种原因阻塞的消耗,如等待IO,等待锁,等待定时器,等待内存页面的swap等。如下图所示,红色部分属于on-cpu部分,蓝色部分属于off-cpu

一般我们用的perf命令等都是采样on-cpu的指令进行CPU的消耗分析的,这篇文章主要介绍一下分析进程off-cpu的方法。

要想风险一个进程的off-cpu消耗,首先就是要确保程序编译时有完整的堆栈信息。例如有些C程序为了优化性能添加了gcc -fomit-frame-pointer编译选项,这就导致程序中不再有堆栈信息,对于这种情况是无法分析出off-cpu的堆栈消耗的。

这里讲的分析off-cpu的工具是基于linux eBPFoffcputime(要求linux内核版本在4.8以上),当然使用perf sched timehist工具也可以(linux内核版本大于4.10),但是开销要大一些。我们首先yum安装bpfcc-toolstools for BPF Compiler Collection),以及git clone

我们想看一下pgrep -nx tar命令的off-cpu执行消耗可以使用如下命令。

如果我们只想查看内核态的off-cpu消耗可以加上-K参数。如果想把TASK_UNINTERRUPTIBLE状态过滤掉可以添加--state 2,其中TASK_RUNNING 状态为0,  TASK_INTERRUPTIBLE 状态为1 TASK_UNINTERRUPTIBLE 状态为2

当然也可以查看off-cpu的火焰图,如下方式

sudo offcputime-bpfcc -df -p `pgrep -nx a.out` 30 > out.stacks

./flamegraph.pl --color=io --title="Off-CPU Time Flame Graph" --countname=us ~/out.stacks > output.svg

打开output.svg图片即可。

然后我们再来讲一下off-cpu的原理。当进程由于某种原因block或者要发送切换时,记录一下当前的堆栈和时间,当切换回来的时候再次记录下堆栈和时间即可。

参考:

阅读(4773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~