如何跟踪特定核心上的 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文件

归因

不是问题的直接答案,但我通常使用 perf 上下文切换软件事件来识别系统或其他进程对我的基准测试的扰动

获得你想要的最好的方法是如下操作:

  1. 使用 isolcpus= Linux 内核引导参数 "free" 来自 Linux 调度程序的一个内核
  2. 禁用 irqbalance 守护程序(如果它正在执行)
  3. 通过在 /proc/irq/<irq_number>/smp_affinity
  4. 上手动写入 CPU 掩码,将 IRQ 关联设置为其他内核
  5. 最后,运行 您的程序通过 taskset 命令设置与专用内核的关联。

在这种情况下,这样的核心只会执行你的程序。要进行检查,您可以键入 ps -eLF 并查看 PSR 列(指定 CPU 编号)。