我正在尝试在 Linux 的专用内核上运行程序。(我知道监狱是这样做的好方法,但我必须使用现成的 Linux。:-()
其他进程,例如中断处理程序、内核线程、服务进程,也可能偶尔在专用内核上运行。我想禁用尽可能多的此类进程。为此,我首先需要确定可能在专用核心上运行的进程列表。
我的问题是:
是否有任何现有工具可用于跟踪一段时间内在特定核心上运行的 PID 或进程列表?
非常感谢您在这个问题上的时间和帮助!
我正在尝试在 Linux 的专用内核上运行程序。(我知道监狱是这样做的好方法,但我必须使用现成的 Linux。:-()
其他进程,例如中断处理程序、内核线程、服务进程,也可能偶尔在专用内核上运行。我想禁用尽可能多的此类进程。为此,我首先需要确定可能在专用核心上运行的进程列表。
我的问题是:
是否有任何现有工具可用于跟踪一段时间内在特定核心上运行的 PID 或进程列表?
非常感谢您在这个问题上的时间和帮助!
TL;DR 肮脏的 hacky 解决方案。
免责声明:在某些时候停止工作“列:行太长”:-/
将其复制到:core-pids.sh
#!/bin/bash
TARGET_CPU=0
touch lastPIDs
touch CPU_PIDs
while true; do
ps ax -o cpuid,pid | tail -n +2 | sort | xargs -n 2 | grep -E "^$TARGET_CPU" | awk '{print $2}' > lastPIDs
for i in {1..100}; do printf "#\n" >> lastPIDs; done
cp CPU_PIDs aux
paste lastPIDs aux > CPU_PIDs
column -t CPU_PIDs > CPU_PIDs.humanfriendly.tsv
sleep 1
done
然后
chmod +x core-pids.sh
./core-pids.sh
然后用你最喜欢的编辑器打开 CPU_PIDs.humanfriendly.tsv,然后检查!
关键在“ps -o cpuid,pid”位,更详细的信息,请评论。:D
解释
无限循环
归因
获得你想要的最好的方法是如下操作:
irqbalance
守护程序(如果它正在执行)/proc/irq/<irq_number>/smp_affinity
taskset
最后,运行您的程序,通过命令设置与专用内核的亲和性。在这种情况下,这样的核心只会执行你的程序。为了检查,您可以键入ps -eLF
并查看PSR
列(指定 CPU 编号)。
不是问题的直接答案,但我通常使用perf
上下文切换软件事件来识别系统或我的基准测试中其他进程的扰动