ext4 में प्रति निर्देशिका अधिकतम फ़ाइलें


16

मैं एक ऐसे अनुप्रयोग का प्रबंधन करता हूं जिसमें एक फाइलस्टोर होता है जिसमें सभी फाइलें फाइल के साथ उनके md5 रकम के बराबर जमा होती हैं। सभी फ़ाइलों को एक निर्देशिका में संग्रहीत किया जाता है। वर्तमान में हजारों हैं, लेकिन जल्द ही सर्वर पर उनकी लाखों फाइलें होनी चाहिए। वर्तमान सर्वर एक ext4 फाइलसिस्टम पर Ubuntu 11.10 चला रहा है।

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

क्या यह अभी भी सच है, या आधुनिक फाइलसिस्टम (जैसे ext4) के पास इससे निपटने के लिए और स्वाभाविक रूप से अधिक कुशल तरीके हैं? विकिपीडिया में फाइल सिस्टम पर कुछ विवरण हैं, लेकिन यह वास्तव में प्रति निर्देशिका अधिकतम फ़ाइलों या लुकअप समय के बारे में कुछ नहीं कहता है।

जवाबों:


8

ext3और बाद में फ़ाइल सिस्टम का समर्थन टुकड़ों में बंटी बी पेड़ निर्देशिका अनुक्रमण। जब तक आप केवल एक ही ऑपरेशन जोड़ते हैं, हटाते हैं, नाम से जोड़ते हैं, हटाते हैं और एक्सेस करते हैं। हालाँकि, मैं अभी भी निर्देशिकाओं को तोड़ने की सलाह दूंगा। अन्यथा, आप उपकरण के लिए एक खतरनाक बूबी ट्रैप बनाने ( updatedb, ls, du, और इतने पर) है कि निर्देशिका यदि निर्देशिका भी अनेक प्रविष्टियां हैं कि उड़ा सकते हैं पर अन्य संचालन करने के।


8

समस्या का मूल आप चाहते हैं कि एक फ़ाइल के लिए निर्देशिका इनोड के माध्यम से खुदाई कर रहा है। कुछ फाइलसिस्टम दूसरों की तुलना में इसे बेहतर करते हैं। कुछ पैमाने अरबों के करीब हैं, लेकिन अगर आपके पास केवल ... उन फ़ाइलों को प्राप्त करने वाली 20K फाइलें स्पष्ट रूप से तेज हैं। इसके अलावा, बड़ी फ़ाइल-काउंट कुछ टूल के लिए समस्याएं पैदा करते हैं और परिणामस्वरूप बैकअप / बहुत कठिन समस्या को बहाल कर सकते हैं।

जैसा कि ऐसा होता है कि मैं अपने स्वयं के विकास में सटीक समस्या में भाग गया (फ़ाइल नाम के रूप में md5sum, इसके स्केलिंग)। हमने अपने डेवलपर्स के लिए जो सिफारिश की है वह स्ट्रिंग को टुकड़ों में काटना है। वे 4 के समूहों के साथ गए थे, लेकिन उस समय हम जिस फाइल सिस्टम पर थे, उसमें भी कई प्रदर्शन के नजरिए से समस्याग्रस्त साबित होंगे, इसलिए उन्होंने पहले 6 ट्रिपल के समूह -3 में बंटवारे को समाप्त कर दिया और बाकी को छोड़ दिया। टर्मिनल निर्देशिका में फ़ाइल नाम।

4 का 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
समूह: 3 का समूह:497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt

इसमें डायरेक्टरी साइज को छोटा रखने का फायदा है और चूंकि एमडी 5sum बहुत रैंडम है, इसलिए यह संतुलित डायरेक्टरी ट्री बनाएगा। यह अंतिम निर्देशिका कुछ फ़ाइलों से अधिक प्राप्त करने की संभावना नहीं है। और हमारे कोड में काम करना उतना कठिन नहीं था। हम मल्टी-मिलियन फ़ाइल प्रोजेक्ट्स के साथ काम करते हैं, इसलिए स्केलिंग हमारे लिए बहुत महत्वपूर्ण थी।


4
बस सतर्क रहें कि यदि किसी हमलावर के पास कम्प्यूटेशनल संसाधन हैं, तो वह जानबूझकर दुर्भावनापूर्ण डेटा बना सकता है जो उसी निर्देशिका में उतरेगा। सभ्य संसाधनों और आज की तकनीक के साथ एक हमलावर हैश का उत्पादन कर सकता है जिसमें पहले 9 हेक्स अंक (और इस प्रकार पहले तीन निर्देशिका स्तरों में टकराते हैं) लगभग हर दस मिनट की दर से। और, ज़ाहिर है, आज पूर्ण एमडी 5 हैश उत्पन्न किया जा सकता है।
डेविड श्वार्ट्ज

5

आधुनिक filesystem बहुत बड़ी निर्देशिकाओं को अच्छी तरह से संभालती हैं, यहां तक ​​कि लाखों फाइलें भी। लेकिन पारंपरिक उपकरण नहीं हैं। उदाहरण के लिए "ls" के साथ इतनी बड़ी निर्देशिका को सूचीबद्ध करने में काफी लंबा समय लगेगा क्योंकि यह सामान्य रूप से पूरी निर्देशिका को पढ़ेगा और इसे छाँटेगा (हालाँकि आप छँटाई से बचने के लिए ls -f का उपयोग कर सकते हैं)। यह तब तक फाइलें दिखाना शुरू नहीं करेगा, जब तक सभी पढ़ नहीं जाते। नामों को विभाजित करने से कुछ मामलों में मदद मिलती है, लेकिन सभी में नहीं (उदाहरण के लिए rsync प्रतिकृति को अभी भी नामों के पूरे पेड़ को इकट्ठा करने की आवश्यकता हो सकती है)।


-1

क्या मैं इसके बजाय SQL डेटाबेस का उपयोग करने का सुझाव दे सकता हूं? यह संभवतः आपके आवेदन में इस कथित कमजोरी को एक ताकत में बदल देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.