คำตอบ:
คุณสามารถดูข้อมูลเกี่ยวกับการสลับบริบทของกระบวนการของ/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
'ing เพียงแค่รันด้วยช่วงเวลาหนึ่งวินาที
เพื่อให้ได้บันทึกการดำเนินการทั้งหมดคุณสามารถใช้time
ยูทิลิตี้GNU (อย่าสับสนกับbash
builtin) พร้อม-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
sar -w
คุณสามารถใช้ ตัวอย่างเช่นsar -w 1 3
รายงานจำนวนการสลับบริบททั้งหมดต่อวินาทีในทุก ๆ 1 วินาทีรวมเป็น 3 เท่า
sar
หรือไม่
เขียนสคริปต์ต่อไปนี้ไปยังไฟล์ ( ctx.sh
) ด้วยctx.sh <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
ดู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 );
เพียงแค่เรียกมันสองครั้งก่อนและหลังส่วนที่สำคัญของคุณและดูว่าการใช้งาน use.ru_nivcsw มีค่าเพิ่มขึ้นหรือไม่
sudo perf stat -e context-switches -I 1000 PROCESS_NAME