我想分析一个进程的处理时间是如何分配给单个 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 上运行。
很抱歉我无法更准确地回复,但我希望这可以帮助您入门。