![如何检查我的进程是否被内核抢占/多久被内核抢占?](https://linux22.com/image/192290/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%88%91%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%90%A6%E8%A2%AB%E5%86%85%E6%A0%B8%E6%8A%A2%E5%8D%A0%2F%E5%A4%9A%E4%B9%85%E8%A2%AB%E5%86%85%E6%A0%B8%E6%8A%A2%E5%8D%A0%EF%BC%9F.png)
为了分析程序,我想在一个 CPU 上不间断地运行它。为此,我使用taskset
和的组合chrt
:
# taskset -c 1 chrt -f 99 ./my_program
现在我的问题是是否有一个工具可以让我检查进程是否/多久被内核的上下文切换中断。
答案1
您可以使用perf
;例如,
perf stat -e context-switches,cpl_cycles.ring0,cpl_cycles.ring123 your_command
将产生类似于以下内容的摘要
Performance counter stats for 'your_command':
1 context-switches
11,890,096 cpl_cycles.ring0
9,980,265 cpl_cycles.ring123
0.011218937 seconds time elapsed
0.007533000 seconds user
0.003766000 seconds sys
这表明在执行期间发生了一次上下文切换(切换到另一个进程,而不是内核)your_command
,CPU 花费了 54% 的时间来运行内核代码。
确保给定进程尽可能多地获得 CPU 的关注可能会变得相当复杂。Victor Stinner 的基准设置文档提供对问题的良好概述以及缓解这些问题的技术;他的文章主要关注基准测试,但其中大部分内容也适用于其他情况。