How to see how many context switches a process makes?
Solution 1
pidstat(1) - Report statistics for Linux tasks. According to man pidstat
it's so easy as
just pidstat -w …
Solution 2
To get a record of an entire process run, you can use the GNU time
utility (don't confuse it with the bash
builtin) with the -v
option. Here's an example with unrelated lines of output removed:
$ `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
Solution 3
You can use, sar -w
. For instance, sar -w 1 3
, reports total number of context switches per second for every 1 seconds a total of 3 times.
Solution 4
See man getrusage which will let you query the number of voluntary and involuntary context switches.
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 */
};
You can tell it to report per-thread information, like this:
struct rusage usage;
getrusage( RUSAGE_THREAD, &usage );
Just call it twice, before and after your critical section, and see if usage.ru_nivcsw value has increased or not.
Solution 5
Write the following script to file (ctx.sh
). with ctx.sh <core>
you will see all the processes running on a given core and changing nv-context switches will be highlighted. Looking at this, you will be able to identify which are the competing processes for the core.
#!/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
Related videos on Youtube
Ason
Updated on September 18, 2022Comments
-
Ason over 1 year
I want to see if my process makes a lot of context switches. I also want to see how manpulating task groups affects the number of context switches.
-
Andy Dufresne about 9 yearsI executed "watch -n0.5 pidstat -w -I -p 5876" command but the output is 0 (for both cswch/s nvcswch/s). Does this command work for linux version - 2.6.39-400.214.4.el6uek.x86_64 ?
-
poige about 9 yearsThis command should work just fine. But beware you're using it wrong because when you don't specify report interval „tasks statistics are to be reported for the time since system startup (boot).” similar to
vmstat
,iostat
and others. So if current statistics is needed instead ofwatch
'ing simply run it with one second interval. -
Andy Dufresne about 9 yearsIf I don't do watch, how do I see the numbers updating continuously? Executing the command "pidstat -w -I -p 5876 5" the command just waits for 5 seconds and then prints the output (again as 0). It does not run continuously as I was expecting (I know that this is contradicting to what pidstat's man page says - linux.die.net/man/1/pidstat). My OS is Oracle Linux Server 6.4.
-
poige about 9 yearsDoes ` pidstat -w -l -p SELF 1` work for you?
-
Anthon about 8 yearsThat doesn't work "out of the box" on many systems, even if the command is available. Can you include in your answer how to enable data collecting for
sar
? -
Admin almost 2 yearsSimilarly, in Golang:
syscall.Getrusage(syscall.RUSAGE_SELF, &usage)