繁体   English   中英

如何在Linux中跟踪pthread调度?

[英]How to trace pthread scheduling in Linux?

在Linux上,对于使用pthread的C / C ++程序,是否有办法查看在进程生命周期中如何计划线程? 我想看看每个线程在哪个CPU上运行。 我想看看线程何时被抢占(为什么)。

我们建立了一个测试环境,其中两个相同的机器运行相同的进程。 第三台机器生成“时钟”事件,两台机器都监听(通过多播发送)事件。 机器的进程在每个时钟执行一些操作,然后将结果发送到第三台机器。 这个想法是第三台机器消除了时钟同步问题(在两台相同的机器之间)。 我们的期望是返回的结果应该在同一时间(或几乎完全相同)。 通常,它们是。 问题是,我们偶尔会出现尖峰,其中一个结果会大大延迟(大约是所有结果的标准偏差的10倍)。

我们正在研究微秒级的优化。 在这个领域,缓存未命中和线程唤醒时间成为一个问题。 众所周知,所有进程中的线程总数大于CPU内核数。

我怀疑这些峰值是由线程抢占,线程-CPU迁移(因此导致缓存未命中)的偶然“完美风暴”引起的。 在各个过程中,实际上只有两个或三个“重要”线程在进行对时间敏感的工作。 其余的是辅助/支持线程,优先级较低。 总的来说,重要/对时间敏感的线程数实际上等于(或少于)核心数。

我怀疑对此的解决方案是将重要的线程仔细分配给自己的核心,并将所有支持线程转储到自己的核心上。 但这需要大量的开发工作,我想在走这条路之前确认自己的怀疑。

strace-跟踪进程行为的简单工具,但似乎无法检查核心ID。

lttng-需要修补内核,但更令人印象深刻的是,您可以确切地知道每个内核在做什么,例如上下文切换/中断处理。

更新:正如Mathieu Desnoyers所述,从2.6.36开始,lttng可以用作Linux内核模块,现在不需要内核修补程序。

在Linux中,您可以使用以下命令获取线程的cpu信息

pidstat -t -p <processid> 
    => will print the cpu info in which the process is running

在我们的应用程序中,我们使用以下命令将cpu分配给进程/线程

taskset -c 1,3,11,12,13 <Binary> 

首先,我们找到负载最小的cpu,然后将核心二进制文件(应该是负载最小的)分配给该cpu。其余进程将分配给其他CPU

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM