लिनक्स पर रैम में कैशिंग / प्रीलोडिंग फाइलें


74

मेरे पास एक पुराना सर्वर है जिसमें 4GB RAM है और यह पूरे दिन एक ही फाइल को परोस रहा है, लेकिन यह हार्ड ड्राइव से ऐसा कर रहा है जबकि 3GB RAM "फ्री" है।

जिस किसी ने भी कभी राम-ड्राइव चलाने की कोशिश की है वह देख सकता है कि यह गति के मामले में कमाल है। इस प्रणाली का मेमोरी उपयोग आमतौर पर 1GB / 4GB से अधिक कभी नहीं होता है इसलिए मैं जानना चाहता हूं कि क्या किसी अच्छी चीज के लिए उस अतिरिक्त मेमोरी का उपयोग करने का कोई तरीका है।

  • क्या रैम से बाहर कुछ फ़ाइलों की सेवा करने के लिए फाइलसिस्टम को बताना संभव है?
  • क्या रैम के उपयोग से फाइल रीडिंग क्षमताओं को बेहतर बनाने के लिए मैं कोई और तरीका अपना सकता हूं?

विशेष रूप से, मैं यहां 'हैक' की तलाश में नहीं हूं। मैं चाहता हूँ कि फ़ाइल सिस्टम कॉल रैम से फ़ाइलों की सेवा करने के लिए बिना रैम-ड्राइव बनाने के लिए और फ़ाइलों को मैन्युअल रूप से कॉपी करने की आवश्यकता हो। या कम से कम एक स्क्रिप्ट जो मेरे लिए ऐसा करती है।

संभावित आवेदन यहाँ हैं:

  • स्थिर फ़ाइलों के साथ वेब सर्वर, जो बहुत पढ़े जाते हैं
  • बड़े पुस्तकालयों के साथ अनुप्रयोग सर्वर
  • बहुत अधिक रैम वाले डेस्कटॉप कंप्यूटर

कोई विचार?

संपादित करें:

  • यह बहुत जानकारीपूर्ण पाया: लिनक्स पेज कैश और पीडीफ्लश
  • जैसा कि ज़ैन ने बताया, स्मृति वास्तव में मुफ्त नहीं है। मेरा मतलब है कि इसका उपयोग अनुप्रयोगों द्वारा नहीं किया जा रहा है और मैं यह नियंत्रित करना चाहता हूं कि मेमोरी में क्या कैश होना चाहिए।

1
मैं भी इन पंक्तियों के साथ कुछ चाह रहा हूँ। मुझे नहीं लगता कि सामान्य फाइलसिस्टम डिस्क ब्लॉक कैशिंग का जवाब है। मान लीजिए कि मैं चाहता हूं कि डिस्क ब्लॉक X को हमेशा कैश किया जाए। कुछ इसे एक्सेस करता है, और कर्नेल इसे कैश करता है। अब तक बहुत अच्छा है, लेकिन अगली प्रक्रिया ब्लॉक वाई चाहती है, इसलिए कर्नेल मेरे ब्लॉक एक्स को हटा देता है और इसके बजाय वाई को कैश करता है। अगली प्रक्रिया जो एक्स चाहती है उसे डिस्क से आने के लिए इंतजार करना होगा; यही मैं बचना चाहता हूं। मुझे क्या चाहिए (और मुझे लगता है कि मूल पोस्टर बहुत बाद में है) एक फाइल सिस्टम पर एक राइट-थ्रू कैश ओवरले करना है जो फ़ाइलों की गारंटी देगा

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

आप कहते हैं कि आप एक हैक की तलाश में नहीं हैं, लेकिन लिनक्स पहले से ही वही करता है जो आप डिफ़ॉल्ट रूप से करना चाहते हैं। निम्नलिखित समीकरण: "पूरे दिन एक ही फाइल को परोसना" + परिभाषा से फाइल को हमेशा RAM के बाहर कुछ फाइलों को "हैक" के बराबर करने के लिए फाइलसिस्टम को बताता है। क्या आपने वास्तव में किसी प्रदर्शन में सुधार देखा है? मेरे अनुभव से, लिनक्स कैश आपके फाइल सिस्टम से बाहर bejeezus है।
माइक एस

2
स्पष्टीकरण के लिए, लिनक्स कैश फ़ाइलों को करता है, लेकिन मेटाडेटा प्रत्येक अनुरोध के लिए प्रत्येक फ़ाइल के लिए मान्य है। कताई जंग पर, बहुत सारी छोटी फ़ाइलों के साथ एक व्यस्त वेब सर्वर पर, जो अभी भी IO विवाद का कारण बन सकता है और समय से पहले ड्राइव को खत्म कर सकता है। स्टेटिक कंटेंट और स्क्रिप्ट्स को rsync / dev / shm या कस्टम tmpfs ऐप स्टार्टअप पर माउंट किया जा सकता है। मैं कुछ दशकों के लिए किया है और मेरे ड्राइव समय से पहले नहीं पहनते हैं। इसके अलावा मेरी साइटें इस तरह से भारी फटने का सामना करती हैं। यह सबसे महंगे उद्यम हार्डवेयर से कमोडिटी हार्डवेयर तक किसी भी चीज़ पर मदद करता है।
आरोन

जवाबों:


57

vmtouch जॉब के लिए एक अच्छे टूल की तरह लगता है।

मुख्य विशेषताएं:

  • क्वेरी कितनी निर्देशिका में कैश की गई है
  • क्वेरी फ़ाइल का कितना कैश है (यह भी कि कौन से पृष्ठ, चित्रमय प्रतिनिधित्व)
  • फ़ाइल को कैश में लोड करें
  • कैश से फ़ाइल निकालें
  • कैश में फ़ाइलें लॉक करें
  • डेमन के रूप में चलाएं

vmtouch मैनुअल

EDIT: प्रश्न में पूछे गए उपयोग को vmtouch होमपेज पर उदाहरण 5 में सूचीबद्ध किया गया है

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: जैसा कि टिप्पणियों में कहा गया है, अब एक गिट रिपॉजिटरी उपलब्ध है।


5
भविष्य के दर्शकों के लिए, लिंक किए गए पृष्ठ पर दिए गए निर्देशों का पालन करने के बजाय vmtouch git रिपॉजिटरी का उपयोग करने का प्रयास करें । इस तरह से आपको मेकफाइल मिलता है और आप अपडेट खींच सकते हैं।
रैंडम

लगता है कि फ़ाइल (4GB) के आकार की सीमा है। क्या कोई और विकल्प है?
एलिक्स एक्सल

ठीक है, यहाँ मेरा वास्तविक उपयोग मामला है: एक पुराने एसडी कार्ड के साथ एक आरपी 1, कहीं बाहर स्टफ कर रहा है। इससे पहले कि मैं वहां एक यात्रा करूं और कार्ड को बदल दूं (और संभवतः बिजली की आपूर्ति), मैं चाहता हूं कि ओएस कार्ड को संयम से छूए, अधिमानतः कभी नहीं। एफएस कैश अच्छा है लेकिन मेरे नियंत्रण से परे है; / बिन और / sbin पहले से ही tmpfs पर हैं, घर / उपयोगकर्ता को इसी तरह अन्य कमियां हैं। vmtouchइस आला अच्छी तरह से फिट बैठता है।
पिस्कवर

vmtouch tmpfs से अलग कैसे काम करता है?
एडवर्ड टोरवाल्ड्स

26

यह vmtouch वर्चुअल मेमोरी टचर उपयोगिता का उपयोग करके भी संभव है ।

उपकरण आपको लिनक्स सिस्टम पर फाइल सिस्टम कैश को नियंत्रित करने की अनुमति देता है। आप वीएम कैश सबसिस्टम में किसी विशिष्ट फ़ाइल या निर्देशिका को बाध्य या लॉक कर सकते हैं, या यह देखने के लिए उपयोग कर सकते हैं कि वीएम के भीतर फ़ाइल / निर्देशिका के क्या हिस्से निहित हैं।

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

या ...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
यह एक महान उपयोगिता है और यह वही करता है जो ओपी ने अनुरोध किया था। यदि केवल वह इसे उत्तर के रूप में स्वीकार करता।
laebshade

क्या आप जानते हैं कि क्या यह ZFS के साथ काम करता है?
CMCDragonkai

1
@CMCDragonkai मुझे नहीं लगता कि ZFS के साथ यह जरूरी है ... सोचो: ARC और L2ARC
ewwhite

22

फाइलसिस्टम कैशे में सामान रखने के लिए एक गरीब आदमी की चाल बस इसे कैट करना है और इसे रीडायरेक्ट करना है कि / dev / null है।


1
इस बात से सहमत। और अगर आप यह सुनिश्चित करना चाहते हैं कि कुछ फाइलें कैश की गई हैं, तो एक क्रॉन जॉब करें जो catफाइल को समय
जोश

18

लिनक्स जितनी मेमोरी में है उतनी डिस्क IO को कैश कर देगा। यह वही है जो कैश और बफर मेमोरी आँकड़े हैं। यह सही चीजों को स्टोर करने की तुलना में शायद आप बेहतर काम करेंगे।

हालाँकि, यदि आप अपने डेटा को मेमोरी में स्टोर करने के लिए जोर देते हैं, तो आप या तो tmpfs या ramfs का उपयोग करके रैम ड्राइव बना सकते हैं। अंतर यह है कि ramfs आपके द्वारा मांगी गई सभी मेमोरी को आवंटित करेगा, क्योंकि tmpfs केवल उस मेमोरी का उपयोग करेगा जो आपके ब्लॉक डिवाइस का उपयोग कर रही है। मेरी स्मृति थोड़ी कठोर है, लेकिन आपको ऐसा करने में सक्षम होना चाहिए:

 # mount -t ramfs ram /mnt/ram 

या

 # mount -t tmpfs tmp /mnt/tmp

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


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

3
आप "टैग" फ़ाइलों को एक्सेस करके कैश किया जा सकता है।
Womble

9
यदि केवल सबसे अधिक इस्तेमाल की जाने वाली फ़ाइलों को स्वचालित रूप से टैग करने का कोई तरीका था।
डेविड पशले

4
Blimey, व्यंग्य अच्छी तरह से यात्रा नहीं करता है :)
डेविड पशले

2
हाँ धन्यवाद। मैं IO कैशिंग की अवधारणा को समझता हूं। मैंने अपने उत्तर में भी इसे समझाया। लगता है कि आपने सूक्ष्म टिप्पणी नहीं पढ़ी कि यह व्यंग्य था।
डेविड पशले

18

2.6 कर्नेल स्वैपिंग और पेज-कैशिंग सुविधाओं पर कुछ व्यापक पढ़ने के बाद मुझे 'fcoretools' मिला। जिसमें दो उपकरण होते हैं;

  • fincore: यह बताएगा कि कोर मेमोरी में एप्लिकेशन ने कितने पेज स्टोर किए हैं
  • fadvise: आपको कोर मेमोरी (पेज-कैश) में हेरफेर करने की अनुमति देता है।

(मामले में किसी और को यह दिलचस्प लगे तो मैं इसे यहाँ पोस्ट कर रहा हूँ)


1
मुझे लगा कि कहीं ऐसा करने का कार्यक्रम है। +1
ब्रैड गिल्बर्ट

7

दो कर्नेल सेटिंग्स हैं जो अन्य उपकरणों का उपयोग किए बिना भी काफी मदद कर सकती हैं:

swappiness

लिनक्स कर्नेल बताता है कि स्वैप का उपयोग कितनी आक्रामक तरीके से करना चाहिए। विकिपीडिया लेख का हवाला देते हुए:

Swappiness लिनक्स कर्नेल के लिए एक संपत्ति है जो रनटाइम मेमोरी को स्वैप करने के बीच संतुलन को बदलता है, जैसा कि सिस्टम पेज कैश से पृष्ठों को छोड़ने के विपरीत है। स्वप्नदोष को 0 और 100 के बीच के मानों में सेट किया जा सकता है। कम मान का मतलब है कि कर्नेल स्वैपिंग से बचने की कोशिश करेगा जहां संभव है कि उच्च मूल्य बदले में कर्नेल आक्रामक रूप से स्वैप स्थान का उपयोग करने का प्रयास करेगा। डिफ़ॉल्ट मान 60 है, और अधिकांश डेस्कटॉप सिस्टम के लिए, इसे 100 पर सेट करना समग्र प्रदर्शन को प्रभावित कर सकता है, जबकि इसे कम (यहां तक ​​कि 0) सेट करने से अन्तरक्रियाशीलता में सुधार हो सकता है (प्रतिक्रिया विलंबता कम हो सकती है।)

vfs_cache_pressure

Vm.txt से उद्धरण :

कर्नेल की प्रवृत्ति को नियंत्रित करने के लिए मेमोरी को पुनः प्राप्त करने के लिए उपयोग किया जाता है जो निर्देशिका और इनोड ऑब्जेक्ट्स के कैशिंग के लिए उपयोग किया जाता है।

Vfs_cache_pressure = 100 के डिफ़ॉल्ट मान पर, कर्नेल पेजशेक और स्वैचेचे पुनः प्राप्त करने के संबंध में "निष्पक्ष" दर पर दांत और इनोड को पुनः प्राप्त करने का प्रयास करेगा। घटते vfs_cache_pressure कर्नेल को दांते और इनोड कैश को बनाए रखना पसंद करते हैं। ...


swappinessउच्च (जैसे 100) सेट करके , कर्नेल सब कुछ चलता है जिसे स्वैप करने की आवश्यकता नहीं होती है, कैशिंग फ़ाइलों के लिए रैम को मुक्त करना। और vfs_cache_pressureकम सेट करके (चलो 50 से कहते हैं, 0 के लिए नहीं!), यह रैम में एप्लिकेशन डेटा रखने के बजाय कैशिंग फ़ाइलों का पक्ष लेगा।

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


3

मुझे बहुत संदेह है कि यह वास्तव में 3 जीबी रैम के साथ डिस्क से फाइलें सेवा कर रहा है। लिनक्स फ़ाइल कैशिंग बहुत अच्छा है।

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


ठीक है, मैं बस नियंत्रित करना चाहता हूं कि क्या कैश किया जा रहा है।
एंड्रियाइड

3

यदि आपके पास बहुत सारी मेमोरी है तो आप बस उन फाइलों में पढ़ सकते हैं जिन्हें आप कैट या इसी तरह कैश करना चाहते हैं। लिनक्स इसे फिर से रखने का अच्छा काम करेगा।



0

विभिन्न रम्फ सिस्टम हैं जिनका आप उपयोग कर सकते हैं (उदाहरण के लिए, रैम्फ, टैम्पफ्स), लेकिन सामान्य तौर पर यदि फाइलों को वास्तव में पढ़ा जा रहा है, तो वे आपके फाइलसिस्टम कैश में बैठते हैं। यदि आपकी फाइलों का वर्किंग सेट आपके फ्री रैम से बड़ा है, तो इससे फाइलें साफ हो जाएंगी - लेकिन अगर आपका वर्किंग सेट आपके फ्री रैम से बड़ा है, तो कोई तरीका नहीं है कि आप इसे रामडिस्क में फिट कर सकें।

शेल में "नि: शुल्क" कमांड के आउटपुट की जांच करें - "कैश्ड" के तहत अंतिम कॉलम में मूल्य, यह है कि फाइल सिस्टम कैश के लिए आपके फ्री रैम का कितना उपयोग किया जा रहा है।


0

अपने बाद के प्रश्न के लिए, सुनिश्चित करें कि आपका RAM विभिन्न मेमोरी चैनलों पर बैठा है ताकि प्रोसेसर समानांतर में डेटा प्राप्त कर सके।


0

मुझे लगता है कि यह आवेदन स्तर पर बेहतर हल हो सकता है। उदाहरण के लिए, संभवतः इसके लिए विशेष वेब सर्वर हैं, या आप Apache के साथ mod_cache पर विचार कर सकते हैं । यदि आपके पास एक विशिष्ट लक्ष्य है, जैसे कि वेब सामग्री को तेज़ी से परोसना, तो आप सुधार कर सकते हैं इस तरह की चीज़ जो मुझे लगता है।

लेकिन आपका सवाल प्रकृति में सामान्य है, लिनक्स मेमोरी सबसिस्टम रैम का सबसे अच्छा सामान्य उपयोग प्रदान करने के लिए डिज़ाइन किया गया है। यदि आप कुछ प्रकार के प्रदर्शन को लक्षित करना चाहते हैं, तो / proc / sys / vm में सब कुछ देखने पर विचार करें।

Fcoretools पैकेज दिलचस्प है, मुझे इसके आवेदन के बारे में किसी भी लेख में दिलचस्पी होगी ... यह लिंक किसी एप्लिकेशन में उपयोग किए जाने वाले वास्तविक सिस्टम कॉल के बारे में बताता है।


1
find / var / lib / mysql | xargs fadvise -willneed (गंदा, लेकिन इसे डेटाबेस फ़ाइलों तक तेज़ी से पहुँच प्रदान करनी चाहिए; उदाहरण के लिए)
Andrioid

। बहुत अच्छा हैक, लेकिन इस तरह हैक एक बहुत mysql से fsyncs इंतजार कर के निष्क्रिय नहीं होती :( fsyncs एसिड सुनिश्चित करने के लिए (Atomicity, संगतता, अलगाव, टिकाऊपन) की जरूरत है
osgx

0

डेस्कटॉप कंप्यूटर (जैसे। ubuntu) बूट पर मेमोरी के लिए पहले से ही प्रीलोडिंग फाइल (कम से कम, लोकप्रिय साझा लाइब्रेरी) का उपयोग करता है। इसका उपयोग FF, OO, KDE और GNOME जैसे विभिन्न ब्लॉगरवेयर के बूटिंग और स्टार्टअप समय को गति देने के लिए किया जाता है (विकास ब्लोट-मेलर के साथ)।

उपकरण का नाम रीडहेड http://packages.ubuntu.com/dapper/admin/readahead रखा गया है

इसके अलावा syscall भी है: readahead (2) http://linux.die.net/man/2/readahead

डेमन को प्रीलोड करने की भी परियोजना है: http://linux.die.net/man/8/preload


0

http://www.coker.com.au/memlockd/ ऐसा करता है

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


0

मैंने अभी dd कोशिश की है अगर = / dev / yourrootpartition of = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

यह मुझे वह नियंत्रण नहीं देता है जो आप चाहते हैं लेकिन यह कम से कम व्यर्थ स्मृति का उपयोग करने की कोशिश करता है


0

मैं / -नाम stringofrandomcharacter का उपयोग करें यह बहुत मदद करता है


0

जैसा पूछा गया था वैसा नहीं, लेकिन मैं उपयोग करता हूं

BASE_DIRECTORY -type f -exec cat {}> / dev / null \; खोजें

एक स्नैपशॉट से बनाई गई AWS वॉल्यूम में फ़ाइलों के आरंभ को ट्रिगर करने के लिए। यदि आप कुछ फ़ाइलों को पढ़ना चाहते हैं तो यह dd का उपयोग करने की आधिकारिक अनुशंसा से अधिक केंद्रित है।


-1

कभी-कभी मैं एक निश्चित फ़ोल्डर और उसके सबफ़ोल्डर में फ़ाइलों को कैश करना चाह सकता हूं। मैं सिर्फ इस फ़ोल्डर में जाता हूं और निम्नलिखित कार्य करता हूं:

खोजो। -exec cp {} / dev / null \;

और उन फाइलों को कैश किया जाता है

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