एक आधुनिक फ़ाइल सिस्टम में लाखों फ़ाइलों के प्रदर्शन के निहितार्थ क्या हैं?


30

मान लें कि हम ext 4 का उपयोग कर रहे हैं (dir_index सक्षम के साथ) लगभग 3M फ़ाइलों (750KB आकार के साथ) की मेजबानी करने के लिए और हमें यह तय करने की आवश्यकता है कि हम किस फ़ोल्डर योजना का उपयोग करने जा रहे हैं।

में पहला समाधान , हम फाइल करने के लिए एक हैश समारोह लागू करते हैं और (किया जा रहा है 1 पहले स्तर के लिए चरित्र और दूसरे स्तर के लिए 2 अक्षर) फ़ोल्डर दो स्तरों का उपयोग करें: इसलिए किया जा रहा है filex.forहैश के बराबर abcde1234 , हम इस पर / पथ संग्रहीत करेंगे / a / bc /abcde1234-filex.for

में दूसरा समाधान , हम फाइल करने के लिए एक हैश समारोह लागू करते हैं और दो स्तरों फ़ोल्डर (किया जा रहा है पहले स्तर के लिए 2 अक्षर और दूसरे स्तर के लिए 2 अक्षर) का उपयोग करें: इसलिए किया जा रहा है filex.forहैश के बराबर abcde1234 , हम इस पर / संग्रहीत करेंगे पथ / ab / de /abcde1234-filex.for

पहले समाधान के लिए हमारे पास निम्न योजना होगी /path/[16 folders]/[256 folders] प्रति फ़ोल्डर औसतन 732 फाइलें (अंतिम फ़ोल्डर, जहां फ़ाइल निवास करेगी) के साथ होगी।

जबकि दूसरा समाधान पर हम होगा /path/[256 folders]/[256 folders]एक साथ फ़ोल्डर प्रति 45 फाइलों की औसत

ध्यान में रखते हुए कि हम इस योजना से बहुत कुछ (मूल रूप से nginx कैशिंग सिस्टम) लिखने / पढ़ने / फ़ाइलों ( लेकिन अधिकतर पढ़ने ) के लिए जा रहे हैं , क्या यह प्रदर्शन में मायने रखता है, अगर हमने एक या अन्य समाधान चुना?

इसके अलावा, इस सेटअप को जाँचने / परखने के लिए हम कौन से उपकरण इस्तेमाल कर सकते हैं?


7
जाहिर है बेंचमार्किंग से मदद मिलेगी। लेकिन इसके लिए ext4 गलत फाइल सिस्टम हो सकता है। मैं XFS को देखूंगा।
ewwhite

4
मैं बस नहीं होता पर देखने XFS, मैं तुरंत आगे की हलचल के बिना उसका प्रयोग करेंगे। बी + पेड़ हर बार हैश टेबल को हराता है।
माइकल हैम्पटन

युक्तियों के लिए धन्यवाद, बेंचमार्किंग थोड़ा कठिन है, हालांकि, मैंने कोशिश की, hdparm -Tt /dev/hdXलेकिन यह सबसे उपयुक्त उपकरण नहीं हो सकता है।
लींड्रो मोरिरा

2
कोई hdparmसही उपकरण नहीं है, यह ब्लॉक डिवाइस के कच्चे प्रदर्शन की जांच है और फाइल सिस्टम का परीक्षण नहीं है।
HBruijn

जवाबों:


28

इस प्रकार की निर्देशिका संरचना को बनाने का कारण यह है कि filesystems को एक निर्देशिका के भीतर एक फ़ाइल का पता लगाना चाहिए, और निर्देशिका जितनी बड़ी होगी, उतनी धीमी है।

फ़ाइल सिस्टम डिज़ाइन पर कितना धीमा निर्भर करता है।

Ext4 फ़ाइल सिस्टम निर्देशिका प्रविष्टियों को संग्रहीत करने के लिए B- ट्री का उपयोग करता है । इस तालिका पर एक लुक ओ (लॉग एन) समय लेने की उम्मीद है , जो कि अधिकांश समय भोली रैखिक तालिका की तुलना में कम है जो ext3 और पिछले फाइल सिस्टम का उपयोग किया जाता है (और जब ऐसा नहीं होता है, तो इसके लिए निर्देशिका बहुत छोटी है। वास्तव में मायने रखता है)।

XFS फाइलसिस्टम इसके बजाय B + ट्री का उपयोग करता है । हैश टेबल या बी-ट्री के ऊपर इसका लाभ यह है कि किसी भी नोड में कई बच्चे बी हो सकते हैं , जहां एक्सएफएस बी में भिन्नता है और रूट नोड के लिए 254 (या 19) तक हो सकता है; और ये संख्या पुराने हो सकते हैं। )। यह आपको ओ (लॉग बी एन) की एक जटिल जटिलता देता है , एक विशाल सुधार।

इनमें से या तो फाइलसिस्टम एक ही डायरेक्टरी में हज़ारों फ़ाइलों को संभाल सकते हैं, XFS एक ही संख्या में इनोडेस के साथ डायरेक्ट्री पर ext4 की तुलना में काफी तेज़ है। लेकिन आप शायद 3M इनोड के साथ एक भी डायरेक्टरी नहीं चाहते, क्योंकि B + ट्री के साथ लुकअप में कुछ समय लग सकता है। यही कारण है कि पहली जगह में इस तरीके से निर्देशिका बनाने के लिए नेतृत्व किया।

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


और XFS या ext4 के लिए, आपने जिस हार्डवेयर को फाइल सिस्टम पर रखा है, उसका प्रदर्शन पर बहुत अधिक प्रभाव पड़ेगा। एक धीमी गति से 5400-आरपीएम एसएटीए ड्राइव लगभग 50 यादृच्छिक आईओ संचालन / सेकंड कर सकता है, एक अच्छा 15,000 आरपीएम एसएएस ड्राइव कुछ सौ कर सकता है, और एक एसएसडी संभवतः बैंडविड्थ-सीमित होगा और कुछ मिलियन यादृच्छिक आईओ संचालन / सेकंड प्राप्त कर सकता है। यदि अधिक नहीं।
एंड्रयू हेनले

1
कड़ाई से बोलते हुए, $ O (\ log_b n) $ फिक्स्ड $ b $ के लिए $ O (\ log n) $ के समान ही जटिलता है। लेकिन ओपी के लिए, वास्तविक स्थिरांक मायने रखेगा।
हेगन वॉन एटिज़ेन

जब तक कि मेरे फाइल सिस्टम में कुछ गड़बड़ न हो, ext4 एक ही डायरेक्टरी में 10,000 फाइलों को हैंडल नहीं कर सकता। ls -lयदि निर्देशिका इनोड कैश बंद कर दिया गया है तो एक सरल कार्य करने में पूरा एक मिनट लगता है। और जब इसे कैश किया जाता है, तब भी इसे एक सेकंड से अधिक समय लगता है। यह SSD और Xeon के साथ काफी कम ट्रैफ़िक वेब सर्वर पर RAM के साथ है।
अभि बेकर्ट

@AbhiBeckert क्या इसे ext3 से अपग्रेड किया गया था? यदि हां, तो एक नई निर्देशिका बनाने का प्रयास करें और फ़ाइलों को उसमें स्थानांतरित करें।
माइकल हैम्पटन

@ हैम्पटन नंबर यह आधुनिक हार्डवेयर पर हाल ही में सेटअप सर्वर है। मैं कुछ महीनों के लिए हमारे sysadmin / डेटा सेंटर के साथ इस मुद्दे पर काम कर रहा हूं। हम सर्वर को पट्टे पर देने के लिए प्रति माह हजारों डॉलर का भुगतान कर रहे हैं और इससे बाहर स्वीकार्य प्रदर्शन नहीं कर रहे हैं। यह एक ही विकल्प की तरह लग रहा है कि एक नई निर्देशिका संरचना में जाना है - शायद फ़िलीन के लिए तारीखों के बजाय हैश का उपयोग करके इसे और अधिक फैलाने के लिए।
अभि बेकर्ट

5

मेरे अनुभव में, स्केलिंग कारकों में से एक हैश-नाम विभाजन की रणनीति को दिए गए इनोड्स का आकार है।

आपके प्रस्तावित दोनों विकल्प प्रत्येक बनाई गई फ़ाइल के लिए तीन इनकोड प्रविष्टियों को बनाते हैं। इसके अलावा, 732 फाइलें एक इनोड बनाएंगी जो अभी भी सामान्य 16KB से कम है। मेरे लिए, इसका मतलब यह है कि या तो विकल्प ही प्रदर्शन करेगा।

मैं आपको अपने छोटे हैश पर सराहना करता हूं; पिछले सिस्टम जो मैंने काम किया है, उस स्ट्रिंग के आधार पर दिए गए फ़ाइल और spliced ​​निर्देशिकाओं के sha1sum को लिया है, बहुत कठिन समस्या।


1
क्या SHA1 रकम (और अन्य, लंबे समय तक हैश रकम) का उपयोग "बहुत कठिन समस्या" बनाता है? यह मानव उपयोगकर्ताओं के लिए अनिष्टकारी है, हां, लेकिन यह ओएस, फाइल सिस्टम और अन्य कार्यक्रमों के लिए समान है।
kbolino

4

निश्चित रूप से या तो विकल्प एक निर्देशिका में फ़ाइलों की संख्या को कम करने में मदद करेगा जो उचित लगता है, एक्सएफ़एस या एक्सटी 4 या जो भी फ़ाइल सिस्टम के लिए है। यह स्पष्ट नहीं है कि कौन बेहतर है, यह बताने के लिए परीक्षण करना होगा।

आपके एप्लिकेशन के साथ बेंचमार्क असली काम के बोझ की तरह कुछ आदर्श है। अन्यथा, कुछ ऐसी चीज़ों के साथ आते हैं जो विशेष रूप से कई छोटी फ़ाइलों का अनुकरण करती हैं। उस के बारे में बात करते हुए, यहाँ एक खुला स्रोत है जिसे स्मॉलफाइल कहा जाता है । इसके प्रलेखन में कुछ अन्य उपकरण हैं।

hdparmनिरंतर I / O करना उतना उपयोगी नहीं है। यह कई छोटे I / Os या विशाल निर्देशिका प्रविष्टियों को बहुत अधिक फ़ाइलों से संबद्ध नहीं दिखाएगा।


1

समस्याओं में से एक फ़ोल्डर को स्कैन करने का तरीका है।

जावा विधि की कल्पना करें जो फ़ोल्डर पर स्कैन चलाता है।

इसे बड़ी मात्रा में मेमोरी आवंटित करनी होगी और इसे कम समय में निपटाना होगा जो कि जेवीएम के लिए बहुत भारी है।

सबसे अच्छा तरीका फ़ोल्डर संरचना को व्यवस्थित करना है जिस तरह से प्रत्येक फ़ाइल समर्पित फ़ोल्डर में है जैसे कि वर्ष / महीना / दिन।

जिस तरह से पूर्ण स्कैन किया जाता है वह यह है कि प्रत्येक फ़ोल्डर के लिए फ़ंक्शन का एक रन होता है, इसलिए जेवीएम फ़ंक्शन से बाहर निकल जाएगा, रैम को हटा देगा और इसे फिर से दूसरे फ़ोल्डर में चलाएगा।

यह सिर्फ उदाहरण है लेकिन फिर भी इतना बड़ा फ़ोल्डर होने का कोई मतलब नहीं है।


2
आप जावा मान रहे हैं और फ़ोल्डर को स्कैन कर रहे हैं। न ही इस प्रश्न का उल्लेख किया गया है, और जावा में फ़ोल्डर को स्कैन करने के अलावा इसे संसाधित करने के अन्य तरीके भी हैं।
user207421

1

मैं एक ही मुद्दा रहा है। Ext4 में एक Ubuntu सर्वर में लाखों फाइलों को स्टोर करने की कोशिश की जा रही है। अपने स्वयं के बेंचमार्क चलाना समाप्त कर दिया। पता चला कि फ्लैट डायरेक्टरी उपयोग करने के लिए सरल होने के दौरान बेहतर तरीके से प्रदर्शन करती है:

benchmark

एक लेख लिखा ।


यह निश्चित रूप से अपेक्षित परिणाम नहीं है। इससे पहले कि आप इसके साथ जाएं या इसकी सिफारिश करें, आपको यह देखना चाहिए कि आपको यह अप्रत्याशित परिणाम क्यों मिला।
माइकल हैम्पटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.