लिनक्स I / O विलंबता को डीबग करना


13

मैं कुछ I / O समस्याओं को लिनक्स सिस्टम के एक जोड़े पर रख रहा हूं जिन्हें मैं प्रशासित करता हूं। वे उस प्रक्रिया में प्रकट होते हैं जो अक्सर खुले (), अनलिंक () या बंद () फाइलों पर (जो कि एक समस्या है क्योंकि कुछ शामिल कार्यक्रमों में कुछ सेकंड के लिए ब्लॉक करने की आवश्यकता होती है, क्योंकि इसमें शामिल कुछ कार्यक्रमों को संचालित करने के लिए कम I / O विलंबता की आवश्यकता होती है ढंग से)। यह सच है कि सिस्टम में कुछ मध्यम आई / ओ लोड का अनुभव करने के लिए प्रश्न हैं, लेकिन मैं शायद ही सोच सकता हूं कि यह इस तरह के विशाल विलंबता का औचित्य साबित करने के लिए पर्याप्त होगा। कभी-कभी, कॉल को पूरा होने में 15 सेकंड से अधिक समय लग सकता है (हालांकि अधिक बार उन्हें 1 या 2 या 3 सेकंड या ऐसा हो सकता है)।

मेरा सवाल है: मैं यह कैसे पता लगा सकता हूं कि ऐसा क्यों होता है? मैं चाहूंगा कि कुछ उपकरण हैं जो मुझे बता सकते हैं कि प्रश्न में क्या प्रक्रियाएं कर्नेल द्वारा अवरुद्ध हैं, और क्यों वे जिस पर सोते हैं वह व्यस्त है, इसके साथ क्या हो रहा है, और ऐसी चीजें। क्या ऐसा कोई उपकरण है, या क्या ऐसा करने का प्रयास करने का कोई और तरीका है?

वैकल्पिक रूप से, निश्चित रूप से, यदि आपके पास कोई सुराग है कि वास्तव में क्या हो रहा है, तो इसे कैसे टाला जा सकता है?

रिकॉर्ड के लिए, मेरे द्वारा उपयोग की जाने वाली फाइलसिस्टम XFS है।

जवाबों:


14

अब नियत समय में, मैं इसे स्वयं हल करने में कामयाब रहा हूं, इसलिए मैं कम से कम अपने आप को पोस्ट करने के लिए इसका अनुसरण कर सकता हूं।

दुर्भाग्य से, मैंने एक कर्नेल उन्नयन में मूल समस्या खो दी, लेकिन इसके बजाय एक नया प्राप्त किया, प्रदर्शन में भी बदतर, और बस नीचे ट्रैक करने के लिए कठिन के रूप में। मुझे जो तकनीक मिली वह निम्नलिखित थी:

सबसे पहले, blktrace/ blkparseएक उपकरण है जो मुझे काफी मददगार लगा। यह कई उपयोगी विवरणों के साथ व्यक्तिगत I / O अनुरोधों की प्रगति का पता लगाने की अनुमति देता है, जैसे कि प्रक्रिया जिसने अनुरोध प्रस्तुत किया। आउटपुट को चालू रखने में मददगार है tmpfs, ताकि ट्रेस के भंडारण की हैंडलिंग खुद ट्रेसिंग शुरू न हो।

हालांकि, यह अभी तक मदद करता है, इसलिए मैंने अधिक डिबगिंग कार्यक्षमता के साथ एक कर्नेल संकलित किया। विशेष रूप से, मुझे ftraceकाफी मदद मिली , क्योंकि इसने मुझे कर्नेल स्पेस के अंदर खराब प्रदर्शन करने वाली प्रक्रिया का पता लगाने की अनुमति दी, यह देखने के लिए कि यह क्या किया और कहाँ अवरुद्ध हुआ। डिबग कर्नेल को संकलित करने WCHANके psसाथ-साथ काम करने का आउटपुट भी मिलता है, जो यह देखने के लिए एक आसान तरीका के रूप में काम कर सकता है कि कर्नेल के अंदर क्या प्रक्रिया हो रही है, कम से कम सरल मामलों के लिए।

मैं भी लेटेंसीटॉप के उपयोगी होने की उम्मीद कर रहा था , लेकिन मुझे यह काफी खराब लग रहा था , और यह भी कि यह केवल विलंबता कारणों को प्रदर्शित करता है जो वास्तव में उपयोगी होने के लिए "उच्च-स्तर" भी थे।

इसके अलावा, मैंने इसे बहुत नज़दीक अंतरालों iostatकी सामग्री को देखने की तुलना में अधिक उपयोगी पाया /sys/block/$DEVICE/stat, बस इस तरह:

while :; do cat /sys/block/sda/stat; sleep .1; done

फ़ाइल Documentation/iostats.txtके प्रारूप के लिए कर्नेल स्रोत ट्री में देखें stat। करीब अंतराल पर इसे देखने से मुझे I / O फटने और इस तरह की चीजों के सटीक समय और आकार को देखने की अनुमति मिली।

अंत में, मुझे पता चला कि कर्नेल के अपग्रेड के बाद मुझे जो समस्या थी , वह स्थिर पृष्ठों की वजह से थी , लिनक्स 3.0 में एक फीचर पेश किया गया था, जिससे मेरे मामले में बर्कले डीबी को विस्तारित अवधि के लिए रोकना पड़ा जब इसके mmap'ed में पृष्ठों को गंदा कर दिया गया। क्षेत्र की फाइलें। हालांकि यह सुविधा बाहर पैच करना संभव है, और यह भी कि इसके कारण होने वाली समस्याएं लिनक्स 3.9 में ठीक हो सकती हैं, मैंने बर्कले डीबी को पैच करके अब तक की सबसे खराब समस्या को हल किया है जो मुझे एक अलग निर्देशिका में अपने क्षेत्र की फाइलें डालने की अनुमति देता है। (मेरे मामले में /dev/shm), मुझे पूरी तरह से समस्या से बचने की अनुमति देता है।


3

मेरे अनुभव के अनुसार सबसे सरल और सबसे विस्तृत सांख्यिकीय उपकरण जिसे आप रहस्यमय सिस्टम प्रदर्शन समस्याओं का पता लगाने के लिए स्थापित कर सकते हैं वह है http://freecode.com/projects/sysstat उर्फ। खोज एवं बचाव

यह सुनिश्चित करने के लिए कि आप iostat कमांड आउटपुट को देखना चाहते हैं, विशेष रूप से आपका% iowait सामान्य सिस्टम लोड (1.0 या इससे नीचे) के तहत 5-10% से कम होना चाहिए।

पीए आउटपुट को देखें यदि एसटीएटी कॉलम में आप डी स्टेटस देखते हैं, जिसका अर्थ है कि वे प्रक्रियाएं लॉक हैं और आईओ की प्रतीक्षा कर रहे हैं, तो बहुत संभावना है कि नियंत्रक या डिस्क के साथ एक हार्डवेयर समस्या, SMART आँकड़े और साथ ही सुराग के लिए dmesg और syslog की जाँच करें।

sar लॉग की जाँच करें और यदि कभी ऐसा होता है तो पीक समय की पहचान करें और उन समयों को डिस्क सघन क्रोन नौकरियों जैसे कि नेटवर्क पर बैकअप के साथ मिलान करने का प्रयास करें

आप अपने डिस्क प्रदर्शन को बोनी ++ के साथ बेंचमार्क कर सकते हैं


3

सोचा था कि मैं इस बात का उल्लेख करूंगा कि यह प्रश्न अब महीनों पुराना है। यह इसी तरह की समस्या वाले किसी व्यक्ति की मदद कर सकता है जो इस पृष्ठ को पाता है।

प्रयत्न।

strace "application"

आप भी कर सकते हैं

strace -e read,write "application"

केवल घटनाओं को पढ़ने / लिखने के लिए।

एप्लिकेशन सामान्य के रूप में लोड होगा (लॉन्च करने के लिए थोड़ा धीमा) और समस्या को ट्रिगर करने के लिए आप इसे सामान्य रूप से उपयोग कर सकते हैं। आउटपुट शेल में दिखाई देगा जो आपने स्ट्रेस लॉन्च करने के लिए उपयोग किया था।

स्ट्रेस के बारे में अच्छी बात यह है कि आप उस एप्लिकेशन को सबसे हाल ही में फ़ंक्शन / कर्नेल कॉल देख सकते हैं, जब एप्लिकेशन मंदी को ट्रिगर करता है। आप पा सकते हैं कि यदि आपके /homeखाते एनएफएस पर हैं, तो एप्लिकेशन को किसी कारण से फाइल I / O से अधिक NFS में कठिनाई हो रही है।

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