답변:
에서 프로세스 컨텍스트 전환에 대한 정보를 볼 수 있습니다 /proc/<pid>/status
.
$ pid=307
$ grep ctxt /proc/$pid/status
voluntary_ctxt_switches: 41
nonvoluntary_ctxt_switches: 16
이 숫자가 지속적으로 업데이트되는 것을 보려면 다음을 실행하십시오.
$ # Update twice a second.
$ watch -n.5 grep ctxt /proc/$pid/status
숫자 만 얻으려면
$ grep ctxt /proc/$pid/status | awk '{ print $2 }'
pidstat (1)-Linux 작업에 대한 통계를보고합니다. 에 따라 man pidstat
너무 쉽게 그냥 그것의pidstat -w …
vmstat
, iostat
그리고 다른 사람을. 따라서 현재 통계가 필요하지 않은 경우 watch
간단히 1 초 간격으로 통계 를 실행하십시오.
다음 스크립트를 파일 ( ctx.sh
)에 작성하십시오 . 로 ctx.sh <core>
주어진 코어에서 실행 NV-컨텍스트 스위치를 변경하는 모든 프로세스를 볼 수 있습니다 강조 표시됩니다. 이를 살펴보면 코어와 경쟁하는 프로세스를 식별 할 수 있습니다.
#!/bin/bash
if [[ $# -eq 0 ]]
then
echo "Usage:"
echo "$0 <core>"
exit 1
fi
if [[ -z $2 ]]
then
watch -d -n .2 $0 $1 nw
fi
ps -Leo lastcpu:1,tid,comm | grep "^$1 " | awk '{printf $3": ";system("cut -d\" \" -f3 /proc/"$2"/task/"$2"/schedstat 2>/dev/null")}' | sort -k 1 | column -t
자발적 및 비자발적 컨텍스트 스위치 수를 쿼리 할 수있는 man getrusage 를 참조하십시오 .
struct rusage {
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims (soft page faults) */
long ru_majflt; /* page faults (hard page faults) */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* IPC messages sent */
long ru_msgrcv; /* IPC messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
다음과 같이 스레드 별 정보를보고하도록 지시 할 수 있습니다.
struct rusage usage;
getrusage( RUSAGE_THREAD, &usage );
중요 섹션 전후에 두 번 호출하고 usage.ru_nivcsw 값이 증가했는지 확인하십시오.