कैश कैसे करें या अन्यथा `डु` सारांश को गति दें?


33

हमारे पास एक बड़ी फ़ाइल प्रणाली है जिस पर एक पूर्ण du(डिस्क उपयोग) सारांश को दो मिनट से अधिक समय लगता है। मैं उस फ़ाइल सिस्टम पर मनमानी निर्देशिकाओं के लिए डिस्क उपयोग सारांश को गति देने का एक तरीका खोजना चाहता हूं।

छोटी शाखाओं के लिए मैंने देखा है कि duपरिणाम किसी भी तरह से कैश होने लगते हैं, क्योंकि दोहराने के अनुरोध बहुत तेज़ होते हैं, लेकिन बड़ी शाखाओं पर गति नगण्य हो जाती है।

क्या duपिछली खोज के बाद संशोधित नहीं हुई शाखाओं के लिए तेजी से , या अधिक आक्रामक तरीके से कैशिंग परिणाम का एक सरल तरीका है ?

या क्या कोई वैकल्पिक आदेश है जो डिस्क उपयोग सारांश को तेज़ी से वितरित कर सकता है?


8
दो मिनट मुझे लंबे समय तक नहीं लगते हैं। लेकिन असली सवाल यह है: "क्या आप वास्तव में कुछ भी कैश करना चाहते हैं?" क्या डू आपको सटीक, जैसा कि वर्तमान-वर्तमान-संभव, वास्तविक डिस्क ब्लॉक मायने नहीं रखता है?
ब्रूस एडगर

मैं मानता हूं कि प्रतिस्थापित duकरना बुरा होगा, लेकिन एक समान इंटरफ़ेस के साथ एक तेज़ आवरण स्क्रिप्ट हमारे लिए बहुत उपयोगी होगी। इसके अलावा, मैं उम्मीद करूंगा कि अंतिम-संशोधित समय पर निर्भर रहने वाले कैशिंग परिणाम (और डिस्क-वाइड ऑपरेशंस, जैसे कि डीफ़्रेग्मेंटेशन मानकर) सटीक आकार परिणाम देगा: क्या मुझे कुछ याद आ रहा है?
इयान मैकिनन

2
यदि आप बहुत अधिक डिस्क उपयोग के बारे में चिंतित हैं तो आप कोटा लागू करने पर विचार कर सकते हैं।
प्यासी

2
ब्रूस - आप के बारे में एक ही सवाल पूछ सकते हैं find। लेकिन फिर वहाँ है locate
युवल

यदि आप एंड्रॉइड पर हैं , तो StatFsनिर्देशिका आकारों के सुपर फास्ट अनुमान के लिए एक नज़र डालें । इसकी तुलना में बड़े, जटिल निर्देशिकाओं के लिए यह लगभग 1000 गुना तेज था du
जोशुआ पिंटर

जवाबों:


21

जब आप एक डु कमांड को फिर से चलाते हैं तो आप डिस्क बफ़रिंग का प्रभाव देखते हैं। एक बार जब आप किसी ब्लॉक को पढ़ते हैं तो उसकी डिस्क बफर को बफर कैश में तब तक रखा जाता है जब तक कि ब्लॉक की जरूरत न हो। डु के लिए आपको निर्देशिका में प्रत्येक फ़ाइल के लिए निर्देशिका और इनकोड को पढ़ने की आवश्यकता है। इस मामले में डु परिणाम को कैश नहीं किया जाता है, लेकिन इसे कम डिस्क आईओ के साथ प्राप्त किया जा सकता है।

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

निर्देशिका को स्वयं पता नहीं है कि फ़ाइल कितनी बड़ी है, इसलिए प्रत्येक फ़ाइल के इनकोड को एक्सेस करने की आवश्यकता होती है। कैश्ड मान को हर बार अद्यतित रखने के लिए, फ़ाइल के आकार में कैश्ड मान को अद्यतन करने की आवश्यकता होगी। एक फ़ाइल को 0 या अधिक निर्देशिकाओं में सूचीबद्ध किया जा सकता है, इसके लिए प्रत्येक फ़ाइल की इनकोड की आवश्यकता होगी, यह जानने के लिए कि वह कौन सी निर्देशिकाओं में सूचीबद्ध है। यह बहुत ही इनोड संरचना को जटिल करेगा और IO प्रदर्शन को कम करेगा। जैसे ही डु आपको अलग-अलग ब्लॉक आकार मानकर परिणाम प्राप्त करने की अनुमति देता है, कैश में आवश्यक डेटा को प्रत्येक संभावित ब्लॉक आकार को और धीमा करने के लिए कैश्ड मूल्य को बढ़ाना या घटाना होगा।


7

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

इसके लिए आवश्यक है कि आपका फाइल सिस्टम प्रति-समूह कोटा का समर्थन करे। लिनक्स का एक्सट्रीम [234] और सोलारिस / * बीएसडी / लिनक्स का zfs करते हैं। यह आपके उपयोग के मामले के लिए अच्छा होगा यदि समूह कोटा ACLs को ध्यान में रखते हैं, लेकिन मुझे नहीं लगता कि वे करते हैं।


7

का सामान्य उपयोग duकरके अत्यधिक उपयोग में लाया जा सकता है ncdu

ncdu - NCurses Disk Usage

प्रदर्शन करता है du, परिणामों को कैश करता है और उन्हें एक अच्छी कमांड लाइन गुई में दिखाता है, जो कुछ हद तक तुलनीय है du -hc -d 1 | sort -h। प्रारंभिक अनुक्रमण में उतना ही लंबा समय लगता है du, लेकिन अनमोल स्थान को भरने वाले वास्तविक "अपराधी" की तलाश की जाती है, क्योंकि सभी उपनिर्देशिकाओं के पास प्रारंभ में कैश जानकारी उपलब्ध है।

यदि आवश्यक उपनिर्देशिकाओं को [r] दबाकर ताज़ा किया जा सकता है और फ़ाइलों / फ़ोल्डरों को [d] दबाकर नष्ट किया जा सकता है, दोनों ही सभी मूल निर्देशिका के लिए आँकड़े अद्यतन करते हैं। हटाए जाने की पुष्टि करता है।

यदि नीरस है, तो आगे की गति ncdu -1xo- / | gzip >export.gzएक क्रोनजॉब में प्रशिक्षण प्राप्त करके और बाद में इसके साथ प्राप्त करके प्राप्त की जा सकती है zcat export.gz | ncdu -f-, लेकिन स्पष्ट रूप से सबसे पुरानी जानकारी प्रदान करती है।


7

मैं वृद्ध का उपयोग करना पसंद करता हूं

एजेडू सॉफ्टवेयर का एक टुकड़ा है जो इस अनुमान पर पुरानी और अनियमित रूप से उपयोग की गई फ़ाइलों को खोजने का प्रयास करता है कि ये फाइलें सबसे अधिक वांछित नहीं हैं। (उदाहरण डाउनलोड जो केवल एक बार देखे गए हैं।)

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


4
इस सवाल का जवाब नहीं है, लेकिन अभी भी +1। अच्छी टिप।
0xC0000022L

मैंने प्रश्न को यह स्पष्ट करने के लिए संपादित किया है कि यह वास्तव में प्रश्न का उत्तर देता है (वृध्दि अनुक्रमणिका डिस्क उपयोग के साथ-साथ पहुंच समय)।
एंथनी जी -

5

जैसा कि SHW ने उल्लेख किया है, ageduवास्तव में एक सूचकांक बनाया है। मुझे लगा कि मैं एक इंडेक्स बनाने के लिए एक और तरीका साझा करूंगा, जिसके बारे में पढ़ने के बाद locatedb। आप आउटपुट locatedbसे अपना स्वयं का संस्करण बना सकते हैं du:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkपहले फ़ाइल नाम रखने के लिए डु आउटपुट को फिर से व्यवस्थित frcodeकरता है , ताकि सही काम हो। फिर locateइस डेटाबेस के साथ डिस्क उपयोग को जल्दी से रिपोर्ट करने के लिए उपयोग करें:

locate --database=du.locatedb pingus

अपनी आवश्यकताओं के अनुरूप आप इसका विस्तार कर सकते हैं। मुझे लगता है कि यह स्थित का एक अच्छा उपयोग है।


3
duc

(देखें https://duc.zevv.nl ) वह हो सकता है जो आप ढूंढ रहे हैं।

Duc डिस्क उपयोग को अनुकूलित डेटाबेस में संग्रहीत करता है, जिसके परिणामस्वरूप तेज़ उपयोगकर्ता इंटरफ़ेस होता है। सूचकांक पूरा होने के बाद कोई प्रतीक्षा समय नहीं।

इंडेक्स को अपडेट करना मेरे लिए बहुत तेज है (10 सेकंड से भी कम। 121k निर्देशिकाओं में 2.8k टीबी की लगभग 950k फाइलों के लिए)। एक GUI और एक ncurses UI भी है।

उपयोग उदाहरण:

duc index /usr
duc ui /usr

वेबसाइट से:

ड्यूक को विशाल फाइल सिस्टम के पैमाने पर बनाया गया है: यह समस्याओं के बिना भंडारण के पेटाबाइट्स पर सैकड़ों लाखों फाइलों को अनुक्रमित और प्रदर्शित करेगा।


2

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


मुझे समझ नहीं आ रहा है कि आपका उत्तर प्रश्न से कैसे संबंधित है। updatedbडिस्क उपयोग के बारे में कुछ नहीं कहता है। यदि आप इसे केवल डिस्क को पार करने के लिए कर रहे हैं, तो आप समग्र प्रदर्शन को चोट पहुंचाने वाले हैं।
गिल्स एसओ- बुराई को रोकें '

3
फ़ाइल आकार की गणना duधीमी है क्योंकि आपको डिस्क के चारों ओर बिखरी हुई संभावित बड़ी संख्या में फ़ाइलों के मेटाडेटा तक पहुंचना होगा। अगर आप अपडेटेड आक्रामक रूप से चलाते हैं, तो सभी फ़ाइलों के लिए मेटाडेटा को रैम में संग्रहीत करने के लिए मजबूर किया जाता है। अगली बार जब आप किसी अन्य मेटाडेटा-हैवी ऑपरेशन को चलाते हैं, तो डिस्क के पार हजारों लाइक्स करने के बजाय, आप कैश का उपयोग करते हैं। आम तौर पर आपके पास पेड़ के मेटाडेटा के उस विशेष हिस्से के कैश्ड होने का एक छोटा सा मौका होता है। मेरे 'मेटाडेटा कैश प्राइमिंग' के साथ यह अत्यधिक संभावना है कि जो डेटा आप चाहते हैं वह ताज़ा कैश हो। कोई भौतिक नहीं == फास्ट।
मार्सिन

2

यदि आपको केवल निर्देशिका का आकार जानने की आवश्यकता है, तो आप केवल स्क्रीन पर जानकारी लिखने से बचकर इसे बहुत तेज़ कर सकते हैं। चूँकि ग्रैंड टोटल duकमांड की आखिरी लाइन है , आप बस इसे पाइप कर सकते हैं tail

du -hc | tail -n 1

एक 2GB निर्देशिका संरचना पूरी सूची के लिए एक सेकंड का समय लेती है लेकिन इस फॉर्म के साथ 5 वीं से कम है।


2
मुझे लगता du -hsहै कि इस उद्देश्य के लिए अधिक सुविधाजनक है।
लेप

भी--max-depth 1
स्टीववेला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.