문제

각 스레드가 생성하는 컨텍스트 스위치 수를 볼 수있는 방법이 있습니까? (가능하면 내외부) X/S로 또는 시간이 지나면 실행되고 집계 된 데이터를 제공합니다. (Linux 또는 Windows에서)

전체 OS 또는 프로세스 당 집계 된 컨텍스트 전환 번호를 제공하는 도구 만 발견했습니다.

내 프로그램은 많은 컨텍스트 스위치 (50k/s)를 만들었습니다.

도움이 되었습니까?

해결책

최근 GNU/Linux 시스템에서 SystemTap을 사용하여 Sched_Switch ()에 대한 모든 호출에서 원하는 데이터를 수집 할 수 있습니다. schedtimes.stp 예제는 아마도 좋은 시작일 것입니다. http://sourceware.org/systemtap/examples/keyword-index.html#scheduler

다른 팁

리눅스

프로세스의 특정 스레드의 세부 사항을보기 위해 작은 대본을 썼습니다. 이 스크립트를 실행하면 컨텍스트 스위치도 볼 수 있습니다.

if [ "$#" -ne 2 ]; then
    echo "INVALID ARGUMENT ERROR: Please use ./see_thread.sh processName threadNumber"
    exit
fi
ls /proc/`pgrep $1`/task | head -n$2 | tail -n+$2>temp
cat /proc/`pgrep $1`/task/`cat temp`/sched

이것이 도움이되기를 바랍니다.

특정 기간 동안 스레드가 만든 자발적 및 비 폭동 컨텍스트 스위치를 계산하는 Bash 스크립트가 있습니다. 이것이 당신의 목적에 도움이 될지 확실하지 않지만 어쨌든 게시 할 것입니다.

이 스크립트는 프로세스 및 녹음의 모든 스레드를 통해 반복됩니다. "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches" ~에서 /proc/< process-id>/task/< thread-id>/status. 내가 일반적으로하는 일은 성능 실행을 시작할 때이 카운터를 기록하고 달리기가 끝날 때 다시 녹음 한 다음 차이를 총으로 계산하는 것입니다. vol & non-vol 성능 실행 중에 CTX 스위치.

pid=`ps -ef | grep <process name> | grep $USER | grep -v grep | awk '{print $2}'`
echo "ThreadId;Vol_Ctx_Switch;Invol_Ctx_Switch"
for tid in `ps -L --pid ${pid}  | awk '{print $2}'`
do
    if [ -f /proc/$pid/task/$tid/status ]
    then
        vol=`cat /proc/$pid/task/$tid/status | grep voluntary_ctxt_switches | grep -v nonvoluntary_ctxt_switches | awk '{print $NF}'`
        non_vol=`cat /proc/$pid/task/$tid/status | grep nonvoluntary_ctxt_switches | awk '{print $NF}'`
    fi
    echo "$tid;$vol;$non_vol"
done

스크립트는 약간 무겁습니다. 제 경우에는 약 2500 개의 스레드가 있습니다. CTX 스위치를 수집하는 총 시간은 약 10 초입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top