Làm thế nào để xem có bao nhiêu chuyển đổi bối cảnh một quá trình làm cho?


25

Tôi muốn xem nếu quá trình của tôi thực hiện nhiều chuyển đổi bối cảnh. Tôi cũng muốn xem các nhóm tác vụ điều khiển ảnh hưởng đến số lượng chuyển đổi ngữ cảnh như thế nào.


HĐH gì? Phiên bản nào? Hạt nhân gì?
Mikel

GNU / Linux 2.6.18
luntain

5
Kiểm tra/proc/[pid]/status
Kevin

Câu trả lời:


30

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 }'

Tôi đã thử lệnh xem trên nhưng đầu ra chỉ là 1 (đối với chuyển đổi ngữ cảnh tự nguyện và không tự nguyện). Phiên bản kernal linux của tôi là 2.6,39-400.214.4.el6uek.x86_64. Là đầu ra phụ thuộc vào phiên bản linux?
Andy Dufresne

Dán đầu ra của bạn ở đây xin vui lòng.

Nó giống như được đề cập trong câu trả lời - "watch -n.5 grep ctxt / Proc / 5647 / status"
Andy Dufresne

Tôi phải sử dụng Procfs nhưng trên các nhân cũ không có giá trị bên trong /proc/.../status. bất cứ đề nghị nào ?
Massimo

12

pidstat (1) - Báo cáo thống kê cho các tác vụ Linux. Theo man pidstatnó thật dễ dàngpidstat -w …


Tôi đã thực thi lệnh "watch -n0.5 pidstat -w -I -p 5876" nhưng đầu ra là 0 (cho cả cswch / s nvcswch / s). Lệnh này có hoạt động cho phiên bản linux - 2.6.39-400.214.4.el6uek.x86_64 không?
Andy Dufresne

Lệnh này sẽ hoạt động tốt. Nhưng hãy cẩn thận bạn đang sử dụng nó sai bởi vì khi bạn không xác định khoảng thời gian báo cáo “nhiệm vụ thống kê phải được báo cáo cho thời gian kể từ khi hệ thống khởi động (boot).” Tương tự như vmstat, iostatvà 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ì watchchỉ đơn giản là chạy nó với một khoảng thời gian một giây.
poige

Nếu tôi không xem, làm cách nào để xem các số cập nhật liên tục? Thực hiện lệnh "pidstat -w -I -p 5876 5" lệnh chỉ chờ trong 5 giây và sau đó in đầu ra (một lần nữa là 0). Nó không chạy liên tục như tôi mong đợi (tôi biết rằng điều này mâu thuẫn với những gì trang người đàn ông của pidstat nói - linux.die.net/man/1/pidstat ). Hệ điều hành của tôi là Oracle Linux Server 6.4.
Andy Dufresne

Liệu `pidstat -w -l -p TỰF 1` có hiệu quả với bạn không?
poige

4

Để có bản ghi toàn bộ quá trình chạy, bạn có thể sử dụng timetiện ích GNU (đừng nhầm lẫn nó với bashnội dung) với -vtù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

3

Bạn có thể sử dụng sar -w,. Chẳng hạn, sar -w 1 3bá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.


1
Điều đó không hoạt động "ngoài luồng" trên nhiều hệ thống, ngay cả khi lệnh có sẵn. Bạn có thể đưa vào câu trả lời của mình cách kích hoạt thu thập dữ liệu sarkhông?
Anthon

2

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

1

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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.