프로세스가 얼마나 많은 컨텍스트 전환을 수행하는지 확인하는 방법


25

내 프로세스가 많은 컨텍스트 전환을 수행하는지 확인하고 싶습니다. 또한 작업 그룹 조작이 컨텍스트 전환 수에 어떤 영향을 미치는지 알고 싶습니다.


어떤 OS? 어떤 버전? 어떤 커널?
Mikel

GNU / 리눅스 2.6.18
luntain

5
확인/proc/[pid]/status
Kevin

답변:


30

에서 프로세스 컨텍스트 전환에 대한 정보를 볼 수 있습니다 /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 }'

위의 watch 명령을 시도했지만 출력은 1입니다 (자발적 및 비자발적 컨텍스트 전환의 경우). 내 리눅스 커널 버전은 2.6.39-400.214.4.el6uek.x86_64입니다. 출력은 리눅스 버전에 의존합니까?
Andy Dufresne

여기에 출력을 붙여 넣으십시오.

답변에서 언급 한 것과 동일합니다- "watch -n.5 grep ctxt / proc / 5647 / status"
Andy Dufresne

procfs를 사용해야하지만 오래된 커널에는 /proc/.../status 안에 값이 없습니다. 어떠한 제안 ?
Massimo

12

pidstat (1)-Linux 작업에 대한 통계를보고합니다. 에 따라 man pidstat너무 쉽게 그냥 그것의pidstat -w …


"watch -n0.5 pidstat -w -I -p 5876"명령을 실행했지만 출력은 0입니다 (cswch / s nvcswch / s 모두). 이 명령은 Linux 버전 2.6.39-400.214.4.el6uek.x86_64에서 작동합니까?
Andy Dufresne

이 명령은 잘 작동합니다. 하지만이 보고서의 간격을 지정하지 않는 경우 때문에 당신이 잘못을 사용하고 조심 "통계 시스템 시작 (부팅) 이후 시간을보고 할 수 있습니다 작업을."와 유사한 vmstat, iostat그리고 다른 사람을. 따라서 현재 통계가 필요하지 않은 경우 watch간단히 1 초 간격으로 통계 를 실행하십시오.
poige

시청하지 않으면 숫자가 계속 업데이트되는 것을 어떻게 알 수 있습니까? "pidstat -w -I -p 5876 5"명령을 실행하면 명령이 5 초 동안 대기 한 다음 출력을 다시 인쇄합니다 (0으로). 예상대로 계속 실행되지 않습니다 (pidstat의 매뉴얼 페이지 -linux.die.net/man/1/pidstat와는 모순됨을 알고 있습니다 ). 내 OS는 Oracle Linux Server 6.4입니다.
Andy Dufresne

`pidstat -w -l -p SELF 1`이 효과가 있습니까?
poige

4

전체 프로세스 실행에 대한 기록을 얻으려면 옵션 과 time함께 GNU 유틸리티를 사용하십시오 ( bash내장 과 혼동하지 마십시오 ) -v. 다음은 관련없는 출력 줄이 제거 된 예입니다.

$ `which time` -v ls
a.out  exception_finder.cpp  log.txt
    Command being timed: "ls"
               ...
    Voluntary context switches: 1
    Involuntary context switches: 2
               ...
    Exit status: 0

3

을 사용할 수 있습니다 sar -w. 예를 들어, sar -w 1 3는 1 초마다 총 3 번의 총 컨텍스트 전환 수를보고합니다.


1
명령이 사용 가능하더라도 많은 시스템에서 "즉시"작동하지 않습니다. 데이터 수집을 활성화하는 방법을 답변에 포함시킬 수 있습니까 sar?
Anthon

2

다음 스크립트를 파일 ( 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

1

자발적 및 비자발적 컨텍스트 스위치 수를 쿼리 할 수있는 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 값이 증가했는지 확인하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.