记录每个进程或线程上下文切换的时间

CL2*_*L22 6 process logs debugging real-time profiling

我正在尝试使用 Raspberry Pi 上的 Raspbian 发行版来最接近实时处理,以操纵其 GPIO 引脚。我想对我可以期待的那种表现有一种“感觉”。

我打算通过编写一个简单的 C 程序来做到这一点,该程序尽可能快地重复切换引脚,并使用逻辑分析器对其进行监控。

但也许还有另一种方法,通过编写上述程序,但只是简单地记录上下文切换,以准确查看该线程/进程何时可以控制一个采样周期,比如几秒钟。

前面的问题回答了如何查看给定进程在某个时间段内进行了多少上下文切换,但是是否有一种方法可以记录切换的精确时间,并且可能针对每个进程,而不仅仅是一个进程?显然,这会产生开销,但仍然有用。显然,数据应该存储在 RAM 中以最小化开销

自我注意:可能的解决方案:

  • 命令实时列出进程的所有操作
  • Hacky:使程序反复获取并存储当前时间(并在日志达到一定限制后将其保存到文件中)。或者,稍微改进以避免大量日志:使用一种算法来消除连续时间,如果它们足够接近,可以推断它们没有被其他进程抢占。

meu*_*euh 4

我没有答案,但您可能会在 Brendan Gregg 在命令和 Linux 内核 ftrace 和 debugfs 上编写或列出的工具、示例和资源perf中找到其中之一。

在我的 Raspberry Pi 上,这些工具位于 package 中perf-tools-unstable。该perf命令实际上是在/usr/bin/perf_3.16.


有趣的可能是Benoit Sigoure 的讨论和上下文切换基准测试,以及来自相当旧的lmbench套件的lat_ctx测试。

他们可能需要一些工作才能在 Pi 上运行,例如tsuna/contextswitch我编辑timectxswws.c get_iterations()while (iterations * ws_pages * 4096UL < 4294967295UL) {,并-march=native -mno-avx从 中删除Makefile


perf record通过 ssh 在 Pi 上使用10 秒,同时while sleep .1;do echo hi;done在另一个 ssh 中执行以下操作:

sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less
Run Code Online (Sandbox Code Playgroud)

给出这样的输出

           sleep 29341 2703976.560357: 
         swapper     0 2703976.562160: 
    kworker/u8:2 29163 2703976.564901: 
         swapper     0 2703976.565737: 
            echo 29342 2703976.565768: 
     migration/3    19 2703976.567549: 
           sleep 29343 2703976.570212: 
     kworker/0:0 28906 2703976.588613: 
     rcu_preempt     7 2703976.609261: 
           sleep 29343 2703976.670674: 
            bash 29066 2703976.671654: 
            echo 29344 2703976.675065: 
            sshd 29065 2703976.675454: 
         swapper     0 2703976.677757: 
Run Code Online (Sandbox Code Playgroud)

大概显示上下文切换事件发生的时间以及哪个进程。