我正在尝试使用 Raspberry Pi 上的 Raspbian 发行版来实现最接近的实时处理,以操作其 GPIO 引脚。我想“感受”一下我可以期待的表演。
我打算通过编写一个简单的 C 程序来尽可能快地重复切换引脚,并使用逻辑分析器对其进行监控来实现此目的。
但也许还有另一种方法,通过编写上述程序,但简单地记录上下文切换,以准确查看该线程/进程何时可以控制几秒钟的采样周期。
上一个问题回答如何查看给定进程在一段时间内进行了多少次上下文切换,但是是否有一种方法可以记录切换的精确时间,并且可能是针对每个进程,而不仅仅是一个进程?显然这会产生开销,但仍然有用。显然,数据应该存储在 RAM 中以最小化开销
自我提醒:可能的解决方案:
- 实时列出进程所有操作的命令
- Hacky:让程序重复获取并存储当前时间(一旦日志达到一定限制,就将其保存到文件中)。或者,进行轻微改进以避免大量日志:使用一种算法,如果连续时间足够接近,可以推断出它们没有被其他进程抢占,则可以消除连续时间。
答案1
我没有答案,但你可能会在其中找到一个工具、示例和资源perf
由 Brendan Gregg 在命令和 Linux 内核 ftrace 和 debugfs上编写或列出。
在我的 Raspberry Pi 上,这些工具位于 package 中perf-tools-unstable
。该perf
命令实际上是在/usr/bin/perf_3.16
.
感兴趣的可能是这个讨论和上下文切换基准作者:伯努瓦·西古尔 (Benoit Sigoure)纬度ctx从相当旧的测试lmbench套房。
他们可能需要一些工作才能在 Pi 上运行,例如tsuna/contextswitch
我编辑timectxswws.c
get_iterations()
为,并从 中while (iterations * ws_pages * 4096UL < 4294967295UL) {
删除。-march=native -mno-avx
Makefile
通过 ssh 在 Pi 上使用perf record
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
给出这样的输出
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:
大概显示上下文切换事件发生的时间以及哪个进程。