web-dev-qa-db-ja.com

プロセスが行うコンテキストスイッチの数を確認するにはどうすればよいですか?

プロセスで多くのコンテキストスイッチが発生するかどうかを確認したいと思います。また、タスクグループの操作がコンテキストスイッチの数にどのように影響するかを確認します。

28
luntain

プロセスのコンテキストスイッチに関する情報は、/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 }'
33
user26112

pidstat(1)-Linuxタスクの統計を報告します。による man pidstatとても簡単ですpidstat -w …

12
poige

プロセス実行全体の記録を取得するには、GNU timeユーティリティ(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
4
rsaxvc

使用できます、sar -w。例えば、 sar -w 1 3、1秒ごとに1秒あたりのコンテキストスイッチの総数を合計3回報告します。

3
Karen

次のスクリプトをファイル(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
2
mahendra

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 );

重要なセクションの前後で2回呼び出すだけで、usage.ru_nivcsw値が増加しているかどうかを確認できます。

2
Bram
Sudo perf stat -e context-switches -I 1000 PROCESS_NAME
0
Nadav B