2010-02-17 32 views
17

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

वहाँ फ़ाइल प्रबंधक कॉन्फ़िगर करने के लिए एक बहुत ही बहुत बड़ी कैश करने के लिए एक रास्ता है, और यहां तक ​​कि कैश करने के लिए लिखते हैं तो वे डिस्क बाद में मारा?

या वहां रैम डिस्क लिखता है के माध्यम से है कि वास्तविक डिस्क के लिए बनाने के लिए एक तरीका है?

+1

सुपरयूसर पर यह पूछने के लिए बेहतर है। – extraneon

+0

इसे सरल रखें:/dev/shm में कार्य करें और समय-समय पर स्थायी संग्रहण में प्रतिलिपि बनाएं। –

उत्तर

22

डिफ़ॉल्ट रूप से, लिनक्स डिस्क तक पहुँचता है कैश करने के लिए मुक्त रैम (लगभग सभी इसके बारे में) का उपयोग करेगा, और लेखन में विलंब होगा। कैशिंग रणनीति का निर्णय लेने के लिए कर्नेल द्वारा उपयोग की जाने वाली हेरिस्टिक्स सही नहीं हैं, लेकिन उन्हें एक विशिष्ट स्थिति में मारना आसान नहीं है। साथ ही, जर्नलिंग फाइल सिस्टम (यानी आजकल सभी डिफ़ॉल्ट फाइल सिस्टम) पर, डिस्क पर वास्तविक लिखने के तरीके को एक तरह से किया जाएगा जो दुर्घटनाओं को लचीला है; यह थोड़ा ओवरहेड का तात्पर्य है। आप फाइल सिस्टम विकल्पों के साथ बेवकूफ बनाने की कोशिश कर सकते हैं। उदाहरण के लिए, ext3 के लिए, data=writeback या यहां तक ​​कि async के साथ बढ़ते प्रयास करें (ये विकल्प क्रैश की ओर कम लचीलापन की कीमत पर फाइल सिस्टम प्रदर्शन में सुधार कर सकते हैं)। साथ ही, फाइल सिस्टम गतिविधि को कम करने के लिए noatime का उपयोग करें।

प्रोग्राम आप भी डिस्क प्रदर्शन करने के लिए चाहते हो सकता है (mmap के साथ) स्मृति मैपिंग के माध्यम से एक्सेस करता है। यह थोड़ा सा हाथ है, लेकिन यह डेटा प्रबंधन और अनुकूलन के बारे में अधिक नियंत्रण देता है।

+3

'नोटाइम' के साथ प्रासंगिक फाइल सिस्टम को बढ़ाना इस मामले के लिए निश्चित रूप से अच्छी सलाह है। – caf

+0

'vmtouch' भी उपयोगी है यदि आप वास्तव में कर्नेल को सामान को कैश रखने के लिए मजबूर करना चाहते हैं (जैसा कि मैं वर्तमान में करता हूं) –

16

क्या आपने जांच की है कि क्या आपके डिस्क उनके अंतर्निहित लेखन कैश का उपयोग कर रहे हैं? यह काफी अंतर कर सकता है। लिनक्स पर, आप hdparm साथ व्यवहार को चालू कर सकते हैं:

/sbin/hdparm -W 0 /dev/hda 0 Disable write caching 
/sbin/hdparm -W 1 /dev/hda 1 Enable write caching 

जाहिर है, अगर लिखने कैशिंग सक्षम किया गया है, तो डेटा हानि या भ्रष्टाचार के लिए संभावित है अगर आपके सिस्टम uncleanly (जैसे बिजली कटौती) बंद हो जाता है।

सॉफ्टवेयर के संदर्भ में, लिनक्स कर्नेल दो मुख्य संख्या का उपयोग करता है लिखने व्यवहार parameterize करने के लिए।

/proc/sys/vm/dirty_ratio 
/proc/sys/vm/dirty_background_ratio 

huge write spikes से बचने के लिए आधुनिक डिफ़ॉल्ट अधिक बार लिखना है। आप अपनी आवश्यकताओं के अनुरूप इन्हें ट्यून करने का प्रयास कर सकते हैं। यहां उपलब्ध पैरामीटर के excellent discussion और आप उन्हें समायोजित करने का प्रयास कैसे कर सकते हैं।

12

आप एक भौतिक विभाजन के साथ एक रैमडिस्क और RAID-1 बना सकते हैं। --write- ज्यादातर और --write-behind विकल्पों को देखें। आप भौतिक डिस्क को बनाने के लिए उन लोगों का उपयोग कर सकते हैं जिन्हें पढ़ा नहीं जाना चाहिए (केवल लिखित), और क्रमशः उत्कृष्ट लेखन कार्यों की संख्या निर्धारित करने के लिए।

वैकल्पिक रूप से, पीडीएफएलश के लिए प्रलेखन देखें। यहां एक अच्छा पृष्ठ है: http://www.westnet.com/~gsmith/content/linux-pdflush.htm (ire_and_curses द्वारा भी लिंक किया गया) जो उल्लेख किया गया है उससे परे, आप शायद स्वैप पर डिस्क कैश का पक्ष लेने के लिए 100 तक स्वैपनेस क्रैंक करना चाहते हैं।

लेकिन यह है कि यह कैसे काम करता है सब जानने के लिए सार्थक होगी, और अपने विशिष्ट अनुप्रयोग के लिए धुन यह। लिनक्स पहले से ही सामान्य मामले के लिए ट्यून किया गया है, और केवल आप ही जानते हैं कि आपकी विशिष्ट स्थिति अलग-अलग कैसे होती है। :)

+3

डैनिसॉयर का अर्थ है 'mdadm''' 'write-most' 'और '--write-behind' विकल्प – mabraham

+0

ध्यान दें कि लिनक्स सॉफ्टवेयर RAID-1 सामान्य शटडाउन में लिखने वाले डिवाइस पर सभी डेटा को दोहराने के लिए प्रतीक्षा नहीं करता है। यह उन क्षेत्रों को सरल करता है जिनके लिए लेखन बिटमैप में सिंकिंग की आवश्यकता होती है और सिस्टम चालू होने पर डेटा कॉपी करना जारी रखने की योजना बनाते हैं। हालांकि, जब यह वापस चालू होता है, तो प्राथमिक RAID डिवाइस चला जाता है या ताजा रैम डिस्क के साथ प्रतिस्थापित किया जाता है। डेटा हानि। –

-4

क्या आपको रैम-आधारित एसएसडी डिस्क की आवश्यकता हो सकती है?

+0

वह डिस्क-आईओ को अनुकूलित करने के लिए अपनी रैम का उपयोग करना चाहता है। एक नया ड्राइव नहीं है। – alfonx

1

यहां सवाल यह है कि आपको वास्तव में कितनी स्थायित्व की आवश्यकता है?

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

एप्लिकेशन निश्चित रूप से fdatasync() और fsync() के साथ एक लिखने के लिए मजबूर कर सकते हैं।

आदेश बेहतर प्रदर्शन प्राप्त करने के लिए आपको कम अक्सर fdatasync कह सकते हैं, उदाहरण के लिए, स्थायित्व का त्याग।