Câu trả lời:
Bạn có thể xem thông tin về chuyển đổi ngữ cảnh của quy trình của bạn trong /proc/<pid>/status
.
$ pid=307
$ grep ctxt /proc/$pid/status
voluntary_ctxt_switches: 41
nonvoluntary_ctxt_switches: 16
Để xem những con số này cập nhật liên tục, hãy chạy
$ # Update twice a second.
$ watch -n.5 grep ctxt /proc/$pid/status
Để chỉ lấy số, hãy chạy
$ grep ctxt /proc/$pid/status | awk '{ print $2 }'
pidstat (1) - Báo cáo thống kê cho các tác vụ Linux. Theo man pidstat
nó thật dễ dàngpidstat -w …
vmstat
, iostat
và những người khác. Vì vậy, nếu số liệu thống kê hiện tại là cần thiết thay vì watch
chỉ đơn giản là chạy nó với một khoảng thời gian một giây.
Để có bản ghi toàn bộ quá trình chạy, bạn có thể sử dụng time
tiện ích GNU (đừng nhầm lẫn nó với bash
nội dung) với -v
tùy chọn. Đây là một ví dụ với các dòng đầu ra không liên quan được loại bỏ:
$ `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
Bạn có thể sử dụng sar -w
,. Chẳng hạn, sar -w 1 3
báo cáo tổng số công tắc ngữ cảnh mỗi giây cho mỗi 1 giây tổng cộng 3 lần.
sar
không?
Viết đoạn script sau vào file ( ctx.sh
). với ctx.sh <core>
bạn sẽ thấy tất cả các quy trình đang chạy trên một lõi nhất định và việc thay đổi các chuyển đổi bối cảnh nv sẽ được tô sáng. Nhìn vào điều này, bạn sẽ có thể xác định đó là các quá trình cạnh tranh cho cốt lõi.
#!/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
Xem manrusrus sẽ cho phép bạn truy vấn số lượng chuyển đổi bối cảnh tự nguyện và không tự nguyện.
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 */
};
Bạn có thể yêu cầu nó báo cáo thông tin theo từng luồng, như thế này:
struct rusage usage;
getrusage( RUSAGE_THREAD, &usage );
Chỉ cần gọi nó hai lần, trước và sau phần quan trọng của bạn và xem giá trị cách sử dụng.ru_nivcsw có tăng hay không.