6

我正在尝试在 Linux 的专用内核上运行程序。(我知道监狱是这样做的好方法,但我必须使用现成的 Linux。:-()

其他进程,例如中断处理程序、内核线程、服务进程,也可能偶尔在专用内核上运行。我想禁用尽可能多的此类进程。为此,我首先需要确定可能在专用核心上运行的进程列表。

我的问题是:

是否有任何现有工具可用于跟踪一段时间内在特定核心上运行的 PID 或进程列表?

非常感谢您在这个问题上的时间和帮助!

4

3 回答 3

3

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

解释

无限循环

  • 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
      • 删除标题
    • 种类
      • 按 cpuid 排序
    • xargs -n 2
      • 在乞讨时删除空格
    • grep -E "^$TARGET_CPU"
      • 按 CPU id 过滤
    • awk '{打印 $2}'
      • 获取 pid 列
    • > 最后PID
      • 输出以归档目标 CPU id 的那些 las pid
  • 对于 {1..10} 中的 i;做 printf "#\n" >> lastPIDs; 完毕
    • 使用“columns -t”命令破解漂亮的 .tsv 打印
  • cp CPU_PIDs 辅助
    • CPU_PIDs 保存整个时间线,我们将其复制到 aux 文件中以允许下一个命令将其用作输入和输出
  • 粘贴 lastPIDs aux > CPU_PIDs
    • 将 lastPIDs 列附加到整个时间线文件 CPU_PIDs
  • 列 -t CPU_PIDs > CPU_PIDs.humanfriendly.tsv
    • 漂亮地打印整个时间线 CPU_PIDs 文件

归因

于 2016-06-02T10:24:57.797 回答
1

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

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

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

于 2016-12-14T13:20:53.400 回答
0

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

于 2016-07-13T13:27:08.770 回答