2008-11-03 18 views
7

मेरे पास एक वेब सर्वर है जो कैश फ़ाइलों को बचाता है और उन्हें 7 दिनों तक रखता है। फ़ाइल नाम लंबे md5 हैश, अर्थात वास्तव में 32 हेक्स चरित्र, और एक वृक्ष संरचना है कि इस तरह दिखता है में रखा जा रहा है:बहुत सारी अस्थायी छोटी फ़ाइलों को संभालना

00/ 
    00/ 
    00000ae9355e59a3d8a314a5470753d8 
    . 
    . 
00/ 
    01/ 

आप अंदाजा हो।

मेरी समस्या यह है कि पुरानी फाइलों को हटाने में वास्तव में काफी समय लग रहा है। मेरे पास दैनिक क्रॉन जॉब है जो

find cache/ -mtime +7 -type f -delete 

जो पूरा करने के लिए आधा दिन से अधिक समय लेता है। मैं स्केलेबिलिटी और सर्वर के प्रदर्शन पर असर के बारे में चिंता करता हूं। इसके अतिरिक्त, कैश निर्देशिका अब मेरे सिस्टम में एक ब्लैक होल है, कभी-कभी निर्दोष du या find को फँसाना।

एलआरयू कैश का मानक समाधान कुछ प्रकार का ढेर है। क्या फाइल सिस्टम स्तर पर इसे स्केल करने का कोई तरीका है? क्या इसे इस तरह कार्यान्वित करने का कोई और तरीका है जिससे इसे प्रबंधित करना आसान हो जाता है?

  1. 7 शीर्ष निर्देशिका, प्रत्येक सप्ताह दिन के लिए एक, और खाली एक निर्देशिका हर दिन बनाएँ:

    यहाँ विचारों मैं माना जाता है। यह कैश फ़ाइल 7-गुना के लिए खोज समय बढ़ाता है, जब फ़ाइल ओवरराइट की जाती है तो यह वास्तव में जटिल होती है, और मुझे यकीन नहीं है कि यह हटाने के समय के साथ क्या करेगा।

  2. फ़ाइलों को नाम और दिनांक पर इंडेक्स के साथ एक MySQL तालिका में ब्लॉब्स के रूप में सहेजें। यह आशाजनक लग रहा था, लेकिन व्यावहारिक रूप से यह हमेशा एफएस से धीमा रहा है। शायद मैं इसे सही नहीं कर रहा हूँ।

कोई विचार?

उत्तर

15

जब आप कोई फ़ाइल संग्रहीत करते हैं, तो दिनांक के अनुसार व्यवस्थित दूसरी निर्देशिका संरचना के लिए एक प्रतीकात्मक लिंक बनाएं।

"नाम" संरचना का उपयोग करके अपनी फ़ाइलों को पुनर्प्राप्त करें, उन्हें "दिनांक" संरचना का उपयोग करके हटाएं।

+0

बगजर :) आपने मुझे इसे हराया। इस जवाब को +1 करें। –

+0

बस मूल फ़ाइल और लिंक दोनों को हटाना सुनिश्चित करें। आप वहां बहुत से मृत लिंक नहीं चाहते हैं, और लिंक को हटाने और मूल फ़ाइल को हटाने के लिए भी आसान है। –

0

हैश के रूप में हैश का उपयोग करने वाले आपके डेटाबेस में एक टेबल होने के बारे में। तब दूसरा क्षेत्र फ़ाइल का नाम होगा। इस तरह फ़ाइल को तेजी से हटाने के लिए डेट-संबंधित फैशन में संग्रहीत किया जा सकता है, और डेटाबेस को उस फ़ाइल के स्थान को फास्ट फ़ैशन में हैश के आधार पर ढूंढने के लिए उपयोग किया जा सकता है।

1

Reiserfs छोटी फ़ाइलों को संभालने में अपेक्षाकृत कुशल है। क्या आपने विभिन्न लिनक्स file systems का प्रयास किया था? मुझे डिलीट प्रदर्शन के बारे में निश्चित नहीं है - आप व्यक्तिगत फ़ाइल हटाने के लिए एक विकल्प के रूप में स्वरूपण (mkfs) पर विचार कर सकते हैं। उदाहरण के लिए, आप प्रत्येक सप्ताह के लिए एक अलग फ़ाइल सिस्टम (कैश 1, कैश 2, ...) बना सकते हैं।

1

कैसे इस बारे में:

  • अन्य फ़ोल्डर, कहा जाता है कि, "ToDelete"
  • जब आप एक नया आइटम जोड़ने, आज की तारीख हो और "ToDelete" में एक सबफ़ोल्डर एक नाम है जो देखने के लिए है आज की तारीख का संकेत
  • यदि यह वहाँ नहीं है, बनाने यह
  • आइटम आप आज के फ़ोल्डर में बना लिया है
  • एक क्रॉन जॉब है कि "ToDelete" है, जिसमें फ़ोल्डर में चला जाता बनाने के लिए एक प्रतीकात्मक लिंक जोड़ें कोर का रेक्ट डेट और लिंक किए गए सभी फ़ोल्डर्स को हटा दें।
  • उस फ़ोल्डर को हटाएं जिसमें सभी लिंक शामिल हैं।
4

मान लीजिए कि ext2/3 क्या आपने अनुक्रमित निर्देशिकाओं में जोड़ने का प्रयास किया है? जब आपके पास किसी विशेष निर्देशिका में बड़ी संख्या में फाइलें होती हैं तो लुकअप कुछ हटाने के लिए दर्दनाक रूप से धीमा हो जाएगा।
dir_index विकल्प को सक्षम करने के लिए tune2fs -o dir_index का उपयोग करें।
फ़ाइल सिस्टम को आरोहित करते समय, नोटाइम विकल्प का उपयोग करना सुनिश्चित करें, जो ओएस को निर्देशिकाओं के लिए एक्सेस टाइम जानकारी अपडेट करने से रोकता है (अभी भी उन्हें संशोधित करने की आवश्यकता है)।
मूल पोस्ट को देखते हुए ऐसा लगता है कि आपके पास केवल फाइलों के संकेत के 2 स्तर हैं, जिसका अर्थ है कि आपके पास पत्ती निर्देशिकाओं में बड़ी संख्या में फाइलें हो सकती हैं। जब इन में दस लाख से अधिक प्रविष्टियां होंगी तो आप पाएंगे कि खोज और परिवर्तन बहुत धीमे हैं। एक विकल्प निर्देशिका की गहरी पदानुक्रम का उपयोग करना है, किसी भी विशेष निर्देशिका में वस्तुओं की संख्या को कम करना, इसलिए विशेष व्यक्तिगत निर्देशिका में खोज और अपडेट की लागत को कम करना।

संबंधित मुद्दे