कभी-कभार सीपीयू कर्नेल हॉग का पता लगाएँ


11

मेरे पास 2.6.35 PREEMPT कर्नेल है जो मध्यम-गति वाले ARMv7 प्रोसेसर पर चल रहा है। प्रत्येक 100 - 125 के बारे में एक बार, कुछ कर्नेल को कुछ ऑडियो-संबंधित ड्राइवरों को संसाधित करने में विफल होने का कारण बनता है ताकि अंडररुन्स से बचने के लिए पर्याप्त रूप से जल्दी से। होल्ड-अप आम तौर पर 15-30ms की सीमा में होता है, लेकिन यह बहुत लंबा हो सकता है। यह स्पष्ट नहीं है कि होल्ड-अप पूरी तरह से कर्नेल है या वास्तविक समय की प्राथमिकता (SCHED_RR, 2) के साथ चलने वाली उपयोगकर्ता प्रक्रिया के निर्धारण से संबंधित हो सकता है।

मेरा अनुमान है कि एक (कम से कम एक) ड्राइवर है जो प्रीमेच के साथ अच्छा नहीं खेल रहा है।

उपयोगकर्ता प्रक्रिया से कुछ स्ट्रेस आउटपुट सामान्य और असामान्य व्यवहार दोनों के कुछ पहलू को दिखाता है, हालांकि मुझे निश्चित नहीं है कि विभिन्न समय रिपोर्टों की व्याख्या कैसे करें?

सामान्य मामला:

     0.000518 पोल ([{fd = 10, घटनाएँ = POLLIN | POLLERR | POLLNVAL, घूमता है = POLLIN}], 1, 3415) = 1 
     0.010202 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLERNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, revents = POLLONVAL}, 2, 3404) = 1 
     0.000585 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, revents = POLLNV}], 2, 3404) = 1 
     0.000302 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 
     होप 706 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLERNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, revents = POLLNVAL}, 2, 3393) = 1 
     0.000480 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, revents = POLLNV}], 2, 3392) = 1 

Fd6 पर आउटपुट के लिए पोल पर कोई ब्लॉकिंग नहीं होती है और जब केवल fd10 को इनपुट के लिए चुना जाता है, तो लगभग 10ms का ब्लॉक होता है। यह सिस्टम कॉल की अवधि और सिस्टम कॉल के बीच अंतराल (वे संगत हैं) की रिपोर्ट में दोनों परिलक्षित होता है।

विफलता का मामला (चरम उदाहरण):

     0.000305 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 
     0.010730 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLERNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, revents = POLLNVAL}, 2, 3533) = 1 
     0.000475 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, revents = POLLNV}], 2, 3532) = 1 
     0.000329 पोल ([{fd = 10, घटनाएँ = POLLIN | POLLERR | POLLNVAL, घूमता है = POLLIN}], 1, 3532) = 1 
     0.953349 पोल ([{fd = 10, इवेंट्स = POLLIN | POLLNVAL}, {fd = 6, इवेंट्स = POLLOUT | POLLERR | POLLNVAL, घूमता है = POLLNVAL}, 2, 2578) = 1 

इस मामले में सूचना कि, भले ही दूसरी-आखिरी कॉल 10ms (सामान्य) लेने के रूप में दर्ज की गई हो, यह अंतिम कॉल से पहले 953ms है।

अपराधी को ट्रैक करने के लिए मैं किन उपकरणों का उपयोग कर सकता हूं?


2
दिलचस्प सवाल के लिए बोनस अंक। मुझे यकीन नहीं है कि इसका उत्तर कैसे दिया जाए, लेकिन मेरे पास एक सवाल है कि इसे सीपीयू के उपयोग पर वापस कैसे ट्रैक किया जाए (उदाहरण के लिए, इवाइट में स्पाइक्स के विपरीत)?
ब्राचली

1
पहला अनुमान यह है कि यदि आप JFFS2 या YAFFS को बड़े नंद फ्लैश पर चला रहे हैं, खासकर यदि आप रिकॉर्डिंग कर रहे हैं। ऐसी किसी भी चीज़ को अक्षम करें जो फ्लैश करने के लिए लिखती है और देखें कि क्या मदद करता है। आपकी प्रक्रिया तालिका कैसी दिखती है? यदि आप कर्नेल बनाने के लिए एक टूलकिन रखते हैं तो आप अंतिम उपाय के रूप में ftrace का उपयोग कर सकते हैं।
जोनाथन बेन-अवराम 20

sar -bu कर सकते हैं .. linux.die.net/man/1/sar
Grizly

उपयोग में कुछ फ्लैश है; एक माउंटेड ext4 फाइल सिस्टम के साथ एक एसडी कार्ड। और यह वास्तव में इन समस्याओं का एक संभावित स्रोत है (लेकिन क्यों, बिल्कुल?) लेकिन शायद केवल एक ही नहीं है।
awy

जवाबों:


1

perfआपके लिए मददगार हो सकता है। यह लिनक्स कर्नेल उपयोगिताओं का हिस्सा है।

उदाहरण के लिए:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

यह सभी syscall एंटर / एग्जिट टाइम और पैरामीटर्स (जैसे स्ट्रेस) को दिखाएगा, syscall को द्विआधारी का नाम प्रदान करेगा और प्रत्येक CPU के कॉलस्टैक को कुछ फ्रीक्वेंसी (कर्नेल सिंबल सहित) पर सैंपल देगा। तो आप वास्तव में देख सकते हैं कि syscall के दौरान किस कोड को निष्पादित किया गया था। मल्टीप्रोसेसर सिस्टम में आपको सीपीयू आईडी (जैसे [001]) पर ध्यान देने की आवश्यकता है।


मैं प्लेटफ़ॉर्म के लिए पूर्ण बनाया जा रहा हूँ - टिप के लिए धन्यवाद।
awy

0

शायद atopआपकी समस्या पर कुछ प्रकाश डाल सकता है।

यह पहले से ही बाहर निकलने वाली प्रक्रियाओं को दिखा सकता है, और यह सीपीयू , मेमोरी , डिस्क और नेटवर्क उपयोग को दिखा सकता है ।

आप इसे इंटरेक्टिव चला सकते हैं, इसे टेक्स्ट फाइल पर लिख सकते हैं या इसे sarपूर्वनिर्धारित अंतराल की तरह चला सकते हैं , जिससे आप बाइनरी हिस्ट्री फाइल बना सकते हैं।

मैं इसका उपयोग उन सभी प्रकार के हॉग को खोजने के लिए करता हूं, जिन्हें ढूंढना मुश्किल है :-)

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