プロセスが行うコンテキストスイッチの数を確認する方法


25

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


OS どのバージョンですか?どのカーネル?
ミケル

GNU / Linux 2.6.18
12

5
チェック/proc/[pid]/status
ケビン

回答:


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だけです(自発的および非自発的なコンテキスト切り替えの場合)。私のLinuxカーネルバージョンは2.6.39-400.214.4.el6uek.x86_64です。出力はLinuxバージョンに依存していますか?
アンディデュフレーネ

ここに出力を貼り付けてください。

そのanswereで述べたのと同じ- "見-n.5 grepをCTXTは/ proc / 5647 /ステータス"
アンディDufresne

procfsを使用する必要がありますが、古いカーネルでは/proc/.../status内に値がありません。なにか提案を ?
マッシモ

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で機能しますか?
アンディDufresne

このコマンドは問題なく動作するはずです。ただし、レポート間隔を指定しないとvmstat、「システムの起動(ブート)からの時間についてタスクの統計情報がレポートされる」ため、間違って使用していることに注意してくださいiostat。したがって、watch単に1秒間隔で実行するのではなく、現在の統計が必要な場合。
poige

監視しない場合、数値が継続的に更新されるのを確認するにはどうすればよいですか?コマンド「pidstat -w -I -p 5876 5」を実行すると、コマンドは5秒間待機してから出力を出力します(再び0として)。それは私が期待していた( -私はこれがpidstatのmanページが言うに矛盾していることを知っているように継続的に実行されませんlinux.die.net/man/1/pidstat)。私のOSはOracle Linux Server 6.4です。
アンディデュフレーネ

`pidstat -w -l -p SELF 1`は機能しますか?
poige

4

実行されたプロセス全体の記録を取得するには、オプションを使用して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

3

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


1
コマンドが使用可能であっても、多くのシステムでは「そのまま」では機能しません。データ収集を有効にする方法を回答に含めることができますsarか?
アントン

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

クリティカルセクションの前後に2回呼び出すだけで、usage.ru_nivcswの値が増加したかどうかを確認できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.