我想分析处理时间如何分配给一个进程(KVM实际)的一个进程。 在Linux中,任务可以在其生命周期中迁移到其他CPU,这个过程可能在CPU0中运行1秒,然后在CPU1中运行2秒,但是我们只能从/ proc / pid中获得总体处理时间(3秒) / stat,但不是1秒和2秒。
我们可以得到/ proc / stat中所有进程的每个CPU集合处理时间,但不能针对特定的进程,例如KVM。
在/ proc / pid / schedstat和/ proc / schedstat中也有一些调度静态,但是我不清楚如何从像迁移数量这样的静态数据中派生出来。
这个问题在virt-top文档中也有介绍 ,我觉得目前还没有明确的解决scheme。
你有什么想法?
如果我们谈论进程,Linux内核有各种各样的方法来看看底下发生了什么。 不幸的是我不知道这个给你一个明确的答案,但我可以build议你看看BSD进程记账 ( CONFIG_TASKSTATS ), 通过netlink ( CONFIG_TASKSTATS ) 导出任务/进程统计信息 , 内核性能事件和计数器 ( CONFIG_PERF_EVENTS ),OProfile( CONFIG_OPROFILE ), 基于GCOV的内核分析 ( CONFIG_GCOV_KERNEL )。 另外如果你使用CGroups进程,那么子系统也有一些debugging工具可供使用 。
如果你的谷歌为这些设施,你会很容易拿出一些文章,连同他们的文档和/或参考网站,可以帮助你find哪些可以帮助你,哪些不能。
我也不知道KVM,但是我想它会显示为一个内核进程,所以你可以很容易地用上面的系统来监视它。 IIRC kvm也有后端和前端驱动程序(也许有其他名称)的概念,所以请记住guest虚拟机虚拟机工作负载的一部分将显示为主要主机负载。
其中一个或多个系统可以帮助你实现你的目标。
最后但并非最不重要的是,我无法想象这些信息如何对你有用 – 除非你是一个内核调度黑客,但你不会在这里问SF:调度器应该做的足够好防止尽可能多的cpu跳转以保持caching温度(调度器知道逻辑线程和多核拓扑并使用该信息),但是通常只能强制一些进程在某些CPU上运行。
对不起,我无法以更好的精度答复,但我希望这可以帮助你开始。