假设我需要定期查看一个线程的状态,并在整个程序执行过程中记录它的状态。我不知道该如何开始考虑这个问题。有什么建议(双关语?)?我在Linux上,使用gcc,phreads和C,可以使用所有常用的Linux工具。基本上,我想我是在问如何为线程构建一个简单的分析器,它将告诉我在程序执行期间线程处于某种或其他状态的时间有多长。
我希望能够像Threadscope那样创建图形。X轴是时间,Y轴是核心/线程数,“颜色”是状态:绿色表示运行,橙色表示垃圾回收,依此类推。现在这样做更有意义了吗?

。
发布于 2012-04-23 23:32:57
对于特定于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 ),那么一种方法如下:
clock_gettime()来获取特定状态的开始和结束时间-使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp)可以获取进程时间,使用clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp)可以获取线程时间(两者都是单调递增的)。请注意,通过/proc/<pid>/stat或/proc/<pid>/task/<tid>/stat,测量精度不是很好(时钟滴答,通常以10ms为单位),但我不知道从进程/线程外部获取计时信息的其他方法。函数clock_gettime()提供非常精确的时间(名义上是纳秒精度,但请注意,至少在某些MIPS和ARM系统中,精度与/proc下的stat文件一样差,这是因为在Linux内核中不存在这些字段的精确计时器读数的实现)。您还需要做一些实验,以确保这两个计时源真的会给出相同的结果(通过从相同的线程读取两个值)。当然,您可以在线程中使用这些/proc/.../stat文件,但除非您在状态中花费大量时间,否则准确性并不是很好。
发布于 2012-05-02 05:37:28
嗯,与haskell编译器生成并由Threadscope处理的性能分析信息直接匹配的是,使用C和GCC的gprof实用程序(它是binutils的一部分)。
为了让它能与pthread一起正常工作,你需要每个线程都触发一些计时器初始化函数。这可以在不修改代码的情况下使用pthread包装器库:http://sam.zoy.org/writings/programming/gprof.html来完成。我最近没有处理这个问题,可能是有些东西已经改变了,不再需要包装器了……
至于解释分析结果的图形用户界面,有kprof (http://kprof.sourceforge.net)。不幸的是,AFAIK它不能生成线程持续时间图,因为你必须使用gprof生成的文本信息来处理你自己的解决方案。
如果你对使用GCC提供的“标准”解决方案不挑剔,你可以试试这个:http://code.google.com/p/gperftools/?redir=1 (没有亲自尝试,但听到了不错的意见)。
祝好运!
发布于 2012-04-29 04:02:42
看看Intel VTune Amplifier XE (以前的…英特尔线程档案器),查看它是否能满足您的需求。此开发工具和其它英特尔Linux开发工具均可通过free for non-commercial use获得。
在展示多线程应用程序的时间线的视频Using the Timeline in Intel VTune Amplifier XE中,在9:20,演示者提到"...with帧Using the Timeline in Intel VTune Amplifier XE,您可以通过编程方式标记代码中的某些事件或阶段。这些标记将出现在时间线上。“
https://stackoverflow.com/questions/10267821
复制相似问题