首页 > 解决方案 > 测量内核空间中的上下文切换时间

问题描述

有很多可用的程序可用于从用户空间计算上下文切换时间。但是所有这些都有一些开销——比如clock_gettime()定时器的开销,管道中读/写操作的开销。

是否可以在不存在上述开销的 Linux 内核空间中测量上下文切换时间?

可以在内核模块中添加两个 GLOABL VARIABLES来存储调用 context_switch 函数的时间,以及context_switch完成的时间。

我使用这种方法面临的挑战是上下文切换功能可以被任何进程和任何核心调用。

向 struct task_struct 或 struct rq添加一些东西是否可行或可取?

我正在使用 Ubuntu 16.04 操作系统。

标签: linuxlinux-kernellinux-device-driver

解决方案


如果要检查线程之间上下文切换的延迟(不包括线程执行时间):

基于内核配置,可以参考

  • __schedule : 调度器主 API
  • preempt_schedule_common
  • 日程
  • preempt_schedule_context
  • preempt_schedule_irq

但是,很难计算确切的延迟,因为整个调度功能似乎不受 spinlock_irq_disable() 上下文的保护。如果您不禁用“本地中断”,您的延迟计算将包括 ISR 服务时间。

__schedule 正在为某些特定的关键部分禁用 local_irq。无论如何,调度的核心部分是 __schedule() API。


推荐阅读