कैसे ext3 / linux पर `rm` तेजी से बनाने के लिए?


32

मेरे पास ext3 फाइलसिस्टम डिफ़ॉल्ट विकल्पों के साथ आरोहित है। इस पर मेरे पास कुछ ~ 100GB फाइलें हैं।

ऐसी किसी भी फाइल को हटाने में लंबा समय (8 मिनट) लगता है और बहुत सारे io ट्रैफिक का कारण बनता है, जिससे सर्वर पर लोड बढ़ता है।

क्या rm को विघटनकारी नहीं बनाने का कोई तरीका है?


4
मूल रूप से यहां से कोई विधि काम नहीं करती थी, इसलिए हमने अपना विकास किया। इसे यहाँ वर्णित करें: depesz.com/index.php/2010/04/04/how-to-remove-backups

जवाबों:


14

सबसे दिलचस्प जवाब मूल रूप से सवाल पर एक टिप्पणी में दफन किया गया था। यहाँ यह इसे और अधिक दृश्यमान बनाने के लिए प्रथम श्रेणी के उत्तर के रूप में है:

मूल रूप से यहां से कोई विधि काम नहीं करती थी, इसलिए हमने अपना विकास किया। इसे यहाँ वर्णित करें: http://www.depesz.com/index.php/2010/04/04/how-to-remove-backups/ - depesz Apr 6 '10 15:15 बजे

यह लिंक एक व्यावहारिक समाधान की खोज और खोज के लिए अविश्वसनीय रूप से गहन विश्लेषण है।

नोट भी:

लेख कहता है:

जैसा कि आप देख सकते हैं, मैंने -c2 -n7आयनिस के विकल्पों का उपयोग किया , जो कि प्रतीत होता है।

यह सच है, लेकिन उपयोगकर्ता TafT का कहना है कि यदि आप कोई व्यवधान नहीं चाहते हैं, तो -c3'निष्क्रिय' -c2'सर्वश्रेष्ठ प्रयास' से बेहतर विकल्प होगा । उन्होंने -c3पृष्ठभूमि में निर्माण करने के लिए उपयोग किया है और यह पाया है कि निर्माण के लिए हमेशा इंतजार किए बिना अच्छी तरह से काम करना चाहिए। यदि आपके पास वास्तव में 100% io उपयोग है, तो -c3डिलीट को कभी पूरा नहीं होने देंगे, लेकिन वह यह उम्मीद नहीं करता है कि आपके पास काम किए गए परीक्षण पर आधारित है।


18

Ext4 या कुछ अन्य आधुनिक फाइलसिस्टम को अपग्रेड करें जो extents का उपयोग करता है। चूंकि ext3 extents के बजाय अप्रत्यक्ष ब्लॉक स्कीम का उपयोग करता है, इसलिए बड़ी फ़ाइलों को हटाना अनिवार्य रूप से बहुत सारे काम को मजबूर करता है।



4

दक्षता के संदर्भ में, प्रति फ़ाइल एक आरएम का उपयोग करना इष्टतम नहीं है, क्योंकि इसमें प्रत्येक आरएम के लिए कांटा और निष्पादन की आवश्यकता होती है।

मान लें कि आपके पास एक सूची है। इसमें वे फाइलें हैं जिन्हें आप निकालना चाहते हैं यह अधिक कुशल होगा लेकिन यह अभी भी धीमा रहने वाला है:

xargs -i rm {} < list.txt

इसके लिए एक और तरीका होगा: nice -20 xargs -i rm {} < list.txt
(इसमें कम समय लगेगा लेकिन आपके सिस्टम को बहुत प्रभावित करेगा :)

या

मुझे नहीं पता कि यह कितनी तेजी से होगा लेकिन:

mv <file-name> /dev/null 

या

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

या

cat /dev/null > /file/to/be/deleted(इसलिए यह अभी शून्य-आकार है) और यदि आप चाहते हैं कि यह rm -rf <file>अभी गायब हो जाए

या इससे भी बेहतर

बिल्ली छोड़ दो और बस करो # > /file/to/be/emptied


ठीक है, मैं 1 फ़ाइल को हटा रहा हूं , इसलिए कोई ओवरहेड नहीं है।

stackoverflow.com/questions/1795370/… - इसे भी जांचें

1

मुझे एक उचित गति से निर्देशिका को हटाने में समस्याएं हो रही थीं, पता चलता है कि प्रक्रिया डिस्क को लॉक कर रही थी और डिस्क तक पहुंचने की कोशिश कर रही प्रक्रियाओं का ढेर बना रही थी। आयनिस ने काम नहीं किया, यह सिर्फ 99% डिस्क IO का उपयोग करना जारी रखा और अन्य सभी प्रक्रियाओं को बंद कर दिया।

यहाँ पायथन कोड है जो मेरे लिए काम करता है। यह एक बार में 500 फ़ाइलों को हटा देता है, फिर दूसरी प्रक्रियाओं को अपना काम करने देने के लिए 2 सेकंड का ब्रेक लेता है, फिर जारी रहता है। बहुत अच्छा काम करता है।

import os, os.path
import time

for root, dirs, files in os.walk('/dir/to/delete/files'):
    file_num = 0
    for f in files:
        fullpath = os.path.join(root, f)
        os.remove(fullpath)
        if file_num%500 == 1:
            time.sleep(2)
            print "Deleted %i files" % file_num
        file_num = file_num + 1

1
Ext3 फाइलसिस्टम पर इसे 100G + फाइलों पर आज़माएँ। समस्या एकल फ़ाइल के आकार में है, फ़ाइलों की संख्या नहीं।

आपके मामले में ऐसा लगता है कि यह काम नहीं करेगा। लेकिन मेरे पास एक टन छोटी फाइलें थीं। प्रतिक्रिया के लिए धन्यवाद।
निक वुडहम्स

1

मेरे दो सेंट।

मुझे यह मुद्दा पहले ही मिल गया है। "अनुक्रमिक स्क्रिप्ट में जो तेजी से चलना है, प्रक्रिया बहुत सारी फ़ाइल को हटा देती है" .. इसलिए "आरएम" उस स्क्रिप्ट की गति को आईओ प्रतीक्षा / निष्पादन समय के करीब कर देगा।

इसलिए बात को और तेज़ बनाने के लिए, मैंने क्रोन के अनुसार एक और प्रक्रिया (बैश स्क्रिप्ट) लॉन्च की है .. जैसे कि कचरा संग्रहकर्ता एक विशेष निर्देशिका में सभी फ़ाइलों को हटा देता है।

तब मैंने मूल स्क्रिप्ट को "rm" के स्थान पर mv द्वारा "कचरा फ़ोल्डर" में बदल दिया है (टकराव से बचने के लिए इसके नाम के अंत में एक काउंटर जोड़कर फ़ाइल का नाम बदलें)।

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

आशा है कि मदद ..


0

यह भी ध्यान दें कि डेनिस विलियमसन का जवाब, जो आयनिस को लोड के लिए वर्कअराउंड के रूप में सुझाव देता है , केवल तभी काम करेगा जब आपका ब्लॉक डिवाइस CFQ io अनुसूचक का उपयोग करता है।


0

आप अपने बैकअप को स्टोर करने के लिए एक लूप फ़ाइल सिस्टम बनाने का प्रयास कर सकते हैं।

# dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

फिर, जब आप बैकअप को खाली करना चाहते हैं:

# umount /mnt/backups
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

Presto! संपूर्ण वर्चुअल फ़ाइल सिस्टम कुछ ही समय में साफ़ हो जाता है।


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

0

आप मल्टीथेडिंग व्हिट xargs का उपयोग कर सकते हैं

find . -type f | xargs -P 30 rm -rf 

जहां 30 थ्रेड्स की संख्या है जो आप बनाना चाहते हैं। यदि आप शून्य का उपयोग कर रहे हैं, तो सिस्टम कार्य निष्पादित करने वाले उपयोगकर्ता के लिए अधिकतम थ्रेड उपलब्ध कराता है।


1
findएक है -deleteविकल्प जो एक बेहतर विकल्प है।
एरियल

0

mv <file-name> / dev / null

/ dev / null एक फाइल है जो डायरेक्टरी नहीं है। फ़ाइल को फ़ाइल में स्थानांतरित नहीं किया जा सकता, या आप इसे अधिलेखित करने का जोखिम उठाते हैं।

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

मुझे नहीं लगता कि यह व्यावहारिक है। यह ओपी की तुलना में अनावश्यक रूप से अधिक I / O का उपयोग करेगा।


-1

/ dev / null एक फाइल है जो डायरेक्टरी नहीं है। फ़ाइल को फ़ाइल में स्थानांतरित नहीं किया जा सकता, या आप इसे अधिलेखित करने का जोखिम उठाते हैं।

वास्तव में यह एक उपकरण है और इसके लिए लिखे गए सभी डेटा को छोड़ दिया जाता है ताकि mv <file> /dev/nullसमझ में आए

विकिपीडिया से,
यूनिक्स जैसे ऑपरेटिंग सिस्टम में मुफ्त विश्वकोश , / देव / अशक्त या अशक्त डिवाइस एक विशेष फ़ाइल है जो इसे लिखे गए सभी डेटा को छोड़ देती है (लेकिन रिपोर्ट लिखती है कि ऑपरेशन सफल हुआ), और किसी भी व्यक्ति को कोई डेटा प्रदान नहीं करता है। इसे पढ़ता है (तुरंत ईओएफ की उपज)। [१]


1
यह गलत और अविश्वसनीय रूप से खतरनाक है। / dev / null एक उपकरण है, जो एक विशेष फ़ाइल जैसी वस्तु है। यदि आप रूट कर रहे हैं, "mv / some / file / dev / null", विशेष / dev / null डिवाइस को डिलीट कर देगा और आपकी फाइल को वहां ले जाएगा! तो अगली बार जब कोई व्यक्ति / dev / null का उपयोग करने की कोशिश करता है, तो वे डिवाइस के बजाय एक वास्तविक फ़ाइल का उपयोग कर रहे होंगे, और आपदा का विश्लेषण करेंगे। (जब विकिपीडिया कहता है कि यह "उस पर लिखे गए सभी डेटा को छोड़ देता है", तो इसका मतलब है कि "बिल्ली / कुछ / फ़ाइल> / देव / नल" पढ़ेगा / कुछ / फ़ाइल और आपके द्वारा पढ़ा गया डेटा छोड़ देगा, लेकिन यह प्रभावित नहीं करेगा। मूल फ़ाइल)।
user9876
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.