प्रदर्शन में गिरावट तब होती है जब आपकी ज़ुल्फ़ या तो बहुत भरी होती है या बहुत खंडित हो जाती है। इसका कारण ZFS के साथ नियोजित मुक्त ब्लॉक खोज का तंत्र है। NTFS या ext3 जैसी अन्य फ़ाइल सिस्टम के विरोध में, कोई ब्लॉक बिटमैप नहीं है जो दिखा रहा है कि कौन से ब्लॉक पर कब्जा है और कौन से स्वतंत्र हैं। इसके बजाय, ZFS आपके ज़वोल को (आमतौर पर 200) बड़े क्षेत्रों में विभाजित करता है, जिसे "मेटास्लैब" कहा जाता है और प्रत्येक मेटास्लैब में एवीएल-ट्री को 1 निःशुल्क ब्लॉक सूचना (स्पेस मैप) में संग्रहीत करता है। संतुलित एवीएल पेड़ अनुरोध के आकार को अवरुद्ध करने वाले ब्लॉक के लिए एक कुशल खोज की अनुमति देता है।
जबकि इस तंत्र को पैमाने के कारणों के लिए चुना गया है, दुर्भाग्य से यह भी एक प्रमुख दर्द निकला जब उच्च स्तर के विखंडन और / या अंतरिक्ष उपयोग होता है। जैसे ही सभी मेटाबेस एक महत्वपूर्ण मात्रा में डेटा ले जाते हैं, आपको पूल खाली होने पर बड़ी संख्या में छोटे क्षेत्रों के विपरीत बड़ी संख्या में मुफ्त ब्लॉक मिलते हैं। यदि ZFS को फिर 2 MB स्थान आवंटित करने की आवश्यकता होती है, तो यह सभी मेटाबेस के स्पेस मैप को पढ़ना और मूल्यांकन करना शुरू कर देता है या तो 2 ब्लॉक को छोटे ब्लॉकों में तोड़ने के लिए एक उपयुक्त ब्लॉक या रास्ता ढूंढता है। इस कोर्स में कुछ समय लगता है। इससे भी बुरी बात यह है कि यह पूरी तरह से I / O संचालन का एक बहुत खर्च होगा क्योंकि ZFS वास्तव में भौतिक डिस्क से सभी अंतरिक्ष मानचित्रों को पढ़ेगा । के लिए किसी भी आपके लेखन की।
प्रदर्शन में गिरावट महत्वपूर्ण हो सकती है। यदि आप सुंदर चित्रों को पसंद करते हैं, तो डेल्फीक्स पर ब्लॉग पोस्ट पर एक नज़र डालें, जिसमें कुछ संख्याओं ने एक (ओवरसम्प्लीफाइड लेकिन अभी तक मान्य) ज़ैफ़ पूल को हटा दिया है। मैं बेशर्मी से ग्राफ में से एक को चुरा रहा हूं - इस ग्राफ में नीली, लाल, पीली और हरी रेखाओं को देखें जो क्रमशः (10%, 50%, 75%, और 93% क्षमता पूल का प्रतिनिधित्व करते हैं) समय के साथ विखंडित होते हुए KB / s:

इस पर एक त्वरित और गंदी नियमावली पारंपरिक रूप से मेटास्लैब डिबगिंग मोड रही है (बस echo metaslab_debug/W1 | mdb -kwसेटिंग बदलने के लिए रन-टाइम पर मुद्दा )। इस स्थिति में, प्रत्येक रैम ऑपरेशन में अत्यधिक और महंगे I / O की आवश्यकता को हटाते हुए, सभी स्पेस मैप्स को OS RAM में रखा जाएगा। अंततः, इसका मतलब यह भी है कि आपको अधिक मेमोरी की आवश्यकता है, विशेष रूप से बड़े पूल के लिए, इसलिए यह स्टोरेज हॉर्स-ट्रेड के लिए एक रैम की तरह है। आपका 10 टीबी पूल शायद आपको 2-4 जीबी मेमोरी 2 का खर्च देगा , लेकिन आप इसे बिना किसी परेशानी के 95% तक उपयोग कर पाएंगे।
1 यह थोड़ा और अधिक जटिल है, यदि आप रुचि रखते हैं, तो विवरण के लिए अंतरिक्ष के नक्शे पर बोनविक की पोस्ट देखें
2 यदि आपको मेमोरी के लिए एक ऊपरी सीमा की गणना करने के तरीके की आवश्यकता है, तो वर्तमान में प्रत्येक मेटास्लैब में उपयोग में zdb -mm <pool>आने वाली संख्या को पुनः प्राप्त करने के लिए segmentsउपयोग करें, इसे दो से विभाजित करके सबसे खराब स्थिति वाला मॉडल बनाएं (प्रत्येक कब्जा किए गए सेगमेंट को मुफ्त में पालन किया जाएगा। ), इसे AVL नोड के लिए रिकॉर्ड आकार से गुणा करें (दो मेमोरी पॉइंटर्स और एक मान, 128 बिट्स की प्रकृति को देखते हुए और 64-बिट एड्रेसिंग को 32 बाइट्स तक समिट किया जाएगा, हालांकि लोग आमतौर पर 64 बाइट्स के लिए मान लेते हैं कारण)।
zdb -mm tank | awk '/segments/ {s+=$2}END {s*=32/2; printf("Space map size sum = %d\n",s)}'
संदर्भ: मूल रूपरेखा इस पोस्टिंग में मार्कस कोवरो द्वारा zfs- चर्चा मेलिंग सूची में निहित है , हालांकि मेरा मानना है कि उन्होंने अपनी गणना में कुछ गलतियां की हैं, जो मुझे सही होने की उम्मीद है।
volume8.5T तक सीमित करके रख सकता हूं और फिर कभी इस बारे में नहीं सोचूंगा। क्या वो सही है?