2010-01-07 15 views
16

पृष्ठभूमि की एक पंक्ति: मैं Redis, a NoSQL database का डेवलपर हूं। मैं जो नई सुविधाओं को कार्यान्वित कर रहा हूं उनमें से एक वर्चुअल मेमोरी है, क्योंकि रेडिस मेमोरी में सभी डेटा लेता है। वीएम रेडिस के लिए धन्यवाद स्मृति से डिस्क तक शायद ही कभी उपयोग की जाने वाली वस्तुओं को स्थानांतरित करने में सक्षम है, ओएस को हमारे लिए स्वैप करने के लिए काम करने से कई बेहतर कारण हैं (रेडिस ऑब्जेक्ट्स गैर-संगत में आवंटित कई छोटी वस्तुओं से बने होते हैं स्थानों, जब रेडिस द्वारा डिस्क पर क्रमबद्ध किया जाता है, वे स्मृति पृष्ठों की तुलना में 10 गुना कम स्थान लेते हैं, जहां वे रहते हैं, और आगे)।सी प्रोग्राम मैक ओएस एक्स हिम तेंदुए पर डिस्क I/O प्रदर्शन करते समय अनइंटरप्टिव प्रतीक्षा पर फंस गया

अब मेरे पास अल्फा कार्यान्वयन है जो लिनक्स पर पूरी तरह से काम कर रहा है, लेकिन मैक ओएस एक्स हिम तेंदुए पर इतना अच्छा नहीं है। समय-समय पर, रेडिस एक पृष्ठ को स्मृति से डिस्क में स्थानांतरित करने का प्रयास करता है, फिर भी रेडिस प्रक्रिया मिनटों के लिए अनियंत्रित प्रतीक्षा स्थिति में प्रवेश करती है। मैं इसे डीबग करने में असमर्थ था, लेकिन यह या तो fseeko() या fwrite() पर कॉल में होता है। मिनटों के बाद कॉल अंततः वापस आती है और रेडिस बिना किसी समस्या के काम कर रही है: कोई दुर्घटना नहीं।

स्थानांतरित की गई डेटा की मात्रा बहुत छोटा है, कुछ 256 बाइट्स की तरह है। तो यह आई/ओ प्रदर्शन की एक बड़ी राशि का मामला नहीं होना चाहिए।

लेकिन स्वैप फ़ाइल के बारे में एक दिलचस्प जानकारी है जो लेखन ऑपरेशन का लक्ष्य है। यह एक बड़ी फ़ाइल (26 गीगाबाइट्स) है जिसे fopen() के साथ एक फ़ाइल खोलने के लिए बनाया गया है और फिर ftruncate() का उपयोग करके बढ़ाया गया है। अंत में फ़ाइल unlink() एड है ताकि रेडिस इसका संदर्भ लेना जारी रखे, लेकिन हमें यकीन है कि जब रेडिस प्रक्रिया ओएस से बाहर निकल जाएगी तो वास्तव में स्वैप फ़ाइल को मुक्त कर दिया जाएगा।

ठीक है, लेकिन मैं किसी और विवरण के लिए यहां हूं। और बीटीडब्ल्यू आप रेडिस गिट में भी वास्तविक कोड पा सकते हैं, लेकिन पांच मिनट में समझना मुश्किल नहीं है क्योंकि यह काफी जटिल प्रणाली है।

किसी भी मदद के लिए बहुत बहुत धन्यवाद।

+0

अधिक जानकारी: अब एक छोटी स्वैप फ़ाइल (256 एमबी) के साथ कोशिश कर रहा है, बग गायब हो गया है, भले ही डेटा एक ही स्थान पर और पृष्ठों की एक ही संख्या में लिखा गया हो। यह और उत्तर में अन्य अनुमानों को देखते हुए, ऐसा लगता है कि कुछ घटित होने के बाद ऑपरेटिंग सिस्टम भौतिक रूप से फाइल सिस्टम में बड़ी फ़ाइल आवंटित करने का प्रयास करता है, और इसमें आकार देने में कुछ मिनट लगते हैं। मैं कम से कम एक विकल्प के रूप में भौतिक आवंटन ASAP को मजबूर करने के लिए स्टार्टअप पर कुछ यादृच्छिक बाइट्स को "ठीक" कर सकता हूं। बहुत बहुत धन्यवाद। यहां अद्यतनों को धक्का देगा। – antirez

उत्तर

11

के रूप में मैं इसे समझते हैं, HFS + स्पार्स फ़ाइलों के लिए बहुत ही गरीब समर्थन हासिल है। तो हो सकता है कि आपका लेखन फ़ाइल विस्तार को ट्रिगर कर रहा हो जो फ़ाइल के बड़े हिस्से को प्रारंभ/भौतिक रूप से प्रारंभ कर रहा हो।

उदाहरण के लिए, मुझे एक नई बड़ी खाली फ़ाइल mmap'ing पता है और फिर कुछ यादृच्छिक स्थानों पर लिखना एचएफएस + के साथ डिस्क पर एक बहुत बड़ी फ़ाइल पैदा करता है। यह काफी परेशान है क्योंकि एमएमएपी और स्पैस फाइलें डेटा के साथ काम करने का एक बेहद सुविधाजनक तरीका हैं, और वस्तुतः हर दूसरे प्लेटफॉर्म/फाइल सिस्टम इस शानदार तरीके से संभालती है।

क्या स्वैप फ़ाइल रैखिक रूप से लिखी गई है? मतलब है कि हम या तो मौजूदा ब्लॉक को प्रतिस्थापित करते हैं या अंत में एक नया ब्लॉक लिखते हैं और एक फ्री स्पेस पॉइंटर बढ़ाते हैं?यदि ऐसा है, तो फ़ाइल का विस्तार करने के लिए शायद अधिक बार छोटे ftruncate कॉल करने के परिणामस्वरूप छोटे विराम होंगे।

एक तरफ के रूप में, मुझे उत्सुकता है कि रेडिस वीएम एमएमएपी का उपयोग क्यों नहीं करता है और फिर हॉट पेजों में गर्म ब्लॉक को ध्यान में रखने के प्रयास में बस ब्लॉक को स्थानांतरित करता है।

+0

हैलो जेसन। हां यह मेरा विचार भी था: कि कुछ कारणों से ftruncate() और कुछ लिखने के बाद, कुछ बिंदु पर एचएफएस + कार्यान्वयन सोचता है कि यह फ़ाइल के एक बड़े हिस्से को पूरा करने का समय है। पृष्ठों को आवंटित आवंटित किया जाता है। मैं लिनक्स कर्नेल में से एक के समान एल्गोरिदम का उपयोग करता हूं। मैं समय-समय पर फ़ाइल की शुरुआत में मुफ्त संगत ब्लॉक खोजने के लिए पृष्ठों की एक निश्चित संख्या तक क्रमशः आवंटित करने का प्रयास करता हूं। तो वृद्धिशील ftruncates() AFAIK एक अच्छा विचार है। मैंने इस पर सोचा लेकिन पूर्ण डिस्क पर स्टार्टअप पर "अंतरिक्ष से बाहर" बताने से बचें। – antirez

+0

मुझे आश्चर्य है, क्या ftruncate() वास्तव में उन फ़ाइलों पर भी फाइलस्पेस आरक्षित करता है जो स्पैस फ़ाइलों का समर्थन करते हैं? इसके अलावा: मैंने सुना है कि ऐप्पल ने एक नई फाइल सिस्टम पर काम करना शुरू कर दिया है, जो एचएफएस से नहीं लिया गया है। जब तक वे ऐसा नहीं करते हैं तो ओएसएक्स सर्वर के लिए कभी भी प्रयोग योग्य नहीं होगा, और डेवलपर्स के लिए लिनक्स/सोलरिस/आदि पर तैनाती करने वालों के लिए परेशान होगा। –

+0

एक छोटी फ़ाइल के साथ प्रयास करने के बाद, बग गायब हो गया। तो मुझे लगता है कि आपका जवाब सही है, पहले लिखने के बाद शायद फाइल को भौतिक रूप से पूरा कर रहे हैं। यह देखते हुए कि सभी उत्पादन के लिए लिनक्स पर रेडिस चलाते हैं, यह एक बड़ी समस्या नहीं है, लेकिन यह जानना बेहतर है :) धन्यवाद – antirez

0

क्या आपने अपनी फ़ाइल के लिए फ़ाइल कैशिंग बंद कर दी है?

"मुझे पता है ओएस एक्स लोगों को एक कठिन समय है कि यह स्वीकार करने के लिए, लेकिन ओएस एक्स फ़ाइल सिस्टम आम तौर पर कुल कर रहे हैं और: यानी fcntl (FD, F_GLOBAL_NOCACHE, 1)

+0

नहीं, सिस्टम में मुफ्त मेमोरी होने पर ओएस कैश फ़ाइल को कैश कर सकता है यह एक अच्छा विचार है। असल में वैध उपयोगों में से एक स्मृति के लिए सीपीयू चक्रों का व्यापार करना है, क्योंकि वीएम में संग्रहीत डेटा बहुत छोटा है लेकिन पहुंच के लिए धीमा है। तो सिद्धांत में यह एक सामान्य फ़ाइल होना चाहिए, लेकिन यदि आपको लगता है कि यह समस्या हो सकती है तो मैं इसे वास्तव में आजमा सकता हूं। मैं अपने निष्कर्षों की रिपोर्ट करूंगा। जवाब के लिए धन्यवाद। – antirez

-1

के रूप में लीनुस एक बार Git मेलिंग सूची पर कहा पूरी बकवास - विंडोज़ से भी ज्यादा। "

+1

मनोरंजक, लेकिन उपयोगी उत्तर नहीं। – sbooth

0

क्या आपने डीटीआरएस और इंस्ट्रूमेंट्स (ऐप्पल के प्रयोगात्मक ड्रेरेस फ्रंट एंड) के साथ डिबगिंग करने का प्रयास किया है?

Exploring Leopard with DTrace

Debugging Chrome on OS X

+0

मैंने बिना कॉल के कॉल को देखने के लिए डट्रस की कोशिश की, इस बारे में कोई संकेत नहीं कि यह इतना लंबा क्यों लगता है।शायद यह कुछ अवरुद्ध चीज है जो ओएस ftruncate के बाद डिस्क पर फ़ाइल के भौतिक भाग की तरह कर रहा है? मैं लिंक और उत्तर के लिए और अधिक कोशिश करूँगा। – antirez

1

एंटीरेज़, मुझे यकीन नहीं है कि मुझे बहुत मदद मिलेगी क्योंकि मेरा ऐप्पल अनुभव Apple ][ तक सीमित है, लेकिन मैं इसे एक शॉट दूंगा।

पहली बात एक प्रश्न है। मैंने सोचा होगा कि, वर्चुअल मेमोरी के लिए, डिस्क स्पेस की तुलना में ऑपरेशन की गति एक और महत्वपूर्ण उपाय होगी (विशेष रूप से नोएसक्यूएल डीबी के लिए जहां गति पूरी बात है, अन्यथा आप एसक्यूएल का उपयोग करेंगे, नहीं?)। लेकिन, अगर आपकी स्वैप फ़ाइल 26 जी है, शायद नहीं :-)

कोशिश करने के लिए कुछ चीजें (यदि संभव हो)।

  1. वास्तव में समस्या या लिखने के लिए समस्या को अलग करने का प्रयास करें। मुझे विश्वास है कि एक खोज उस समय से अधिक समय ले सकती है, सबसे बुरी स्थिति में, यह एक बफर सूचक परिवर्तन होना चाहिए। फिर भी, मैंने ओएसएक्स नहीं लिखा था इसलिए मुझे यकीन नहीं है।
  2. यह देखने के लिए स्वैप फ़ाइल के आकार को समायोजित करने का प्रयास करें कि क्या समस्या है।
  3. क्या आपने कभी गतिशील रूप से स्वैप फ़ाइल का विस्तार किया है (पूर्व-आवंटन के विपरीत)? यदि आप ऐसा करते हैं, तो समस्या हो सकती है।
  4. क्या आप हमेशा फ़ाइल में जितना कम कर सकते हैं उतना ही लिख सकते हैं? ऐसा हो सकता है कि एक 26 जी फ़ाइल बनाने से वास्तव में डेटा के साथ भर नहीं सकता है, लेकिन यदि आप इसे बनाते हैं, तो अंतिम बाइट को लिखें, तो ओएस को पहले बाइट्स को शून्य करना पड़ सकता है (प्रारंभिकता को रोकना, यदि कोई हो)।
  5. क्या होता है यदि आप पूरी फ़ाइल को पूर्व-आवंटित करते हैं (प्रत्येक बाइट को लिखें) और इसे अनलिंक नहीं करें? दूसरे शब्दों में, फ़ाइल को अपने प्रोग्राम के रनों के बीच छोड़ दें (इसे बनाना अगर यह पहले से ही मौजूद नहीं है)। फिर Redis के लिए अपने स्टार्टअप कोड में, बस फ़ाइल (पॉइंटर्स और ऐसे) को प्रारंभ करें। इससे ऊपर की ओर 4 बिंदुओं जैसी किसी भी समस्या से छुटकारा मिल सकता है।
  6. विभिन्न बीएसडी साइटों पर भी पूछें। मुझे यकीन नहीं है कि ऐप्पल कवर के तहत कितना बदल गया है लेकिन ओएसएक्स निम्नतम स्तर पर बीएसडी है (कवर के लिए पैक्स बतख)।
  7. ऐप्पल साइटों पर पूछने पर भी विचार करें (यदि आपने पहले से ऐसा नहीं किया है)।

अच्छा, यह मेरा छोटा योगदान है, उम्मीद है कि इससे मदद मिलेगी। आपकी परियोजना के लिए शुभकामनाएं।

+0

हैलो, आपकी टिप्पणी बहुत बढ़िया है! इसके लिए बहुत बहुत धन्यवाद। आकार के बारे में, वास्तव में पूरा बिंदु गति है, लेकिन कई डेटासेट हैं जहां पूरे डेटासेट का केवल 5% सक्रिय रूप से उपयोग किया जाता है, इसलिए कभी-कभी एक बड़ी स्वैप फ़ाइल आसानी से काम की जा सकती है। रेडिस में उपयोगकर्ता स्वैप फ़ाइल आकार (पृष्ठ का आकार, और वास्तव में पृष्ठों की संख्या) और रेडिस का उपयोग करने वाली रैम की मात्रा दोनों को कॉन्फ़िगर करने में सक्षम है, इसलिए यह आपके डेटासेट के लिए सिस्टम को बहुत अच्छी तरह से ट्यून करने का विषय है। बीटीडब्ल्यू: 1) अच्छा विचार। 2) वास्तव में, यह पुष्टि कर सकता है कि वास्तविक फ़ाइल आवंटन समय है या नहीं। 3) अंतरिक्ष से बाहर निकलना मुश्किल है लेकिन ... – antirez

+0

(जारी रखें) मैं 4 के साथ भी कोशिश करूंगा। 5) शुरू करने का समय बहुत बड़ा हो सकता है, मैं इसे बढ़ाना चाहता हूं, और यह देखते हुए कि लिनक्स के साथ यह काम करता है, और यह पहला तैनाती पाल्टफॉर्म है ... 6 और 7) अच्छे विचार भी। अद्भुत टिप्पणी और सहायता। धन्यवाद! इस बिंदु पर मेरा सबसे अच्छा अनुमान यह है कि कुछ मैक ओएस एक्स कुछ लिखने के बाद डिस्क पर फ़ाइल आवंटित करने का प्रयास कर रहा है, और यह देखते हुए कि 26 जीबी फ़ाइल में उम्र लगती है। – antirez

+0

एंटीरेज़, फिर "5) स्टार्टअप समय बहुत बड़ा हो सकता है": मैं आपको यह सुझाव दे रहा था कि एक बार * पहली बार जब आप प्रोग्राम चलाते हैं और रन के बीच में स्वैप फ़ाइल छोड़ देते हैं। इस तरह, बाद के रनों को फ़ाइल बनाने की आवश्यकता नहीं होगी। उन्हें अभी भी इसे प्रारंभ करना होगा, लेकिन उम्मीद है कि यह केवल कुछ पॉइंटर-प्रकार मानों या शून्य गणनाओं की शुरुआत में ही लिखने का मामला होगा। – paxdiablo

संबंधित मुद्दे