回答:
でプロセスのコンテキストスイッチに関する情報を表示できます/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 );
クリティカルセクションの前後に2回呼び出すだけで、usage.ru_nivcswの値が増加したかどうかを確認できます。