如何在 Linux 中将进程时间分配给单个 CPU

如何在 Linux 中将进程时间分配给单个 CPU

我想分析一个进程的处理时间是如何分配给单个 CPU 的(实际上是 KVM)。在 Linux 中,任务可以在其生命周期内迁移到其他 CPU,进程可能在 CPU0 中运行 1 秒,然后在 CPU1 中运行 2 秒,但我们只能从 /proc/pid/stat 获取总体处理时间(3 秒),而不能获取 1 秒和 2 秒。

我们可以在 /proc/stat 中获取所有进程的每个 CPU 总处理时间,但无法获取特定进程(例如 KVM)的每个 CPU 总处理时间。

还有一些调度静态/proc/pid/schedstat 和 /proc/schedstat,但我不清楚如何从迁移次数等静态数据中得出它。

这个问题也包含在virt-top 文档,我认为仍然没有明确的解决办法。

你有什么想法?

答案1

如果我们谈论进程,Linux 内核有各种各样广泛的方法来查看底层发生了什么。不幸的是,我对此了解不够多,无法给你一个明确的答案,但我可以建议你看看BSD 流程会计CONFIG_BSD_PROCESS_ACCT),通过 netlink 导出任务/进程统计信息CONFIG_TASKSTATS),内核性能事件和计数器CONFIG_PERF_EVENTS),OProfile (CONFIG_OPROFILE),基于 GCOV 的内核分析( CONFIG_GCOV_KERNEL)。此外,如果您使用CGroups对于进程来说,子系统很可能也提供一些调试功能。

如果您用 Google 搜索这些设施,您会很容易地找到一些文章,这些文章连同其文档和/或参考网站可以帮助您找到哪些可以帮助您,哪些不能帮助您。

我也不知道 KVM,但我认为它会显示为内核进程,因此您可以使用上述系统轻松监控它。如果我没记错的话,kvm 还具有后端和前端驱动程序的概念(也许还有其他名称?),因此请记住,部分客户虚拟机工作负载将显示为主主机负载。

这些系统中的一个或多个的组合可以帮助您实现您的追求。

最后但并非最不重要的一点是,我无法想象这些信息对您有什么用处 - 除非您是内核调度程序黑客,但那么您就不会在这里询问 SF :) 调度程序应该做得足够好,以防止尽可能多的 CPU 跳跃以保持缓存温暖(调度程序了解逻辑线程和多核拓扑并使用该信息)但通常有一种方法可以强制某些进程仅在某些 CPU 上运行。

很抱歉我无法更准确地回复,但我希望这可以帮助您入门。

相关内容