इस लेख में हम चर्चा करेंगे कि स्टार्टअप पर इंडेक्स कैसे लोड होते हैं और इनकमिंग क्वेरीज़ तथा सर्च इंस्टेंस के प्रबंधन पर इसके प्रभाव क्या हैं।
पुराने स्फिंक्स वर्जन में, यदि preopen विकल्प सेट किया गया था, तो इंडेक्स को पहले से पढ़कर मेमोरी में लोड किया जाता था। इस दौरान, डेमन किसी भी इनकमिंग कनेक्शन को स्वीकार करने से मना कर देता था। छोटे इंडेक्स के लिए यह बड़ी समस्या नहीं थी क्योंकि वे जल्दी लोड हो जाते थे। लेकिन एक बड़े इंडेक्स के लिए जिसे दसियों या सैकड़ों GB लोड करने की आवश्यकता होती थी, यह एक वास्तविक समस्या थी क्योंकि लोडिंग को पूरा होने में कई मिनट या उससे अधिक समय लग सकता था।
स्फिंक्स 2.3 में यह बदल गया, क्योंकि इंडेक्स फाइलें सिर्फ पढ़ी और मेमोरी में लोड होने के बजाय मेमोरी-मैप्ड (mmap के साथ) हो जाती हैं। mmap के साथ, डेमन का एक शैडो थ्रेड और मुख्य थ्रेड नहीं, प्रत्येक पेज के लिए पहले एक बाइट पढ़ता है और फिर बाकी डेटा को पढ़ना जारी रखता है, धीरे-धीरे सब कुछ RAM में लाता है लेकिन डेटा तक पहुंच की भी अनुमति देता है। संक्षेप में, यह इंडेक्स फाइलों की आलसी लोडिंग है।
इस तरह डेमन जैसे ही अप होता है कनेक्शन स्वीकार कर सकता है। यदि किसी क्वेरी को कुछ रैंडम डेटा एक्सेस करने की जरूरत है जो अभी तक मेमोरी में लोड नहीं हुआ है, तो वह इसे डिस्क से पढ़ेगा। इसका मतलब यह भी है कि क्वेरी सामान्य से धीमी निष्पादित हो सकती है (स्टोरेज प्रदर्शन पर निर्भर करते हुए) लेकिन कम से कम डेमन परिणाम प्रदान कर सकता है। इसके अलावा, जैसे ही किसी इंडेक्स की फाइलें लोड हो जाती हैं, डेमन उसके लिए ‘पूरी स्पीड’ प्रदान कर सकता है भले ही अन्य इंडेक्स अभी भी लोड हो रहे हों।
जबकि यह अधिकांश उपयोगकर्ताओं के लिए अच्छी खबर है, कुछ के लिए ‘आलसी’ लोडिंग सबसे अच्छी नहीं हो सकती। उदाहरण के लिए एक लोड बैलेंसर जो सरल रणनीतियों (रैंडम या राउंड रोबिन) का उपयोग करता है जो रिस्पांस टाइम को नहीं मापते हैं, वह रीबूट किए गए इंस्टेंस को डेमन के अप होते ही जोड़ देगा। चूंकि क्वेरीज़ को सीधे डिस्क से रीड करने की आवश्यकता होगी, इंस्टेंस सामान्य से अधिक या बहुत अधिक रिस्पांस टाइम प्रदान करेगा, जो कि वांछनीय नहीं है। इसके बजाय यह बेहतर होगा यदि संभव हो तो इंस्टेंस को क्लस्टर में तभी जोड़ा जाए जब डेमन इंडेक्स को लोड करना समाप्त कर दे।
इस स्थिति को कवर करने के लिए searchd के लिए 2.3 से एक विकल्प मौजूद है, लेकिन दुर्भाग्य से हाल ही तक यह अप्रलेखित था: ‘–force-preread’। इस विकल्प का उपयोग करने पर डेमन अभी भी इंडेक्स फाइलों को mmap करेगा, लेकिन प्रीरीड एक ब्लॉकर ऑपरेशन है (जैसे पुराने वर्जन में) और searchd तब तक जवाब नहीं देगा जब तक सब कुछ मेमोरी में लोड नहीं हो जाता।