1

假设我需要定期查看一个线程的状态,并在整个程序执行过程中记录它的状态。我不知道如何开始思考这个问题。任何指针(双关语?)?我在 Linux 上,使用gccphreads并且C可以访问所有常用的 Linux 工具。基本上,我想我问的是如何为线程构建一个简单的分析器,它会告诉我在程序执行期间线程处于某种或其他状态的时间。

我希望能够像 Threadscope 那样创建图表。X 轴是时间,Y 轴是核心/线程数,“颜色”是状态:绿色表示正在运行,橙色表示垃圾收集,依此类推。这现在更有意义了吗?

螺纹镜图像.

4

4 回答 4

4

对于 Linux 特定的解决方案,您可能想分别查看进程和线程统计信息/proc/<pid>/stat/proc/<pid>/task/<tid>/stat查看proc(5)手册页以获取那里所有字段的完整描述(在线http://man7.org/linux/man-pages/man5/proc.5.html - 搜索/proc/[pid]/stat)。cutime具体来说,至少stime是您感兴趣的领域。这些是单调递增的时间,因此您需要记住先前测量的值,以便能够生成在给定时间片内进程/线程中花费的时间,以便为您的图表生成数据。(这就是top(1)工作原理。)

然而,对于分析器来说,区分不同的状态会使问题变得更加复杂。分析器如何区分被分析的程序处于哪个状态?在我看来,被分析的程序线程需要以某种方式向分析器发出信号。您需要为这种状态共享提供某种量身定制的解决方案(除非您可以在不同的线程中运行不同的状态并以这种方式进行区分,我对此表示怀疑)。

如果状态转换是在一个地方完成的(例如,在您的示例中进入 GC离开 GC),那么一种方法如下:

  1. 被监视的线程将通过使用 POSIX 函数获得特殊状态的开始和结束时间clock_gettime()-clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp)您可以获得进程时间,并且clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp)可以获得线程时间(两者都是单调递增的)。
  2. 线程可以使用某种 IPC 将这些时间传递给分析器程序。
  3. 如果 profiler 应用程序知道进入和离开状态的线程时间,那么由于它知道测量切片变化时的线程时间值,它可以确定在报告时间片内报告的状态中花费了多少线程时间(当然,这里我们需要调整一个状态的开始时间,使其等于下一个报告时间片的开始)。
  4. 整个进程在特定状态上花费的时间可以通过对该状态的线程时间求和来计算。

请注意,通过/proc/<pid>/stator /proc/<pid>/task/<tid>/stat,测量精度不是很好(时钟滴答,通常以 10ms 为单位),但我不知道从进程/线程外部获取计时信息的其他方式。该函数clock_gettime()给出了非常准确的时间(名义上为纳秒精度,但请注意,至少在某些 MIPS 和 ARM 系统中,由于 Linux 内核中这些字段的准确计时器读取不存在实现,因此至少在某些 MIPS 和 ARM 系统中,精度与下面的stat文件一样差)。/proc您还需要进行一些实验以确保这两个计时源确实会给出相同的结果(通过从同一线程读取两个值)。你当然可以使用这些/proc/.../stat线程内部的文件,但是除非您在一个状态中花费大量时间,否则准确性不是很好。

于 2012-04-23T15:32:56.573 回答
1

好吧,与由 haskell 编译器生成并由 Threadscope 处理的分析信息的直接匹配是使用 C 和 GCC 的gprof实用程序(它是 GNU binutils 的一部分)。

要使其与 pthread 一起正常工作,您需要每个线程触发一些计时器初始化函数。这可以在不使用以下 pthreads 包装库修改代码的情况下完成:http: //sam.zoy.org/writings/programming/gprof.html。我最近没有处理过这个问题,可能是有些东西发生了变化,不再需要包装器了......

至于解释分析结果的 GUI,有 kprof (http://kprof.sourceforge.net)。不幸的是,AFAIK 它不会生成线程持续时间图,因为您必须使用 gprof 生成的文本信息来处理您自己的解决方案。

如果您对使用 GCC 提供的“标准”解决方案不挑剔,您可能想试试这个:http ://code.google.com/p/gperftools/?redir=1 (没有亲自尝试,但是听到好的意见)。

祝你好运!

于 2012-05-01T21:37:27.630 回答
0

看看英特尔 VTune Amplifier XE(以前的……英特尔线程分析器),看看它是否能满足您的需求。该工具和其他英特尔 Linux 开发工具可免费用于非商业用途

在视频Using the Timeline in Intel VTune Amplifier XE 中展示了多线程应用程序的时间线,9:20 演示者提到 “...使用框架 API,您可以以编程方式标记代码中的某些事件或阶段。这些标记将出现在时间线上。”

于 2012-04-28T20:02:42.130 回答
0

我认为构建一个简单的分析器将相当困难,因为您必须考虑许多不同的因素,并且系统分析是一项固有的复杂任务,在分析多线程应用程序时更是如此。我能想到的最好的建议是查看已经存在的东西,例如OProfile

OProfile 的一个优点是它是开源的,因此源代码可用。但除此之外,我怀疑询问如何构建分析应用程序可能超出了某人可以在 SO 问题中回答的范围,这可能就是为什么这个问题没有得到很多回应的原因。希望看一些示例可以帮助您入门,然后如果您有更集中的问题,您可能会得到一些更详细的答复。

于 2012-04-30T18:58:35.113 回答