我面临着一个空闲条件下奇怪的极端负载问题。
有没有办法直接转储linux进程调度程序运行队列?
例如,当sar -q
输出 400 as 时runq-sz
,获得这 400 个 PID?
ps
,top
朋友们似乎太“慢”,无法拍摄即时快照,因为他们只显示了几个进程D
或R
状态。
答案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 @ 中的示例并根据您的需要进行增强转储任务