如何跟踪特定核心上的 PID 运行 列表?
How to trace the list of PIDs running on a specific core?
我正在尝试 运行 专用 核心上的程序 Linux。 (我知道 Jailhouse 是一个很好的方法,但我必须使用现成的 Linux。:-( )
其他进程,如中断处理程序、内核线程、服务进程,偶尔也可能 运行 在 专用 核心上。我想禁用尽可能多的此类进程。为此,我需要首先确定 dedicated 核心上可能 运行 的进程列表。
我的问题是:
是否有任何现有工具可用于跟踪一段时间内特定核心上 运行 的 PID 或进程列表?
非常感谢您抽出时间来解答这个问题!
TL;DR 肮脏的 hacky 解决方案。
免责声明:在某些时候停止ps工作“列:行太长”:-/
复制到: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 }' > 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
说明
无限循环
- ps -o cpuid,pid |尾-n +2 |排序 | xargs-n 2 | grep -E "^$TARGET_CPU" | awk '{print $2}' > lastPIDs
- ps ax -o cpuid,pid
- 显示与 CPU
关联的 pid
- 尾-n+2
- 移除headers
- 排序
- 按 cpuid 排序
- xargs -n 2
- 删除开头的空格
- grep -E "^$TARGET_CPU"
- 按 CPU id
过滤
- awk '{打印 $2}'
- 获取 pid 列
- > lastPIDs
- 输出以归档目标 CPU id
的那些 las pid
- 我在{1..10};做 printf "#\n" >> lastPIDs;完毕
- 使用 "columns -t" 命令
破解漂亮的 .tsv 打印
- cp CPU_PIDs 辅助
- CPU_PIDs 保存了整个时间线,我们将它复制到 aux 文件以允许下一个命令将其用作输入和输出
- 粘贴 lastPIDs 辅助 > CPU_PIDs
- 将 lastPIDs 列附加到整个时间线文件CPU_PIDs
- 列-t CPU_PIDs > CPU_PIDs.humanfriendly.tsv
- 漂亮打印整个时间轴CPU_PIDs文件
归因
- Whosebug answer to: ps utility in linux (procps), how to check which CPU is used
- 来自 Mikel
- Whosebug answer to: Echo newline in Bash prints literal \n
- 来自 sth
- Whosebug answer to: shell variable in a grep regex
- 来自 David W.
- superuser answer to: Aligning columns in output from a UNIX command
- nixCraft article: HowTo: Unix For Loop 1 to 100 Numbers
不是问题的直接答案,但我通常使用 perf
上下文切换软件事件来识别系统或其他进程对我的基准测试的扰动
获得你想要的最好的方法是如下操作:
- 使用 isolcpus= Linux 内核引导参数 "free" 来自 Linux 调度程序的一个内核
- 禁用
irqbalance
守护程序(如果它正在执行)
- 通过在
/proc/irq/<irq_number>/smp_affinity
上手动写入 CPU 掩码,将 IRQ 关联设置为其他内核
- 最后,运行 您的程序通过
taskset
命令设置与专用内核的关联。
在这种情况下,这样的核心只会执行你的程序。要进行检查,您可以键入 ps -eLF
并查看 PSR
列(指定 CPU 编号)。
我正在尝试 运行 专用 核心上的程序 Linux。 (我知道 Jailhouse 是一个很好的方法,但我必须使用现成的 Linux。:-( )
其他进程,如中断处理程序、内核线程、服务进程,偶尔也可能 运行 在 专用 核心上。我想禁用尽可能多的此类进程。为此,我需要首先确定 dedicated 核心上可能 运行 的进程列表。
我的问题是:
是否有任何现有工具可用于跟踪一段时间内特定核心上 运行 的 PID 或进程列表?
非常感谢您抽出时间来解答这个问题!
TL;DR 肮脏的 hacky 解决方案。
免责声明:在某些时候停止ps工作“列:行太长”:-/
复制到: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 }' > 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
说明
无限循环
- ps -o cpuid,pid |尾-n +2 |排序 | xargs-n 2 | grep -E "^$TARGET_CPU" | awk '{print $2}' > lastPIDs
- ps ax -o cpuid,pid
- 显示与 CPU 关联的 pid
- 尾-n+2
- 移除headers
- 排序
- 按 cpuid 排序
- xargs -n 2
- 删除开头的空格
- grep -E "^$TARGET_CPU"
- 按 CPU id 过滤
- awk '{打印 $2}'
- 获取 pid 列
- > lastPIDs
- 输出以归档目标 CPU id 的那些 las pid
- ps ax -o cpuid,pid
- 我在{1..10};做 printf "#\n" >> lastPIDs;完毕
- 使用 "columns -t" 命令 破解漂亮的 .tsv 打印
- cp CPU_PIDs 辅助
- CPU_PIDs 保存了整个时间线,我们将它复制到 aux 文件以允许下一个命令将其用作输入和输出
- 粘贴 lastPIDs 辅助 > CPU_PIDs
- 将 lastPIDs 列附加到整个时间线文件CPU_PIDs
- 列-t CPU_PIDs > CPU_PIDs.humanfriendly.tsv
- 漂亮打印整个时间轴CPU_PIDs文件
归因
- Whosebug answer to: ps utility in linux (procps), how to check which CPU is used
- 来自 Mikel
- Whosebug answer to: Echo newline in Bash prints literal \n
- 来自 sth
- Whosebug answer to: shell variable in a grep regex
- 来自 David W.
- superuser answer to: Aligning columns in output from a UNIX command
- nixCraft article: HowTo: Unix For Loop 1 to 100 Numbers
不是问题的直接答案,但我通常使用 perf
上下文切换软件事件来识别系统或其他进程对我的基准测试的扰动
获得你想要的最好的方法是如下操作:
- 使用 isolcpus= Linux 内核引导参数 "free" 来自 Linux 调度程序的一个内核
- 禁用
irqbalance
守护程序(如果它正在执行) - 通过在
/proc/irq/<irq_number>/smp_affinity
上手动写入 CPU 掩码,将 IRQ 关联设置为其他内核
- 最后,运行 您的程序通过
taskset
命令设置与专用内核的关联。
在这种情况下,这样的核心只会执行你的程序。要进行检查,您可以键入 ps -eLF
并查看 PSR
列(指定 CPU 编号)。