linux:有没有办法转储任务运行队列?

linux:有没有办法转储任务运行队列?

我面临着一个空闲条件下奇怪的极端负载问题

有没有办法直接转储linux进程调度程序运行队列?
例如,当sar -q输出 400 as 时runq-sz,获得这 400 个 PID?

pstop朋友们似乎太“慢”,​​无法拍摄即时快照,因为他们只显示了几个进程DR状态。

答案1

我不知道如何转储运行队列,但您可能能够使用获取其他信息perf。例如,如果正在创建新进程,您可以使用以下方法跟踪它们

perf record -e sched:sched_process_exec -a

使用 control-C 停止录制,然后使用 来查看结果perf report。您还可以查看基于perf此的简单但功能强大的脚本布伦丹·格雷格已经聚集了。

答案2

直接查看内核源代码,您可以浏览如下任务。

struct task_struct *process, *thread;
int cnt = 0;

rcu_read_lock();
for_each_process_thread(process, thread) {
    task_lock(thread);

/* do something with the task properties:

     thread->state;
     thread->wake_cpu;
     thread->pid;
     thread->comm;
*/

    task_unlock(thread);
    cnt++;
}
rcu_read_unlock();

最重要的部分是入口处的任务 RCU 和开锁在出口处。您将在内核模块中对此转储进行编码,并提供在用户空间命令中检索列表的方法。

我建议您阅读我在 GitHub @ 中的示例并根据您的需要进行增强转储任务

相关内容