如何知道进程正在使用哪个处理器?
How to know which processor is being used by a process?
在多线程环境中,我想确切地知道我的进程正在使用哪个处理器。
我查看了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
给出了最后使用的处理器,但没有给出进程正在使用的处理器。
知道如何准确捕获进程正在使用哪个处理器吗?
我的最终目标是了解我的算法使用机器的效率。
正如您在问题的评论中所说,询问系统您的进程在哪里执行是没有意义的,因为调度程序可以在您得到答复之前更改它。
在 Posix 环境中,您可以使用 pthread_setaffinity_np() 强制您的代码仅在某些 threads/cores 上执行,尽管我不确定这对您了解是否有帮助你算法的效率。
当我想像这样分析多线程算法时,我可能会使用诸如 gnome-system-monitor 或 KDE 系统监视器(gotop 也可以)之类的东西来打印出 CPU 使用图表所以我可以比较启动我的程序之前和之后的系统负载,它至少可以帮助找出是否有一个线程完全独立,不是很精细但是对于第一次通过就足够了。
一旦我太接近 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% 更重要
在多线程环境中,我想确切地知道我的进程正在使用哪个处理器。
我查看了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
给出了最后使用的处理器,但没有给出进程正在使用的处理器。
知道如何准确捕获进程正在使用哪个处理器吗?
我的最终目标是了解我的算法使用机器的效率。
正如您在问题的评论中所说,询问系统您的进程在哪里执行是没有意义的,因为调度程序可以在您得到答复之前更改它。
在 Posix 环境中,您可以使用 pthread_setaffinity_np() 强制您的代码仅在某些 threads/cores 上执行,尽管我不确定这对您了解是否有帮助你算法的效率。
当我想像这样分析多线程算法时,我可能会使用诸如 gnome-system-monitor 或 KDE 系统监视器(gotop 也可以)之类的东西来打印出 CPU 使用图表所以我可以比较启动我的程序之前和之后的系统负载,它至少可以帮助找出是否有一个线程完全独立,不是很精细但是对于第一次通过就足够了。
一旦我太接近 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% 更重要