linux - 测量内核空间中的上下文切换时间
问题描述
有很多可用的程序可用于从用户空间计算上下文切换时间。但是所有这些都有一些开销——比如clock_gettime()定时器的开销,管道中读/写操作的开销。
是否可以在不存在上述开销的 Linux 内核空间中测量上下文切换时间?
可以在内核模块中添加两个 GLOABL VARIABLES来存储调用 context_switch 函数的时间,以及context_switch完成的时间。
我使用这种方法面临的挑战是上下文切换功能可以被任何进程和任何核心调用。
向 struct task_struct 或 struct rq添加一些东西是否可行或可取?
我正在使用 Ubuntu 16.04 操作系统。
解决方案
如果要检查线程之间上下文切换的延迟(不包括线程执行时间):
基于内核配置,可以参考
- __schedule : 调度器主 API
- preempt_schedule_common
- 日程
- preempt_schedule_context
- preempt_schedule_irq
但是,很难计算确切的延迟,因为整个调度功能似乎不受 spinlock_irq_disable() 上下文的保护。如果您不禁用“本地中断”,您的延迟计算将包括 ISR 服务时间。
__schedule 正在为某些特定的关键部分禁用 local_irq。无论如何,调度的核心部分是 __schedule() API。
推荐阅读
- reactjs - 在这种情况下,setstate 会在 Object map 之后运行吗?
- python - 向量场中艺术图案的机器生成
- javascript - 除了第一个按钮外,单击事件不适用于相同的类按钮
- node.js - 如何安排谷歌云功能触发最近的秒?
- json - 为什么当我解析我的响应 okHttp 时它不起作用
- makefile - 一个Makefile规则中的两个冒号是什么意思
- html - MFC:通过 about: 或 data: 将 CHtmlView 与内存字符串一起使用?
- javascript - 角度启用/禁用 div 元素上的 contenteditable
- javascript - 使用自动滚动滚动页面时出现故障
- mysql - Mysql:左连接错误结果集与子查询结果的子查询结果