【问题标题】:How to trace the list of PIDs running on a specific core?如何跟踪在特定内核上运行的 PID 列表?
【发布时间】:2016-10-01 06:37:54
【问题描述】:

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

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

我的问题是:

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

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

【问题讨论】:

  • 一种方法是使用loglevel=7 启动,这会在内核日志(dmesg) 中打印a lot。它将包括调度程序调试,然后您可以对其进行分析。
  • @grochmal,我在想是否有任何类似性能的工具可以做到这一点。 dmesg 没问题,但它可能无法捕获所有服务。例如,ISR 中不允许 printk,这意味着我们将无法在 dmesg 中捕获它...
  • 你能运行systemtap吗?对process migrate tapset 进行小修改可能会满足您的需求。

标签: linux performance performance-testing perf jailhouse


【解决方案1】:

TL;DR Dirty hacky 解决方案。

免责声明:有时会停止工作“column: line too long”:-/

复制到: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 文件

归因

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-29
        • 2014-12-02
        • 1970-01-01
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 2016-10-11
        • 1970-01-01
        相关资源
        最近更新 更多