कैसे देखें कि एक प्रक्रिया कितने संदर्भ स्विच करती है?


25

मैं यह देखना चाहता हूं कि क्या मेरी प्रक्रिया बहुत सारे संदर्भ स्विच बनाती है। मैं यह भी देखना चाहता हूं कि मैनपूलिंग कार्य समूह संदर्भ स्विच की संख्या को कैसे प्रभावित करता है।


क्या ओएस? क्या संस्करण? क्या गिरी?
मिकेल

जीएनयू / लिनक्स 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 }'

मैंने उपरोक्त वॉच कमांड की कोशिश की लेकिन आउटपुट सिर्फ 1 है (स्वैच्छिक और अनैच्छिक संदर्भ स्विच के लिए)। मेरा लिनक्स कर्नेल संस्करण 2.6.39-400.214.4.el6uek.x86_64 है। क्या आउटपुट लिनक्स संस्करण पर निर्भर है?
एंडी डफ्रेसने

कृपया अपना आउटपुट यहां पेस्ट करें।

इसका उत्तर के रूप में उल्लेख किया गया है - "घड़ी -n.5 grep ctxt / proc / 5647 / स्थिति"
एंडी

मुझे procfs का उपयोग करना है लेकिन पुरानी गुठली पर /proc/.../status के अंदर मान नहीं हैं। कोई उपाय ?
मैसिमो

12

pidstat (1) - लिनक्स कार्यों के लिए रिपोर्ट आँकड़े। के अनुसार man pidstatयह सिर्फ इतना आसान हैpidstat -w …


मैंने "वॉच -n0.5 pidstat -w -I -p 5876" कमांड निष्पादित किया है, लेकिन आउटपुट 0 है (दोनों cswch / s nvcswch / s के लिए)। क्या यह कमांड लिनक्स संस्करण के लिए काम करता है - 2.6.39-400.214.4.el6uek.x86_64?
एंडी डफ्रेसने

यह आदेश ठीक काम करना चाहिए। लेकिन आप इसे प्रयोग कर रहे हैं गलत, क्योंकि जब आप रिपोर्ट अंतराल निर्दिष्ट नहीं करते सावधान रहना "कार्यों आँकड़े सिस्टम स्टार्टअप (बूट) के बाद से समय के लिए सूचित किया जाना है।" के समान vmstat, iostatऔर अन्य। इसलिए अगर मौजूदा आंकड़ों की जरूरत है, तो इसके बजाय watchइसे एक दूसरे अंतराल के साथ चलाएं।
पोइग

अगर मैं नहीं देखता, तो मैं लगातार अपडेट करने वाली संख्याओं को कैसे देखूं? "Pidstat -w -I -p 5876 5" कमांड को निष्पादित करने के बाद कमांड केवल 5 सेकंड के लिए प्रतीक्षा करता है और फिर आउटपुट को प्रिंट करता है (फिर से 0 के रूप में)। यह लगातार नहीं चल रहा है जैसा कि मैं उम्मीद कर रहा था (मुझे पता है कि यह पिडस्टेट के मैन पेज के विपरीत है - linux.die.net/man/1/pidstat )। मेरा OS Oracle Linux Server 6.4 है।
एंडी डफ्रेसने

क्या `pidstat -w -l -p SELF 1` आपके लिए काम करता है?
पोइज

4

संपूर्ण प्रक्रिया चलाने का रिकॉर्ड प्राप्त करने के लिए, आप विकल्प के साथ जीएनयू timeउपयोगिता (इसे bashबिलिन के साथ भ्रमित न करें) का उपयोग कर सकते हैं -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?
एंथन

2

फाइल करने के लिए निम्न स्क्रिप्ट लिखें ( ctx.sh)। साथ ctx.sh <core>आप किसी दिए गए कोर पर चल रहा है और NV-संदर्भ स्विच को बदलने के सभी प्रक्रियाओं देखेंगे हाइलाइट किया जाएगा। इसे देखते हुए, आप यह पहचानने में सक्षम होंगे कि कौन से कोर के लिए प्रतिस्पर्धी प्रक्रियाएं हैं।

#!/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

देखें कि आदमी स्वेच्छाचारी है जो आपको स्वैच्छिक और अनैच्छिक संदर्भ स्विच की संख्या को क्वेरी करने देगा।

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 मान बढ़ा है या नहीं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.