วิธีดูว่ามีการสลับบริบทกี่ครั้งในกระบวนการ


25

ฉันต้องการดูว่ากระบวนการของฉันทำให้เกิดการสลับบริบทมากมายหรือไม่ ฉันต้องการเห็นว่าการจัดการกลุ่มงานมีผลต่อจำนวนของการสลับบริบทอย่างไร


ระบบปฏิบัติการอะไร รุ่นใด เคอร์เนลอะไร
มิเคล

GNU / Linux 2.6.18 นี้มีวัตถุประสงค์
luntain

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 kernal ของฉันคือ 2.6.39-400.214.4.el6uek.x86_64 เอาต์พุตขึ้นอยู่กับเวอร์ชันของ linux หรือไม่
Andy Dufresne

โปรดวางผลลัพธ์ของคุณที่นี่

มันเหมือนกับที่กล่าวไว้ในคำตอบ - "ดู -n.5 grep ctxt / proc / 5647 / สถานะ"
Andy Dufresne

ฉันต้องใช้ procfs แต่ในเมล็ดเก่านั้นไม่มีค่าใน /proc/.../status ข้อเสนอแนะใด ๆ
Massimo

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 หรือไม่?
Andy Dufresne

คำสั่งนี้จะทำงานได้ดี แต่ระวังคุณใช้มันผิดเพราะเมื่อคุณไม่ได้ระบุช่วงเวลาการรายงาน“งานสถิติจะได้รับการรายงานเวลาตั้งแต่การเริ่มต้นระบบ (บูต).” คล้ายกับvmstat, iostatและอื่น ๆ ดังนั้นหากต้องการสถิติปัจจุบันแทนwatch'ing เพียงแค่รันด้วยช่วงเวลาหนึ่งวินาที
poige

หากฉันไม่ได้ดูฉันจะเห็นหมายเลขที่อัพเดตอย่างต่อเนื่องได้อย่างไร การดำเนินการคำสั่ง "pidstat -w -I -p 5876 5" คำสั่งจะรอ 5 วินาทีจากนั้นพิมพ์เอาต์พุต (อีกครั้งเป็น 0) มันไม่ได้ทำงานอย่างต่อเนื่องในขณะที่ผมคาดหวังว่า (ฉันรู้ว่านี้ขัดแย้งกับสิ่งที่หน้าคน pidstat กล่าวว่า - linux.die.net/man/1/pidstat ) ระบบปฏิบัติการของฉันคือ Oracle Linux Server 6.4
Andy Dufresne

`pidstat -w -l -p SELF 1` ใช้งานได้สำหรับคุณหรือไม่?
poige

4

เพื่อให้ได้บันทึกการดำเนินการทั้งหมดคุณสามารถใช้timeยูทิลิตี้GNU (อย่าสับสนกับbashbuiltin) พร้อม-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
ที่ไม่ได้ "นอกกรอบ" ในหลาย ๆ ระบบแม้ว่าคำสั่งจะพร้อมใช้งาน คุณสามารถรวมไว้ในคำตอบวิธีเปิดใช้งานการรวบรวมข้อมูลได้sarหรือไม่
Anthon

2

เขียนสคริปต์ต่อไปนี้ไปยังไฟล์ ( 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

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

เพียงแค่เรียกมันสองครั้งก่อนและหลังส่วนที่สำคัญของคุณและดูว่าการใช้งาน use.ru_nivcsw มีค่าเพิ่มขึ้นหรือไม่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.