gpt4 book ai didi

c++ - 如何在 Linux 中跟踪 pthread 调度?

转载 作者:太空狗 更新时间:2023-10-29 12:36:49 25 4
gpt4 key购买 nike

在 Linux 上,对于使用 pthreads 的 C/C++ 程序,有没有办法查看线程在进程的生命周期内是如何安排的?我想看看每个线程运行在哪个 CPU 上。我想看看线程何时被抢占(以及为什么)。

我们已经建立了一个测试环境,其中两台相同的机器运行相同的进程。第三台机器生成两台机器监听的“时钟”事件(通过多播发送)。机器的进程在每个时钟做一些事情,然后将结果发送到第三台机器。这个想法是第三台机器消除了时钟同步问题(在两台相同的机器之间)。我们的期望是返回的结果应该恰好(或几乎恰好)在同一时间。通常他们是。问题是,我们偶尔会看到峰值,其中一个结果会显着延迟(延迟是所有结果标准差的 10 倍)。

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

我怀疑这些峰值是由线程抢占、线程 CPU 迁移(以及缓存未命中)的偶尔“完美 Storm ”引起的。在各个进程中,实际上只有两三个“重要”的线程在做时间敏感的工作。其余的是辅助/支持线程,优先级较低。总的来说,重要/时间敏感线程的数量实际上等于(或小于)核心数量。

我怀疑解决这个问题的方法是小心地将重要线程分配给它们自己的核心,并将所有支持线程转储到它们自己的核心上。但这需要大量的开发工作,我想在走这条路之前确认我的怀疑。

最佳答案

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

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

更新:正如 Mathieu Desnoyers 提到的,lttng 从 2.6.36 开始就可以用作 Linux 内核模块,现在不需要内核补丁。

关于c++ - 如何在 Linux 中跟踪 pthread 调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9421703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com