在Linux上,对于使用pthreads的C / C ++程序,是否有办法了解如何在进程的生命周期内安排线程?我想看看每个线程运行的CPU。我想看看线程何时被抢占(以及为什么)。
我们已经建立了一个测试环境,其中两台相同的机器运行相同的进程。有第三台机器生成“时钟”事件,两台机器监听(通过多播发送)。机器的进程在每个时钟执行一些操作,然后将结果发送到第三台机器。这个想法是第三台机器消除了时钟同步问题(在两台相同的机器之间)。我们的期望是回归的结果应该恰好(或几乎完全)同时。通常他们是。问题是,我们偶尔看到峰值,其中一个结果被显着延迟(所有结果的标准偏差的10倍)。
我们正在研究微秒级优化。在这个领域,缓存未命中和线程唤醒时间成为一个问题。众所周知,所有进程中的线程总数大于CPU核心数。
我怀疑这些峰值是由线程抢占,线程CPU迁移(因此缓存未命中)的偶然“完美风暴”引起的。在各种过程中,实际上只有两三个“重要”线程在进行时间敏感的工作。其余的是辅助/支持线程,优先级较低。总的来说,重要/时间敏感线程的数量实际上等于(或小于)核心数量。
我怀疑解决这个问题的方法是小心地将重要线程分配给他们自己的核心,并将所有支持线程转储到他们自己的核心上。但这需要相当多的开发工作,我想在走这条路之前确认我的怀疑。
答案 0 :(得分:1)
strace - 跟踪进程行为的简单工具,但似乎无法检查核心ID。
lttng - 需要修补内核,但更令人印象深刻的是,你可以确切知道每个内核正在做什么,如上下文切换/中断处理。
更新:正如Mathieu Desnoyers所提到的,从2.6.36开始,lttng可以用作Linux内核模块,现在不需要内核修补。
答案 1 :(得分:0)
在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