gprof显示一个简单的信号处理程序占用大量CPU

达斯汀

我使用gprof来分析在Linux上运行的程序,该程序使用25毫秒间隔的计时器(由timer_create()创建)来更新全局变量。信号处理程序类似于update_every_25ms(),它调用profile_dummy()来增加一个怪异的变量:

static void update_every_25ms(int sig_nr) { profile_dummy(); }
void profile_dummy(void) { global_var++; }

计时器是通过以下方式创建的:

timer_t timer;
struct itimerspec itimer;
timer_create(CLOCK_MONOTONIC, NULL, &timer)
itimer.it_interval.tv_sec = 0;
itimer.it_interval.tv_nsec = 25 * 1000 * 1000;
timer_settime(timer, 0, &itimer, NULL);

我的程序做了很多繁重的工作,但是gprof显示,当CPU使用率为100%时,update_every_25ms()函数会花费大部分时间,并且此函数本身每次调用大约需要1.53ms!

以下是间隔为25ms时的几组gprof输出:

%time  cumulative  self     calls  self    total    name
       seconds     seconds         ms/call ms/call
3.72   116.26      7.76     22963  0.34    0.34     profile_dummy

在这里,CPU使用率为60%。为什么profile_dummy()每次通话需要0.34毫秒?

%time  cumulative  self     calls  self    total    name
       seconds     seconds         ms/call ms/call
9.38   38.87       38.87    25349  0.00    0.00     profile_dummy

在这里,CPU使用率为100%。38.87s / 25349 = 1.53ms但gprof输出0.00,发生了什么?

%time  cumulative  self     calls  self    total    name
       seconds     seconds         ms/call ms/call
6.21   270.58      57.72 59105     0.00    0.00     profile_dummy

在这里,CPU使用率为90%。并且57.72s / 59105 = 0.98ms,但gprof也输出0.00。

这是我将计时器间隔更改为25s时的gprof输出:

%time  cumulative  self     calls  self    total    name
       seconds     seconds         ms/call ms/call
0.01   287.52      0.03  23        1.30    1.30     profile_dummy

该函数只是增加一个全局变量,为什么需要1.30ms?

感谢您的答复。

迈克·邓拉维

我只是在猜测一个危险。

gprof每10毫秒有一个信号中断,这时它将对程序计数器(PC)进行采样。例程的总自身时间是该例程中降落的样本数。由于它也计入对例程的调用,因此可以获得每次调用的平均自身时间。

通常,当您的程序被阻塞时,例如I / O,睡眠或多任务挂起,PC没有意义,因此中断被挂起。这就是为什么gprof根本看不到I / O的原因

但是,如果您有自己的计时器中断,则可能仅掩盖探查器中断,而不会暂停该中断,导致在取消您的计时器中断后对其进行应答,这可能会使PC优先进入中断处理程序。

但这只是一个猜测。

除非这纯粹是一个学术问题,否则没有比更好的分析器gprof

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

gprof显示一个简单的信号处理程序占用大量CPU

来自分类Dev

占用大量CPU资源的解析

来自分类Dev

简单的C ++ SFML程序占用大量CPU

来自分类Dev

一个简单的fork程序

来自分类Dev

功能简单,占用大量内存

来自分类Dev

允许一个处理程序运行?

来自分类Dev

编写一个简单的批处理文件,检查程序是否正在运行

来自分类Dev

RxJava sample()占用大量CPU

来自分类Dev

一个简单的数字拆分程序不会显示零

来自分类Dev

占用大量CPU的从属属性

来自分类Dev

我最早可以注册一个信号处理程序吗?

来自分类Dev

一个主机的简单nmap占用多少字节?

来自分类Dev

可以通过信号处理程序功能设置一个可变值,以响应来自GUI的信号?

来自分类Dev

占用大量CPU资源的解析

来自分类Dev

简单的C ++ SFML程序占用大量CPU

来自分类Dev

第一个导致大量错误的程序

来自分类Dev

功能简单,占用大量内存

来自分类Dev

当一个线程占用100%的CPU时,多线程应用程序挂起

来自分类Dev

新的信号在执行过程中在信号处理程序中到达时,如何确定哪个是第一个?

来自分类Dev

一个简单的序言程序

来自分类Dev

SpriteKit占用大量CPU资源

来自分类Dev

Java多线程程序不占用大量CPU

来自分类Dev

处理帐户守护程序占用100%的CPU

来自分类Dev

当一个被另一个中断时,两个(≥2)个信号处理程序的执行顺序?

来自分类Dev

信号量占用一个过程

来自分类Dev

一个简单的示例,“在处理程序中创建了一个Promise,但未从中返回”

来自分类Dev

一个简单的 Python 程序的缩进

来自分类Dev

处理同一信号的两个处理程序

来自分类Dev

有没有人有一个非异步安全信号处理程序死锁的例子

Related 相关文章

热门标签

归档