1

我正在尝试以编程方式从 Ubuntu 10.10 机器上的多个来源收集有关程序性能的数据。对于我所有的其他来源,我已经能够使用 RDTSC x86 指令收集它们,然后使用 gettimeofday 缩放它们以转换为绝对时间的秒数。但是,当我开始尝试将这些数据源与在 /sys/kernel/debug/tracing 中执行 sched_switch 跟踪的输出进行协调时,我遇到了一个问题,因为我看到的输出是从某个未知时间开始以秒和微秒为单位的。

我已经完成的步骤:
1.我确定Linux内核内部也使用RDTSC,但添加了一些它收集的偏移量,但我似乎没有能力检索。它也是在每个核心的基础上执行此操作的,这意味着我必须尝试所有四个核心并确定最好的一个,这似乎是解决这个问题的一个糟糕的解决方案。
2. 我尝试在打开日志记录时转换 RDTSC 时间,以查看至少转换本身是否一致(即一些恒定偏移),但规模似乎在整个运行过程中并没有保持不变。
3. clock_gettime(CLOCK_MONOTONIC, ...) 似乎有一个非常相似的值,但总是偏离一个无法例外的量(大约半秒),而且似乎也不完全一致。

如果我能够将其他数据源收集时间的方式更改为所需的时间(假设它不是性能密集型的),我应该如何收集时间以便在跟踪时间和我收集的时间之间进行协调?是否有某种方法可以将输出更改为 RDTSC,这样我就可以使用它,或者是否可以进行系统调用来获得与要跟踪的输出相同的时间?提前感谢您的帮助。

4

2 回答 2

0

RDTSC 不是一个流行的指令。使用它时存在一些问题,一些事件(如休眠)会重置计数器。其他常见的问题来源是动态 CPU 时钟。比较 rdtsc 和 hpet 的帖子很好:

http://aufather.wordpress.com/2010/09/08/high-performance-time-measuremen-in-linux/

为了检查 rdtsc 的准确性,我测量了它在一秒钟内计数了多少个时钟周期,并将其与声明的 cpu 时钟进行比较。它仅适用于禁用 CPU 动态时钟。看:

https://github.com/petersenna/rdtscbench

于 2012-02-07T19:39:01.643 回答
0

因此,在查看源代码后,我发现代码在某一时刻采用 RDTSC 值,并对其进行了一些花哨的数学运算,以尝试将其乘以时钟频率并添加一些在启动时计算的偏移量。然而,这段代码似乎有点过时了,因为 RDTSC 保证在较新芯片上的内核之间保持一致,而这假设每个内核都是不同的。它似乎也在收集当前频率而不是最大频率,这就是 RDTSC 使用的文档似乎所说的。

因此,在这一点上,时间似乎与在我的实例中有用的准确度级别的实际时间没有直接关系。希望这个错误在即将发布的内核版本中得到修复,以解决这个问题,并为我提供同步这两组的机会,但在那之前,它似乎还不够可靠。

于 2012-03-13T06:20:00.137 回答