नफ़्स के बजाय स्थानीय रनिंग आरएम-आरएफ़ का उपयोग करना बेहतर है?


10

क्या यह उस मशीन पर लॉग इन करने के लिए समय में बहुत अंतर rm -rfकरेगा जो निर्देशिका पर करने से पहले निर्देशिका है, या rm -rfएनएफएस पर सिर्फ निर्देशिका है?

जवाबों:


11

बेशक ssh बेहतर है।

Nfs विभिन्न दूरस्थ प्रक्रिया कॉल और डेटा सिंक्रनाइज़ेशन प्रतीक्षा समय के साथ एक जटिल नेटवर्क प्रोटोकॉल का उपयोग करता है। Ssh के मामले में, ये लागू नहीं होते हैं।

इसके अलावा, कई ताले हैं। Nfs में फ़ाइल विलोपन इस तरह से काम करता है:

  1. आपका rmआदेश unlink()syscall देता है
  2. nfs ड्राइवर इसे sunrpc अनुरोध में परिवर्तित करता है, इसे nfs सर्वर पर भेजता है
  3. nfs सर्वर इस sunrpc रिक्वेस्ट को एक unlink()कॉल में परिवर्तित करता है
  4. unlink()रिमोट कॉल पर इस कॉल को अंजाम देता है
  5. यह सफल होने के बाद, क्लाइंट को "सब ठीक हो गया" के बराबर आरपीसी रिप्लाई मैसेज वापस देता है
  6. क्लाइंट-साइड का कर्नेल ड्राइवर इसे unlink()आपके मूल के कॉल के एक्जिट कोड 0 पर वापस करता हैrm
  7. rm अगली फ़ाइल को iterates, गोटो 1

अब, महत्वपूर्ण बात यह है: 2-7 के बीच, rmइंतजार करना होगा। यह अगली unlink()कॉल को एसिंक्रोनस रूप से भेज सकता है , लेकिन यह एक एकल-थ्रेडेड है, न कि ईवेंट-ओरिएंटेड टूल। यहां तक ​​कि अगर यह कर सकता है, तब भी यह मुश्किल nfs माउंट झंडे की आवश्यकता होगी। जब तक इसका परिणाम नहीं मिलता, तब तक यह इंतजार करता है।

एनएफएस - और किसी भी नेटवर्क फाइलसिस्टम - हमेशा बहुत धीमी है।


कई मामलों में, आप एक चाल के साथ पुनरावर्ती विलोपन अर्ध-अनंत गति कर सकते हैं:

  1. पहले निर्देशिका को किसी भिन्न नाम पर ले जाएँ ( mv -vf oldfilms oldfilms-)
  2. पृष्ठभूमि में हटाएं ( rm -rf oldfilms- &)

कई (लेकिन सभी नहीं) पहलुओं से, इस निर्देशिका को हटाने से ऐसा लगेगा जैसे यह व्यावहारिक रूप से शून्य समय में हुआ था।


विस्तार: जैसा कि @ el.pascado ने अपनी उत्कृष्ट टिप्पणी में उल्लेख किया है, वास्तव में 2-7 को किसी भी फाइल के लिए 3x चलाना है :

  • यह निर्धारित करने के लिए कि क्या यह एक फ़ाइल या एक निर्देशिका है ( lstat()syscall के साथ ),
  • फिर उसके अनुसार करें। साधारण फ़ाइलों के मामलों में unlink(), निर्देशिकाओं के मामले में opendir(), सभी फ़ाइलों / निर्देशिकाओं को पुनरावर्ती रूप से हटा देना, फिर closedir(), अंत में rmdir()
  • अंत में, एक readdir()कॉल के साथ अगली निर्देशिका प्रविष्टि के लिए पुनरावृति ।

इसके लिए, इसमें फ़ाइलों के लिए 3 nfs RPC कमांड और निर्देशिकाओं के लिए अतिरिक्त 3 की आवश्यकता होती है।


2
Nfs मामला और भी बुरा है। जैसा कि प्रश्न में -rध्वज का उल्लेख है , rmपहले यह देखना होगा कि क्या फ़ाइल एक निर्देशिका है ( lstatएनएफ़एस के माध्यम से), इसे खोलें ( opendirएनएफ़एस के माध्यम से), इसकी सामग्री पढ़ें ( readdirएनएफ़एस के माध्यम से), और उसके बाद ही वास्तविक विलोपन करें जैसा कि अंदर मिली प्रत्येक फ़ाइल पर उत्तर में वर्णित है और उपनिर्देशिका, निकट निर्देशिका ( closedirnfs के माध्यम से) में शाप देना, और फिर हर पाया dir के लिए दोहराएँ।
el.pescado

5

हाँ। शायद हो सकता है। निर्भर करता है। फ़ाइलों और निर्देशिकाओं की एक छोटी संख्या के लिए, यह बहुत अंतर नहीं करेगा।

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

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

एनएफएस सर्वर पर:

$ cd /export/shared/ports

$ du -hs .
2.6G    .

$ find . | wc -l
  179688

$ time rm -rf /export/shared/ports/*
0m20.87s real     0m00.12s user     0m04.62s system

क्लाइंट पर (बैकअप से मूल फ़ाइलों को पुनर्स्थापित करने के बाद):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.