प्रभावी ढंग से ZFS से 10M + फ़ाइलें हटाएँ


30

मैंने एक छोटी गाड़ी प्रोग्राम लिखा है, जिसने गलती से लगभग 30M फ़ाइलों को / tmp के तहत बनाया है। (बग को कुछ हफ़्ते पहले पेश किया गया था, और यह प्रति सेकंड कुछ उपनिर्देशिकाओं का निर्माण कर रहा था।) मैं / tmp2 को / tmp का नाम बदल सकता हूं, और अब मुझे फ़ाइलों को हटाने की आवश्यकता है। सिस्टम FreeBSD 10 है, रूट फाइल सिस्टम zfs है।

इस बीच दर्पण में एक ड्राइव गलत हो गई, और मैंने इसे बदल दिया है। ड्राइव में दो 120GB SSD डिस्क हैं।

यहाँ सवाल है: हार्ड ड्राइव की जगह और पूरे सरणी को फिर से व्यवस्थित करने में एक घंटे से भी कम समय लगा। फ़ाइलों को हटाना / tmp2 एक और कहानी है। मैंने फ़ाइलों को हटाने के लिए एक और कार्यक्रम लिखा है, और यह केवल 30-70 उपनिर्देशिका प्रति सेकंड हटा सकता है। सभी फाइलों को डिलीट करने में 2-4 दिन लगेंगे।

यह कैसे संभव है कि पूरे सरणी को फिर से व्यवस्थित करने में एक घंटा लगता है, लेकिन डिस्क से हटाने में 4 दिन लगते हैं? मेरे पास इतना खराब प्रदर्शन क्यों है? 70 विलोपन / सेकंड बहुत खराब प्रदर्शन लगता है।

मैं मैन्युअल रूप से / tmp2 के लिए आईनोड को हटा सकता हूं, लेकिन यह स्थान खाली नहीं करेगा, है ना?

यह zfs के साथ एक समस्या हो सकती है, या हार्ड ड्राइव या क्या?


1
मैं एक zfs विशेषज्ञ नहीं हूं, इसलिए मैं आपके प्रदर्शन पर बात नहीं कर सकता या आप इसे बेहतर बनाने के लिए क्या कर सकते हैं (यह भी बहुत जानकारी लेगा और संभवत: एक विशेषज्ञ द्वारा सीधे किया जाएगा)। हालाँकि, मैं कह सकता हूँ कि ब्लॉक-स्तर पर रेज़िवरिंग होता है, जबकि आपके डिलीशन फाइल सिस्टम स्तर पर होते हैं। उस समय एक बिलियन इनोड बफ़र को हटाते समय फ़ाइल सिस्टम में ज्यादातर ओवरहेड होगा।
स्पूलर

कृपया पोस्ट अपने df -hऔर zpool listऔर zfs list
ewwhite

5
एक और कार्यक्रम लिखा: rm -rf /tmp2काम नहीं करेगा?
Thorbjørn रावन एंडरसन

2
क्या आप सिर्फ रिबूट नहीं कर सकते थे? /tmpएक tmpfsफाइलसिस्टम होना चाहिए और इसे मेमोरी में स्टोर किया जाता है।
ब्लेंडर

जवाबों:


31

ZFS में डिलीट करना महंगा होता है। इससे भी ज्यादा अगर आपके पास फाइलसिस्टम पर डिडुप्लीकेशन इनेबल है (क्योंकि डेरेफेरिंग की गई फाइल महंगी है)। स्नैपशॉट मामलों को भी जटिल कर सकता है।

आपके /tmpभीतर मौजूद डेटा के बजाय निर्देशिका को हटाना बेहतर हो सकता है ।

यदि /tmpएक ZFS फाइल सिस्टम है, तो इसे हटा दें और फिर से बनाएं।


1
@nagylzs उस मामले में मैं इसे एक अलग ZFS फ़ाइल सिस्टम बनाने का सुझाव दूंगा। फिर आप वर्तमान / tmp को रास्ते से हटा सकते हैं, एक नया / tmp स्थान पर ले जा सकते हैं, और सिस्टम के अवकाश में फ़ाइलों को हटा सकते हैं। परिणाम: न्यूनतम डाउनटाइम प्लस एक मामूली प्रदर्शन डीग्रीजेशन (मिटिगेटेबल ionice, फ्रीबीएसडी के पास यह है) जबकि डिलीट चल रहा है।
बजे एक CVn

9
मैं गलत था। यह एक अलग फाइल सिस्टम था। यहाँ क्या काम किया गया है: एकल उपयोगकर्ता मोड पर रीबूट करें, फिर "zfs को zroot / tmp हटाएं; zfs zroot / tmp बनाएँ; chmod
41777

6
यह कुल डाउनटाइम 5 मिनट था। बहुत खुबस! :-)
नागेलज़्स

1
खैर, मैं उस चिंता से भी बात करता हूं, जो स्नैपचैट के कारण फेक डिलीट करने से कभी जगह खाली नहीं होती। लेकिन tmp को स्वचालित आवधिक स्नैपशॉट नहीं बनाने के लिए स्थापित किया जाएगा, है ना?
JDługosz

1
वास्तव में यह था: zfs create -o संपीड़न = on -o exec = on -o setuid = off zroot / tmp; chmod 1777 / zroot / tmp; zfs सेट माउंटपॉइंट = / tmp zroot / tmp; मुझे यकीन नहीं है कि हालांकि ऑटो स्नैपशॉट बंद कैसे करें। "Zfs सेट com.sun: ऑटो-स्नैपशॉट = गलत" है, लेकिन यह केवल सोलारिस पर काम करता है, मुझे लगता है।
नगिल्ज़्स

27

यह कैसे संभव है कि पूरे सरणी को फिर से व्यवस्थित करने में एक घंटा लगता है, लेकिन डिस्क से हटाने में 4 दिन लगते हैं?

एक कार्यालय भवन पर विचार करें।

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

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


5
ZFS एक कार्यालय भवन नहीं है :)
developerbmw

9
@developerbmw भी वास्तव में वहाँ पर एक फ़ाइल या फ़ोल्डर नहीं है, लेकिन हमें समझने के लिए रूपक अवधारणाओं की आवश्यकता है।
JamesRyan

2
@JamesRyan हाँ, यह वास्तव में एक अच्छा सादृश्य है ... मैं बस बेवकूफ बना रहा था
डेवलपर

5

यहां कई चीजें चल रही हैं।

सबसे पहले, सभी आधुनिक डिस्क प्रौद्योगिकियां बल्क ट्रांसफर के लिए अनुकूलित हैं। यदि आपको 100MB डेटा स्थानांतरित करने की आवश्यकता है, तो वे इसे बहुत तेजी से करेंगे यदि वे सभी जगह में बिखरे हुए एक सन्निहित ब्लॉक में हैं। SSD यहां बहुत मदद करते हैं, लेकिन यहां तक ​​कि वे सन्निहित ब्लॉकों में डेटा पसंद करते हैं।

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

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

यह कैसे संभव है कि पूरे सरणी को फिर से व्यवस्थित करने में एक घंटा लगता है, लेकिन डिस्क से हटाने में 4 दिन लगते हैं?

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

70 विलोपन / सेकंड बहुत खराब प्रदर्शन लगता है

निर्भर करता है। मुझे इससे आश्चर्य नहीं होगा। आपने उल्लेख नहीं किया है कि आप किस प्रकार के एसएसडी का उपयोग कर रहे हैं। आधुनिक इंटेल और सैमसंग एसएसडी इस तरह के ऑपरेशन (रीड-मॉडिफ़ाइड-राइट) पर बहुत अच्छे हैं और बेहतर प्रदर्शन करेंगे। सस्ता / पुराना SSDs (जैसे Corsair) धीमा होगा। प्रति सेकंड I / O संचालन की संख्या (IOPS) यहाँ का निर्धारण कारक है।

ZFS है विशेष रूप से चीजों को नष्ट करने के लिए धीमी गति से। आम तौर पर, यह पृष्ठभूमि में विलोपन करेगा, ताकि आपको देरी न दिखे। यदि आप उनमें से एक बड़ी संख्या में कर रहे हैं तो इसे छिपा नहीं सकते हैं और आपको देरी करनी चाहिए।


परिशिष्ट: विलोपन धीमा क्यों हैं?

  • किसी फ़ाइल को हटाने के लिए कई चरणों की आवश्यकता होती है। फ़ाइल मेटाडेटा को 'हटाए गए' के ​​रूप में चिह्नित किया जाना चाहिए, और अंततः इसे पुनः प्राप्त करना होगा ताकि स्थान का पुन: उपयोग किया जा सके। ZFS एक 'लॉग स्ट्रक्चर्ड फाइलसिस्टम' है जो सबसे अच्छा प्रदर्शन करता है यदि आप कभी भी चीजें बनाते हैं, तो उन्हें कभी भी डिलीट न करें। लॉग संरचना का मतलब है कि यदि आप कुछ हटाते हैं, तो अंतराल को भरने के लिए लॉग में अंतराल है और इसलिए अन्य डेटा को फिर से व्यवस्थित (डीफ़्रैग्मेन्टेड) ​​किया जाना चाहिए। यह उपयोगकर्ता के लिए अदृश्य है लेकिन आम तौर पर धीमा है।
  • परिवर्तनों को इस तरह से किया जाना चाहिए कि यदि बिजली के माध्यम से भाग को विफल करना है, तो फाइल सिस्टम सुसंगत रहता है। अक्सर, इसका अर्थ है कि जब तक डिस्क यह पुष्टि नहीं करती कि डेटा वास्तव में मीडिया पर है; एक एसएसडी के लिए, यह एक लंबा समय (सैकड़ों मिलीसेकंड) ले सकता है। इसका शुद्ध प्रभाव यह है कि बहुत अधिक बहीखाता पद्धति (यानी डिस्क I / O संचालन) है।
  • सभी परिवर्तन छोटे हैं। पूरे फ्लैश ब्लॉक (या चुंबकीय डिस्क के लिए सिलेंडर) को पढ़ने, लिखने और मिटाने के बजाय आपको थोड़ा सा संशोधित करने की आवश्यकता है। ऐसा करने के लिए, हार्डवेयर को पूरे ब्लॉक या सिलेंडर में पढ़ा जाना चाहिए, इसे मेमोरी में संशोधित करें, फिर इसे फिर से मीडिया में लिखें। इसमें लंबा समय लगता है।

मुझे ZFS के बारे में पता नहीं है, लेकिन कुछ फ़ाइल-सिस्टम आपको सामग्री के साथ एक निर्देशिका को अनलिंक करने की अनुमति देते हैं, लेकिन उन सामग्रियों को बाद में कचरा संग्रह / डीफ़्रेग / सफाई चरण के दौरान हटा दिया जाता है। क्या ZFS के पास ऐसी आलसी विलोपन करने की कोई उपयोगिता है? यह वास्तव में ओपी के विलोपन को गति नहीं देगा, लेकिन अगर हाउसकीपिंग के दौरान यह होता है तो यह कम समस्या पैदा करेगा।
वैलिटी

2

यह कैसे संभव है कि पूरे सरणी को फिर से व्यवस्थित करने में एक घंटा लगता है, लेकिन डिस्क से हटाने में 4 दिन लगते हैं?

यह संभव है क्योंकि दो ऑपरेशन फ़ाइल सिस्टम स्टैक के विभिन्न परतों पर काम करते हैं। Resilvering निम्न-स्तर चला सकता है और वास्तव में अलग-अलग फ़ाइलों को देखने की आवश्यकता नहीं है, एक समय में डेटा की बड़ी मात्रा की प्रतिलिपि बनाता है।

मेरे पास इतना खराब प्रदर्शन क्यों है? 70 विलोपन / सेकंड बहुत खराब प्रदर्शन लगता है।

इसके लिए बहुत सारे बहीखाते करने पड़ते हैं ...

मैं मैन्युअल रूप से / tmp2 के लिए आईनोड को हटा सकता हूं, लेकिन यह स्थान खाली नहीं करेगा, है ना?

मैं ZFS के लिए नहीं जानता, लेकिन अगर यह स्वतः ही इससे उबर सकता है, तो यह संभव है, अंत में, आप जो पहले से कर रहे हैं, वही ऑपरेशंस पृष्ठभूमि में करें।

यह zfs के साथ एक समस्या हो सकती है, या हार्ड ड्राइव या क्या?

करता है zfs scrubकुछ भी कहना?


2

बहुत सारी फ़ाइलों को हटाना वास्तव में कभी भी तेज़ संचालन नहीं है।

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

यहां तक ​​कि विशिष्टताओं के बिना ZFS का परिचय, 30 मिलियन फ़ाइलों को हटाने का आमतौर पर एक सौ मिलियन अलग I / O संचालन से अधिक है। यह होगा भी एक तेजी से एसएसडी के साथ एक लंबे समय लगता है। जैसा कि दूसरों ने उल्लेख किया है, जेडएफएस के डिजाइन ने इस मुद्दे को आगे बढ़ाया है।


2

इयान हॉसन धीमी गति से क्यों है, इस पर एक अच्छा जवाब देता है।

यदि आप समानांतर में फ़ाइलों को हटाते हैं, तो आपको गति में वृद्धि दिखाई दे सकती है क्योंकि विलोपन उसी ब्लॉकों का उपयोग कर सकता है और इस प्रकार एक ही ब्लॉक को कई बार फिर से लिखने से बचा सकता है।

इसलिए कोशिश करें:

find /tmp -print0 | parallel -j100 -0 -n100 rm

और देखें कि क्या वह आपके 70 डिलीट प्रति सेकेंड से बेहतर प्रदर्शन करता है।


0

बहुत आसान है अगर आप अपनी सोच को पलटते हैं।

  1. दूसरी ड्राइव प्राप्त करें (आपको लगता है कि यह पहले से ही है)

  2. ड्राइव ए से सब कुछ कॉपी करें बी ड्राइव को rsync के साथ, / tmp निर्देशिका को छोड़कर। रुपीस एक ब्लॉक कॉपी की तुलना में धीमा होगा।

  3. रिबूट, ड्राइव बी को नए बूट वॉल्यूम के रूप में उपयोग कर रहा है

  4. रिफॉर्मेट ड्राइव ए।

यह आपकी ड्राइव को डीफ़्रैग्मेंट भी करेगा और आपको एक नई निर्देशिका देगा (ठीक है, डीफ़्रैग एक एसएसडी के साथ इतना महत्वपूर्ण नहीं है लेकिन आपकी फ़ाइलों को रैखिक करना कभी भी कुछ भी चोट नहीं पहुंचाता है)


सबसे पहले सब कुछ कॉपी / tmp को छोड़कर? तो / देव और / खरीद सहित? दूसरे, मेरे लिए थोड़ा सा कर्कश ध्वनि, विशेष रूप से एक उत्पादन सर्वर पर।
हेन्नेस

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

मुझे लगता है कि आप zfs send/recvरूट फाइल सिस्टम (जहां / tmp इस मामले में स्थित है) को छोड़कर अन्य सभी फाइल सिस्टमों को भी ब्लॉक कर सकते हैं (रूट / tmp इस मामले में शेष है) और मैन्युअल रूप से रूट फाइल सिस्टम पर शेष डेटा को कॉपी करें (कोर्स के tmp को छोड़कर)।
14:12 पर user121391

2
यह स्नैपशॉट खो देगा और विश्वसनीयता विशेषताओं में से कुछ को बायपास कर देगा। Zfs के उपयोग की बात याद आती है।
JDługosz

2
@ JDługosz मान्य अंक, लेकिन केवल अगर उपयोगकर्ता परवाह है। जैसे "मेरे बैकअप दूषित हैं, मरम्मत कैसे करें?" -> "क्या आपको किसी बैकअप फाइल की आवश्यकता है?" -> "नहीं।" -> "सुधार"।
पीटर

-1

आपके पास एक बिना सूची वाली सूची में 30 मिलियन प्रविष्टियाँ हैं। आप उस प्रविष्टि के लिए सूची को स्कैन करते हैं जिसे आप निकालना चाहते हैं और आप उसे हटा देते हैं। अब आपकी अनसुलझी सूची में केवल 29,999,999 प्रविष्टियाँ हैं। यदि वे सभी / tmp में हैं, तो सिर्फ रिबूट क्यों नहीं?


टिप्पणियों में जानकारी को प्रतिबिंबित करने के लिए संपादित: समस्या का कथन: 30M + गलत तरीके से बनाई गई / tmp में सबसे अधिक, लेकिन सभी को हटाना, एक लंबा समय लग रहा है।
समस्या 1) / tmp से बड़ी संख्या में अवांछित फ़ाइलों को हटाने का सर्वोत्तम तरीका।
समस्या 2) यह समझना कि फाइलों को हटाना इतना धीमा क्यों है।

समाधान 1) - / tmp अधिकांश * निक्स वितरणों द्वारा बूट पर खाली करने के लिए रीसेट किया गया है। हालांकि FreeBSD उनमें से एक नहीं है।
चरण 1 - दिलचस्प फ़ाइलों को कहीं और कॉपी करें।
चरण 2 - जड़ के रूप में

 $ grep -i tmp /etc/rc.conf  
 clear_tmp_enable="YES" # Clear /tmp at startup.  

चरण 3 - रिबूट।
चरण 4 - बदलें clear_tmp_enable "नहीं" पर वापस।
अवांछित फ़ाइलें अब जा चुकी हैं क्योंकि FreeBSD पर ZFS की विशेषता है कि "डेटासेट को नष्ट करने से डेटासेट पर रहने वाली सभी फ़ाइलों को हटाने की तुलना में बहुत तेज है, क्योंकि इसमें सभी फ़ाइलों को स्कैन करना और सभी संबंधित मेटाडेटा को अपडेट करना शामिल नहीं है। " इसलिए सभी को बूट समय पर करना होगा / मेटा डेटा के लिए मेटाडेटा रीसेट करना होगा। यह बहुत जल्दी है।

समाधान 2) यह इतना धीमा क्यों है? ZFS एक अद्भुत फ़ाइल सिस्टम है जिसमें निरंतर समय निर्देशिका पहुंच जैसी विशेषताएं शामिल हैं। यह अच्छी तरह से काम करता है यदि आप जानते हैं कि आप क्या कर रहे हैं, लेकिन सबूत बताते हैं कि ओपी एक ZFS विशेषज्ञ नहीं है। ओपी ने संकेत नहीं दिया है कि वे फ़ाइलों को हटाने का प्रयास कैसे कर रहे थे, लेकिन एक अनुमान के अनुसार, मैं कहूंगा कि उन्होंने "रेगेक्स -एक्ससीएम आरएम {} \" खोजें पर एक बदलाव का इस्तेमाल किया। यह छोटी संख्या के साथ अच्छी तरह से काम करता है, लेकिन पैमाने पर नहीं होता है क्योंकि 1 पर तीन सीरियल ऑपरेशन चल रहे हैं) उपलब्ध फ़ाइलों की सूची प्राप्त करें (हैश ऑर्डर में 30 मिलियन फाइलें लौटाएं), 2) हटाए जाने के लिए अगली फ़ाइल लेने के लिए regex का उपयोग करें, 3 ) ओएस को 30 मिलियन की सूची से उस फ़ाइल को खोजने और निकालने के लिए कहें। भले ही ZFS स्मृति से एक सूची लौटाता है और यदि इसे खोजते हैं, रेगेक्स को अभी भी सूची से संसाधित होने के लिए अगली फ़ाइल की पहचान करनी है और फिर ओएस को अपने मेटाडेटा को अपडेट करने के लिए उस परिवर्तन को प्रतिबिंबित करने और फिर सूची को अपडेट करने के लिए कहें ताकि यह फिर से संसाधित न हो।


1
मुझे लगता है कि आपने प्रश्न को गलत समझा। मुझे ज्यादातर फाइलें निकालने की जरूरत पड़ी। यानी 30M + फाइलें।
नागलेज़्स

रिबूट पर @nagylzs / tmp साफ़ किया जाता है। यदि आप सबसे हटना चाहते हैं , तो आप केवल कुछ को रखना चाहते हैं , यानी कम से कम आधा, इसलिए उन लोगों को कॉपी करें जिन्हें आप रखना चाहते हैं और फिर बाकी से छुटकारा पाने के लिए रिबूट करें। आपके डिलीट होने का कारण इतना धीमा है कि एक डायरेक्टरी में बड़ी संख्या में फाइल होने के कारण एक बड़ी अनसोल्ड लिस्ट होती है, जिस फाइल को ऑपरेट करने में समय लगता है, उसे ढूंढने के लिए प्रोसेस करना पड़ता है। यहाँ एकमात्र समस्या PEBCAK है।
पॉल स्मिथ

ZFS निर्देशिका रहे unsorted ? मैंने सोचा कि zfs ने विशेष रूप से बड़ी निर्देशिकाओं को अच्छी तरह से संभाला है।
JDługosz

खैर, / tmp को मंजूरी नहीं दी गई है, केवल एक्स संबंधित फाइलें। कम से कम FreeBSD पर। इसे बूट पर वैसे भी साफ़ नहीं किया जा सकता है, क्योंकि इसे सामान्य रूप से हटाने के लिए आरसी स्क्रिप्ट के लिए दिन लगेंगे।
नागफिज

@JDlugosz - ZFS तो सबसे बेहतर है, लेकिन इनोड सूचियां (जो सभी निर्देशिकाएं हैं) अनसोल्ड हैं।
पॉल स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.