पृष्ठभूमि: भौतिक सर्वर, लगभग दो वर्ष पुराना, 7200-RPM SATA ड्राइव जो कि 3Ware RAID कार्ड से जुड़ा हुआ है, ext3 FS माउंटेड नॉटाइम और डेटा = क्रॉस्ड लोड के अंतर्गत नहीं, क्रमबद्ध 2.6.18-92.1.22.el5, अपटाइम 545 दिन । निर्देशिका में कोई उपनिर्देशिका नहीं होती है, बस कुछ छोटी (~ 100 बाइट) फाइलें, कुछ बड़ी (कुछ KB) वाली होती हैं।
हमारे पास एक सर्वर है जो पिछले कुछ महीनों के दौरान थोड़ा कोयल हो गया है, लेकिन हमने इसे केवल दूसरे दिन देखा जब यह बहुत सारी फाइलों के साथ एक निर्देशिका में लिखने में असमर्थ होने लगा। विशेष रूप से, इस त्रुटि को / var / log / संदेश में फेंकना शुरू कर दिया:
ext3_dx_add_entry: Directory index full!
विचाराधीन डिस्क में बहुत सारे कोड शेष हैं:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 60719104 3465660 57253444 6% /
इसलिए मैं अनुमान लगा रहा हूं कि इसका मतलब है कि हम इस सीमा को मारते हैं कि निर्देशिका फ़ाइल में कितनी प्रविष्टियाँ हो सकती हैं। पता नहीं कितनी फाइलें होंगी, लेकिन यह अधिक नहीं हो सकती, जैसा कि आप देख सकते हैं, तीन मिलियन या उससे अधिक। ऐसा नहीं है कि अच्छा है, तुम मन! लेकिन यह मेरे सवाल का एक हिस्सा है: वास्तव में वह ऊपरी सीमा क्या है? क्या यह ट्यून करने योग्य है? इससे पहले कि मैं चिल्लाता हूं - मैं इसे नीचे गिराना चाहता हूं ; इस विशाल निर्देशिका ने सभी प्रकार के मुद्दों का कारण बना।
वैसे भी, हमने उस कोड में समस्या को ट्रैक किया जो उन सभी फ़ाइलों को उत्पन्न कर रहा था, और हमने इसे ठीक कर दिया है। अब मैं निर्देशिका को हटाने के साथ फंस गया हूं।
यहाँ कुछ विकल्प:
rm -rf (dir)
मैंने पहले यही कोशिश की। डेढ़ दिन तक बिना किसी प्रभाव के चलने के बाद मैंने इसे छोड़ दिया और इसे मार दिया।
- निर्देशिका पर अनलिंक (2): निश्चित रूप से विचार के लायक है, लेकिन सवाल यह है कि क्या यह अनलिंक (2) के माध्यम से हटाने के लिए fsck के माध्यम से निर्देशिका के अंदर फ़ाइलों को हटाने के लिए तेज़ होगा। यही है, एक तरह से या किसी अन्य, मैं उन inodes को अप्रयुक्त के रूप में चिह्नित करने के लिए मिला हूं। यह मानता है, निश्चित रूप से, मैं fsck को बता सकता हूं कि फाइलों में प्रविष्टियों को ड्रॉप न करें / खोया + पाया; अन्यथा, मैं सिर्फ अपनी समस्या को आगे बढ़ाता हूं। अन्य सभी चिंताओं के अलावा, इस बारे में थोड़ा और पढ़ने के बाद, यह पता चला है कि मुझे शायद कुछ आंतरिक एफएस फ़ंक्शन को कॉल करना होगा, क्योंकि मुझे जो भी अनलिंक (2) वेरिएंट में से कोई नहीं मिल सकता है, वह मुझे ब्लिटली हटाने की अनुमति देगा इसमें प्रविष्टियों के साथ एक निर्देशिका। पूह।
while [ true ]; do ls -Uf | head -n 10000 | xargs rm -f 2>/dev/null; done )
यह वास्तव में छोटा संस्करण है; जो मैं चला रहा हूँ, वह वास्तविक है, जो कुछ प्रगति-रिपोर्टिंग और एक स्वच्छ पड़ाव जोड़ता है जब हम हटाने के लिए फाइलों से बाहर निकलते हैं, वह है:
निर्यात i = 0; समय (जबकि [सच] ;; ls -Uf | सिर -n 3 | grep -qF '.png' || टूटना; ls -Uf | हेड-एन 10000 | xargs rm -f 2> / dev / null; निर्यात i = $ (($ i + 10000)); गूंज "$ i ..."; किया हुआ )
यह अच्छी तरह से काम करने लगता है। जैसा कि मैंने इसे लिखा है, इसने पिछले तीस मिनटों में 260,000 फाइलें डिलीट की हैं।
- जैसा कि ऊपर उल्लेख किया गया है, क्या प्रति-निर्देशिका प्रविष्टि सीमा ट्यूनेबल है?
- किसी एकल फ़ाइल को हटाने के लिए "वास्तविक 7m9.561s / उपयोगकर्ता 0m0.001s / sys 0m0.001s" को क्यों लिया गया, जो उस सूची में पहले वाला था, जिसके द्वारा लौटाया गया था
ls -U
, और इसके साथ पहली 10,000 प्रविष्टियों को हटाने में शायद दस मिनट लगे # 3 में कमांड, लेकिन अब यह बहुत खुशी के साथ शासन कर रहा है? उस मामले के लिए, इसने लगभग तीस मिनट में 260,000 डिलीट कर दिए, लेकिन अब 60,000 और डिलीट करने में पंद्रह मिनट लग गए हैं। गति में विशाल झूलें क्यों? - क्या इस तरह का काम करने का कोई बेहतर तरीका है? एक निर्देशिका में लाखों फ़ाइलों को संग्रहीत न करें; मुझे पता है कि यह मूर्खतापूर्ण है, और यह मेरी घड़ी पर नहीं हुआ होगा। समस्या को देखते हुए और एसएफ और एसओ के माध्यम से देखने से कई प्रकार की विविधताएं मिलती
find
हैं जो कई स्व-स्पष्ट कारणों से मेरे दृष्टिकोण से काफी तेज नहीं होने वाली हैं। लेकिन क्या डिलीट-थ्रू- fsck आइडिया का कोई पैर है? या कुछ और पूरी तरह से? मैं आउट-ऑफ-द-बॉक्स (या अंदर-ही-नहीं-प्रसिद्ध-बॉक्स) सोच को सुनने के लिए उत्सुक हूं।
अंतिम स्क्रिप्ट आउटपुट !:
2970000...
2980000...
2990000...
3000000...
3010000...
real 253m59.331s
user 0m6.061s
sys 5m4.019s
इसलिए, चार घंटों में तीन मिलियन फाइलें कुछ ही समय में हटा दी गईं।
rm -rfv | pv -l >/dev/null
। pv EPEL रिपॉजिटरी में उपलब्ध होना चाहिए ।