पता करें कि कौन सा कार्य लिनक्स पर बहुत सारे संदर्भ स्विच उत्पन्न कर रहा है


11

Vmstat के अनुसार, मेरा लिनक्स सर्वर (2xCore2 Duo 2.5 GHz) लगातार 20k संदर्भ स्विच प्रति सेकंड कर रहा है।

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

... लेकिन uptimeछोटा लोड दिखाता है: load average: 0.01, 0.02, 0.01और topउच्च% CPU उपयोग के साथ कोई प्रक्रिया नहीं दिखाता है।

मुझे कैसे पता चलेगा कि वास्तव में उन संदर्भ स्विच क्या उत्पन्न कर रहे हैं? कौन सी प्रक्रिया / धागा?

मैंने pidstatआउटपुट का विश्लेषण करने की कोशिश की :

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

ऐसा लगता है कि कुछ postgresql कार्य कर रहे हैं> 10 संदर्भ प्रति सेकंड swiches, लेकिन यह वैसे भी 20k तक सभी योग नहीं करता है।

किसी भी विचार कैसे एक जवाब के लिए थोड़ा गहरा खुदाई करने के लिए?


पोस्टग्रे के बारे में बात यह है कि वे अलग-अलग पिड हैं इसलिए पूरी तरह से अलग कार्यक्रम हैं।
गोपोई

1
गोर एक प्रक्रिया: unix.stackexchange.com/questions/39342/…
Ciro Santilli 审查 un un un un

जवाबों:


5

खैर, काफी दिलचस्प मामला। देखने का प्रयास करें watch -tdn1 cat /proc/interrupts। क्या आपको वहां कोई मूल्यवान परिवर्तन दिखाई देता है?


"स्थानीय टाइमर इंटरप्ट" प्रत्येक CPU कोर पर कुछ सौ (200-800) अवरोध पैदा कर रहा है। इसका क्या मतलब हो सकता है? इसके अलावा eth0-rx / tx उस सर्वर पर ट्रैफ़िक के कारण कुछ व्यवधान उत्पन्न कर रहे हैं, लेकिन यह बहुत अधिक नहीं है।
grzaks

"फंक्शन कॉल इंटरप्ट" के बारे में कैसे?
16


2

नए कर्नेल संस्करण में

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

यह आपको संदर्भ-स्विच घटनाओं के बारे में सटीक परिणाम देगा।

और आप कारण "-g" झंडे द्वारा संदर्भ-स्विच का कारण पा सकते हैं (प्रतीक जानकारी द्वारा निर्धारित पठनीय परिणाम)

sudo perf record -e context-switches -a -g

1

प्रसंग स्विच सामान्य हैं। एक प्रक्रिया को समय के एक क्वांटा को सौंपा जाता है, अगर यह खत्म हो जाता है (या यह स्रोतों की आवश्यकता के कारण रुका हुआ है) तो इसे क्या करना है यह प्रोसेसर को जाने दे सकता है।

यह कहा गया कि कितने संदर्भ स्विच किए गए हैं (यह एक stackoverflow.com जवाब बन जाता है) यह आंतरिक कर्नेल शेड्यूल () कमांड तालिकाओं की प्रक्रियाओं में लिखने के लिए ले जाएगा। ऐसी कोई बात नहीं है यदि आप अपने कर्नेल को प्रोग्राम करते हैं जिसे आप देख पाएंगे लेकिन यह काफी मुश्किल है।


1
कुंआ। मुझे पता है कि संदर्भ स्विच क्या है और सिस्टम प्रदर्शन के लिए इसके क्या निहितार्थ हैं। मुझे बस यह मापने की ज़रूरत है कि लिनेक्स पर कितने संदर्भ स्विच किए जाते हैं। मैंने पहले से ही कच्चे csw काउंटरों को / proc / * / आँकड़े (स्वैच्छिक_
ctxt_switches

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