如何跟踪在特定核心上运行的PID列表



我正试图在Linux中的专用内核上运行一个程序。(我知道监狱是一个很好的方法,但我必须使用现成的Linux。)-()

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

我的问题是:

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

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

TL;DR肮脏的黑客解决方案。

免责声明:在某个时刻停止工作">列:行太长":-/

将此复制到: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|tail-n+2|sort|xargs-n 2|grep-E"^$TARGET_CPU"|awk'{print$2}'>最后pid
    • ps ax-o cpuid,pid
      • 显示与CPU关联的pid
    • 尾部-n+2
      • 删除标题
    • 排序
      • 按cpuid排序
    • xargs-n 2
      • 乞讨时删除空格
    • grep-E"^$TARGET_CPU">
      • 按CPU id筛选
    • awk"{print$2}">
      • 获取pid列
    • >最后PID
      • 输出,为目标CPU id归档那些las pid
  • 对于{1..10}中的i;打印"#\n">>最后PID;已完成使用"columns-t"命令破解漂亮.tsv打印
  • cp CPU_PID辅助
    • CPU_PID保存整个时间线,我们将其复制到aux文件中,以允许下一个命令将其用作输入和输出
  • 粘贴最后PID aux>CPU_PID
    • 将lastPID列附加到整个时间线文件CPU_PID
  • 列-t CPU_PIDs>CPU_PIDs.humanfriendly.tsv
    • 漂亮地打印整个时间线CPU_PID文件
  • 归因

    • stackoverflow对linux中的ps实用程序(procps)的回答,如何检查使用了哪个CPU米克尔的
    • stackoverflow回答:在Bash中回显换行打印文字\n因某事
  • stackoverflow对grep-regex中shell变量的回答
    • 作者:David W
  • 超级用户的答案:对齐UNIX命令输出中的列
    • Janne Pikkarainen
  • nixCraft文章:HowTo:Unix For循环1到100个数字
  • 获得所需内容的最佳方法是如下操作:

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

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

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

    最新更新