【问题标题】:How to know which processor is being used by a process?如何知道进程正在使用哪个处理器?
【发布时间】:2021-10-04 18:35:30
【问题描述】:

在多线程环境中,我想确切知道我的进程正在使用哪个处理器。

我查看了top和htop的源代码。 top/htop 的问题在于它获取总时间(来自 /proc/stat/proc/[pid]/stat)并将其除以 CPU 数量,而与分配给其他处理器的负载无关。

如果理论上总 %CPU 为 350%,我们知道至少有 4 个处理器正在使用。上层对此进行了概括,并没有“准确”量化每个处理器的使用情况。

350% 有不同的含义:

Processor 1: 100%
Processor 2: 75%
Processor 3: 75%
Processor 4: 100%

Processor 1: 75%
Processor 2: 100%
Processor 3: 100%
Processor 4: 75%

/proc/[pid]/stat 给出了最后使用的处理器,但没有给出进程正在使用哪些处理器。

知道如何准确捕获进程正在使用的处理器吗?

我的最终目标是找出我的算法使用机器的效率。

【问题讨论】:

  • 进程没有分配给特定的 CPU,它们可以随时移动。
  • 所以当你得到答案时,它可能已经改变了。
  • 维基百科:Processor affinity

标签: c++ linux linux-kernel operating-system


【解决方案1】:

正如你在问题的 cmets 中所说,询问系统在哪里执行你的进程是没有意义的,因为调度程序可以在你得到答复之前更改它。

在 Posix 环境中,您可以使用 pthread_setaffinity_np() 强制您的代码仅在某些线程/内核上执行,尽管我不确定这对您了解算法的效率是否有太大帮助。

当我想分析这样的多线程算法时,我可能会使用 gnome-system-monitor 或 KDE 系统监视器(gotop 也可以)打印出 CPU 使用率图表,以便比较系统在启动我的程序之前和之后加载,它至少可以帮助找出是否有 1 个线程完全独​​立,不是很精细,但对于第一次通过就足够了。

一旦我太接近 100%/程序太快而无法查看我是否正在使用所有可用资源,我通常会做类似的事情

auto timeBefore = std::chrono::high_resolution_clock::now();
my_algo();
auto timeAfter = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> completeTime = timeAfter-timeBefore;
std::cout << "Took: " << completeTime.count() << "s" << std::endl;

所以我毕竟可以做一些基准测试,执行时间通常比将所有内核固定到 100% 更重要

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2021-11-02
    相关资源
    最近更新 更多