इस लेख में हम 3.0.2 में पेश किए गए डेटा लोड करने के नए विकल्पों के बारे में बात करते हैं।
डेटा वाला एक इंडेक्स कई घटकों से बना होता है जैसे कि डिक्शनरी, दस्तावेज़ और हिट सूचियाँ, विशेषताएँ। पूरे इंडेक्स को पूरी तरह से RAM में लोड नहीं किया जाता है क्योंकि यह संभव नहीं है, बल्कि इसके घटकों को विभिन्न तरीकों से पढ़ा और लोड किया जाता है।
विशेषताएँ
डिफ़ॉल्ट रूप से विशेषताएँ RAM में लोड की जाती हैं, लेकिन यह चुनना संभव था कि उन्हें सभी लोड करना है, केवल स्केलर टाइप (अपूर्णांक या फ्लोट) लोड करना है या उन्हें डिस्क पर रखना है।
विशेषताएँ मेमरी-मैप्ड फाइलों के रूप में लोड की जाती हैं। विशेषताओं को mmap() का उपयोग करके लोड करने का लाभ क्लासिक सर्च&रीड के मुकाबले बेहतर प्रदर्शन है, जो pread() का उपयोग करता है। यह छोटी मात्रा में RAM का उपयोग करते हुए बड़े फ़ाइलों को भी उपयोग करने की अनुमति देता है।
2.x में विशेषता लोडिंग ondisk_attrs के माध्यम से प्रबंधित की गई थी। भले ही हम RAM में विशेषताओं को लोड करने का विकल्प चुनें, mmap() के साथ पूरे फ़ाइल को पढ़ना यह गारंटी नहीं देता कि फ़ाइल के पृष्ठ RAM में बने रहेंगे, क्योंकि OS कर्नेल उन्हें मुक्त कर सकता है (यह अनुप्रयोग के लिए कोई समस्या नहीं है क्योंकि mmaped फ़ाइलें फ़ाइल के द्वारा डिस्क पर समर्थित होती हैं)। यह सुनिश्चित करने के लिए कि विशेषताएँ RAM में रहें और OS उन्हें डिस्क में न स्वैप करे, mlock का उपयोग किया जाना था।
3.0.2 में हमने एक बदलाव करने का निर्णय लिया और विशेषताओं के लोड करने के लिए प्रकारों के लिए एक सेटिंग और mlocking के लिए एक नहीं रखने के बजाय, दो सेटिंग्स रखी, प्रत्येक विशेषताओं के लिए जो यह तय करती हैं कि वे कैसे लोड की जाती हैं और क्या उन्हें लॉक किया जाना चाहिए।
नए सेटिंग्स हैं
access_blob_attrs
- जो परिवर्तनीय-लंबाई की विशेषताओं (string,JSON,MVA) का प्रबंधन करती है -
और access_plain_attrs
- जो निश्चित-लंबाई की विशेषताओं (uint,bigint,float,timestamp,bool) का प्रबंधन करती है। संभावित मान हैं mmap, mmap_preread और mlock।
पुरानी निर्देशिकाओं से नई में स्विच करना काफी सरल है:
ondisk_attrs = 0का मतलब है कि कोई विशेषता डिस्क पर नहीं छोड़ी गई है और उन्हें RAM में प्रीरीड किया गया है। यह mlock=0 के साथ डिफ़ॉल्ट मान था। अब यहaccess_blob_attrs = mmap_prereadऔरaccess_plain_attrs= mmap_prereadके बराबर है। इस मोड का उपयोग तब किया जाना चाहिए जब सभी विशेषताएँ RAM में फिट हो सकें। यह सुनिश्चित करने के लिए कि उन्हें डिस्क पर स्वैप नहीं किया गया है, इसके बजाय हमaccess_blog_attrs = mlockऔरaccess_plain_attrs = mlockका उपयोग कर सकते हैं, जोondisk_attrs=0औरmlock=1के बराबर है।ondisk_attrs=1का मतलब है कि सभी विशेषताएँ डिस्क पर छोड़ी गई हैं। नए विकल्पों के साथ आपकोaccess_blob_attrs=mmapऔरaccess_plain_attrs=mmapनिर्दिष्ट करना होगा।ondisk_attrs=poolका मतलब है कि स्ट्रिंग, JSON और MVA विशेषताओं को डिस्क पर छोड़ना है। अब समान प्रभाव प्राप्त करने के लिए आपकोaccess_blob_attrs=mmapऔरaccess_plain_attrs=mmap_prereadकरना होगा।
लेकिन अब यह भी संभव है कि संख्यात्मक विशेषताओं को डिस्क पर रखा जाए और इसके बजाय परिवर्तनीय-लंबाई वाली विशेषताओं को लोड किया जाए (जैसे access_blob_attrs=mmap_preread/access_plain_attrs=mmap करके) यदि उदाहरण के लिए आपके पास सभी के लिए पर्याप्त RAM नहीं है और आपके प्रश्न अधिक संचालन (फिल्टरिंग, समूहबद्धता, वर्गीकरण) करने में सक्षम हों।
यह केवल कुछ विशेषताओं का mlocking करना भी संभव है। उदाहरण के लिए, हम चाहते हैं कि संख्यात्मक विशेषताएँ यह सुनिश्चित करें कि वे RAM में रहें, लेकिन अन्य विशेषताओं को हम RAM में प्रीरीड कर सकते हैं, लेकिन हम उन्हें लॉक नहीं करने के लिए स्वीकार करते हैं ताकि कुछ मेमोरी स्थान को मुक्त किया जा सके।
फुल-टेक्स्ट इंडेक्स
फुलटेक्स्ट का एक भाग स्वयं कई घटकों को शामिल करता है। डिक्शनरी घटक (.spi) हमेशा RAM में लोड होता है क्योंकि यह फुल-टेक्स्ट खोज प्रदर्शन के लिए महत्वपूर्ण है और इसका आकार बड़ा नहीं है। दस्तावेज़ सूची (.spd) शब्दों के लिए सूचीकृत शब्दों के संदर्भों को दस्तावेज़ों और क्षेत्रों में धारण करती है। यह घटक सामान्यत: बड़ा होता है और इसे pread() का उपयोग करके पहुंचा जाता था।
फुल-टेक्स्ट इंडेक्स का एक और घटक हिटलिस्ट (.spp) है जिसमें क्षेत्रों में शब्दों के स्थान शामिल होते हैं। हिटलिस्ट भी बड़ी हो सकती हैं (लेकिन दस्तावेज़ सूचियों के रूप में बड़ी नहीं होती हैं) और इन्हें उसी तरह से पहुंचा गया था जैसे कि डॉकलिस्ट। 3.0.2 से शुरू होकर, दोनों घटक mmap() के साथ pread() के बजाय लोड किए जा सकते हैं, जिसका उपयोग
access_doclists
और access_hitlists किया जाता है। सेटिंग में दो मान स्वीकार किए जाते हैं: file (जो pread() का उपयोग करता है और डिफ़ॉल्ट है) और mmap।
मेमोरी निर्देशिकाओं को सेट करने का तरीका?
डिफ़ॉल्ट रूप से पूर्ण-टेक्स्ट इंडेक्स घटकों के लिए फ़ाइल का उपयोग किया जाता है और सभी विशेषताओं के लिए mmap_preread, जो मेमोरी उपयोग और खोज प्रदर्शन के बीच सबसे संतुलित प्रोफाइल है।
यह सुनिश्चित करने के लिए कि RAM में लोड किए गए विशेषताओं के डेटा OS द्वारा ड्रॉप नहीं किए जाते हैं, mlock का उपयोग किया जा सकता है। लॉकिंग उन सिस्टमों पर होनी चाहिए जिनमें विशेषताओं के लिए पर्याप्त मात्रा में मेमोरी हो लेकिन साथ ही डॉक / हिट सूचियों के लिए भी पर्याप्त मेमोरी छोड़ें। सर्वश्रेष्ठ प्रदर्शन तब प्राप्त होता है जब इंडेक्स को पूरी तरह से RAM में लोड/कैश किया जा सकता है। फ़ाइल विधि का उपयोग करके डॉक/हिट सूचियाँ /dev/null पर अपनी फ़ाइलों को भेजकर गर्म की जा सकती हैं।
उन मामलों के लिए जहां पहली क्वेरी से सर्वोत्तम प्रदर्शन प्राप्त करना है, searchd का --force-preread विकल्प का उपयोग किया जा सकता है। इस विकल्प का उपयोग सावधानी से किया जाना चाहिए क्योंकि डेमन स्टार्टअप पूरा होने तक आने वाली क्वेरियों का उत्तर नहीं देता। एकल सेटअप के लिए इसका मतलब है कि कोई खोज क्वेरियाँ संभव नहीं हैं, जो यह निर्भर करेगा कि स्टार्टअप खत्म करने के लिए आवश्यक समय का उत्तर देना इस समय के दौरान Bigger times के साथ स्वीकार्य नहीं हो सकता है।
यदि इंडेक्स उपलब्ध मेमोरी से बड़े हैं या गर्म होने का समय लंबा होना स्वीकार्य है, तो सरल file/mmap का उपयोग किया जाना चाहिए। यदि इंडेक्स RAM में ठीक से नहीं फिट होते हैं, तो प्रदर्शन स्टोरेज के प्रदर्शन पर निर्भर करेगा। अधिक मेमोरी और तेज़ स्टोरेज के बीच चयन करना प्रत्येक के लागत पर निर्भर करता है। तेज़ स्टोरेज (जैसे NVMe) पर्याप्त मेमोरी न होने के दुर्बलताओं को कम करेगी। यदि पर्याप्त मेमोरी है, लेकिन स्टोरेज धीमा है, तो स्टार्टअप या इंडेक्स रीलोड समय अधिक होगा और प्रदर्शन तब तक प्रभावित होगा जब तक इंडेक्स RAM में लोड नहीं हो जाते।