linux: 작업 실행 대기열을 덤프하는 방법이 있나요?

linux: 작업 실행 대기열을 덤프하는 방법이 있나요?

나는 직면하고있다유휴 상태에서 이상한 극한 부하 문제.

Linux 프로세스 스케줄러 실행 대기열을 직접 덤프하는 방법이 있습니까?
예를 들어 sar -q400을 으로 출력할 때 runq-sz이러한 400개의 PID를 얻습니까?

ps, 친구는 몇 가지 프로세스 나 상태 top만 표시하므로 즉각적인 스냅샷을 찍기에는 너무 "느린" 것 같습니다 .DR

답변1

실행 대기열을 덤프하는 방법을 모르지만 perf. 예를 들어, 새로운 프로세스가 생성되는 경우 다음을 사용하여 이를 추적할 수 있습니다.

perf record -e sched:sched_process_exec -a

녹음을 중지하려면 Ctrl-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 @에서 내 예제를 읽고 필요에 따라 개선하는 것이 좋습니다.덤프 작업

관련 정보