perf-如何获取程序的当前运行时时钟

Posted

技术标签:

【中文标题】perf-如何获取程序的当前运行时时钟【英文标题】:perf- how to get the current runtime clock of the program 【发布时间】:2021-03-08 15:27:37 【问题描述】:

我正在使用性能工具来衡量性能 使用命令:

perf record -F 99 -T -d -p $(pid_of_my_program) 
perf sched script -v

我得到的结果:

TimerTask 23652 544157.760762:          1 cycles:          c0044606 finish_task_switch ([kernel.kallsyms])
       TimerTask 23652 544157.760788:          1 cycles:          c0044606 finish_task_switch ([kernel.kallsyms])
       TimerTask 23652 544157.760797:          1 cycles:          c0044606 finish_task_switch ([kernel.kallsyms])
       TimerTask 23652 544157.760804:         52 cycles:          c0044606 finish_task_switch ([kernel.kallsyms])
       TimerTask 23652 544157.760811:       5162 cycles:          c0044606 finish_task_switch ([kernel.kallsyms])

我尝试转换时间戳

date -d @544157.760762

我得到了 Unix 时间:

Wed Jan  7 09:09:17 IST 1970

如何将时钟设置为当前时间? 我想获取程序的当前运行时间

【问题讨论】:

【参考方案1】:

此答案假定您想要获取记录 perf 样本的当前时间戳,以及 perf 跟踪的进程运行的时间。

perf 模块使用sched_clock 函数来计算事件的时间戳。您在perf sched script 命令中看到的时间戳实际上表示自系统启动以来的纳秒数(格式为seconds.nanoseconds)。这就是sched_clock 计算的内容。更多详情请查看this 答案。

仅在此处转换时间戳,不会为您提供收集样本的当前时间。

要获取当前时间,你可以这样做-

#! /bin/bash

# get uptime in yyyy-mm-dd HH:MM:SS format
uptime_since=$(uptime -s)         

# convert uptime to epoch
epoch_uptime=`date --date="$uptime_since" +"%s%N"`

# add the timestamp obtained from perf to the previous result
current_time_in_epoch=$((epoch_uptime + 544157760762000))

# convert the nanosecond epoch+perf time to seconds
current_time_in_seconds=$((current_time_in_epoch/1000000000))

# convert this to timestamp format
current_time=`date -d @$current_time_in_seconds`

echo $current_time

以上所有命令都考虑到你使用的shell是bash

【讨论】:

以上是关于perf-如何获取程序的当前运行时时钟的主要内容,如果未能解决你的问题,请参考以下文章

jquery或js 如何时时获取浏览器当前的宽和高?

我如何使用 perf 来分析我的代码?

perf 如何采样内核堆栈?

如何从 perf_event_open 中的环形缓冲区中检索调用链以获取 PERF_RECORD_SWITCH?

如果应用程序在后台运行,如何获取当前位置的纬度和经度?

应用程序在后台运行时如何获取当前位置