나는 직면하고있다유휴 상태에서 이상한 극한 부하 문제.
Linux 프로세스 스케줄러 실행 대기열을 직접 덤프하는 방법이 있습니까?
예를 들어 sar -q
400을 으로 출력할 때 runq-sz
이러한 400개의 PID를 얻습니까?
ps
, 친구는 몇 가지 프로세스 나 상태 top
만 표시하므로 즉각적인 스냅샷을 찍기에는 너무 "느린" 것 같습니다 .D
R
답변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 @에서 내 예제를 읽고 필요에 따라 개선하는 것이 좋습니다.덤프 작업