पृष्ठभूमि की एक पंक्ति: मैं Redis, a NoSQL database का डेवलपर हूं। मैं जो नई सुविधाओं को कार्यान्वित कर रहा हूं उनमें से एक वर्चुअल मेमोरी है, क्योंकि रेडिस मेमोरी में सभी डेटा लेता है। वीएम रेडिस के लिए धन्यवाद स्मृति से डिस्क तक शायद ही कभी उपयोग की जाने वाली वस्तुओं को स्थानांतरित करने में सक्षम है, ओएस को हमारे लिए स्वैप करने के लिए काम करने से कई बेहतर कारण हैं (रेडिस ऑब्जेक्ट्स गैर-संगत में आवंटित कई छोटी वस्तुओं से बने होते हैं स्थानों, जब रेडिस द्वारा डिस्क पर क्रमबद्ध किया जाता है, वे स्मृति पृष्ठों की तुलना में 10 गुना कम स्थान लेते हैं, जहां वे रहते हैं, और आगे)।सी प्रोग्राम मैक ओएस एक्स हिम तेंदुए पर डिस्क I/O प्रदर्शन करते समय अनइंटरप्टिव प्रतीक्षा पर फंस गया
अब मेरे पास अल्फा कार्यान्वयन है जो लिनक्स पर पूरी तरह से काम कर रहा है, लेकिन मैक ओएस एक्स हिम तेंदुए पर इतना अच्छा नहीं है। समय-समय पर, रेडिस एक पृष्ठ को स्मृति से डिस्क में स्थानांतरित करने का प्रयास करता है, फिर भी रेडिस प्रक्रिया मिनटों के लिए अनियंत्रित प्रतीक्षा स्थिति में प्रवेश करती है। मैं इसे डीबग करने में असमर्थ था, लेकिन यह या तो fseeko()
या fwrite()
पर कॉल में होता है। मिनटों के बाद कॉल अंततः वापस आती है और रेडिस बिना किसी समस्या के काम कर रही है: कोई दुर्घटना नहीं।
स्थानांतरित की गई डेटा की मात्रा बहुत छोटा है, कुछ 256 बाइट्स की तरह है। तो यह आई/ओ प्रदर्शन की एक बड़ी राशि का मामला नहीं होना चाहिए।
लेकिन स्वैप फ़ाइल के बारे में एक दिलचस्प जानकारी है जो लेखन ऑपरेशन का लक्ष्य है। यह एक बड़ी फ़ाइल (26 गीगाबाइट्स) है जिसे fopen()
के साथ एक फ़ाइल खोलने के लिए बनाया गया है और फिर ftruncate()
का उपयोग करके बढ़ाया गया है। अंत में फ़ाइल unlink()
एड है ताकि रेडिस इसका संदर्भ लेना जारी रखे, लेकिन हमें यकीन है कि जब रेडिस प्रक्रिया ओएस से बाहर निकल जाएगी तो वास्तव में स्वैप फ़ाइल को मुक्त कर दिया जाएगा।
ठीक है, लेकिन मैं किसी और विवरण के लिए यहां हूं। और बीटीडब्ल्यू आप रेडिस गिट में भी वास्तविक कोड पा सकते हैं, लेकिन पांच मिनट में समझना मुश्किल नहीं है क्योंकि यह काफी जटिल प्रणाली है।
किसी भी मदद के लिए बहुत बहुत धन्यवाद।
अधिक जानकारी: अब एक छोटी स्वैप फ़ाइल (256 एमबी) के साथ कोशिश कर रहा है, बग गायब हो गया है, भले ही डेटा एक ही स्थान पर और पृष्ठों की एक ही संख्या में लिखा गया हो। यह और उत्तर में अन्य अनुमानों को देखते हुए, ऐसा लगता है कि कुछ घटित होने के बाद ऑपरेटिंग सिस्टम भौतिक रूप से फाइल सिस्टम में बड़ी फ़ाइल आवंटित करने का प्रयास करता है, और इसमें आकार देने में कुछ मिनट लगते हैं। मैं कम से कम एक विकल्प के रूप में भौतिक आवंटन ASAP को मजबूर करने के लिए स्टार्टअप पर कुछ यादृच्छिक बाइट्स को "ठीक" कर सकता हूं। बहुत बहुत धन्यवाद। यहां अद्यतनों को धक्का देगा। – antirez