जवाबों:
/dev/shmएक अस्थायी फ़ाइल संग्रहण फ़ाइल सिस्टम है, अर्थात, tmpfs , जो बैकिंग स्टोर के लिए RAM का उपयोग करता है। यह एक साझा मेमोरी कार्यान्वयन के रूप में कार्य कर सकता है जो आईपीसी की सुविधा देता है ।
हाल ही में 2.6 लिनक्स कर्नेल बिल्ड ने रैमडिस्क के रूप में साझा मेमोरी के रूप में / dev / shm की पेशकश करना शुरू कर दिया है, विशेष रूप से एक विश्व-योग्य निर्देशिका के रूप में जो कि / etc / default / default / tmpfs में परिभाषित सीमा के साथ मेमोरी में संग्रहित है। / dev / shm समर्थन कर्नेल कॉन्फिग फ़ाइल के भीतर पूरी तरह से वैकल्पिक है। यह फेडोरा और उबंटू दोनों वितरणों में डिफ़ॉल्ट रूप से शामिल है, जहां यह पल्सेडियो एप्लिकेशन द्वारा सबसे अधिक उपयोग किया जाता है। (महत्व दिया।)
/tmpफाइलसिस्टम पदानुक्रम मानक में परिभाषित अस्थायी फ़ाइलों के लिए स्थान है , जो लगभग सभी यूनिक्स और लिनक्स वितरणों द्वारा पीछा किया जाता है।
चूंकि डिस्क भंडारण की तुलना में रैम काफी तेज है, इसलिए आप प्रदर्शन को बढ़ावा देने के लिए उपयोग/dev/shm/tmp कर सकते हैं , अगर आपकी प्रक्रिया I / O गहन और बड़े पैमाने पर अस्थायी फ़ाइलें है।
अपने सवालों के जवाब देने के लिए: नहीं, आप हमेशा /dev/shmमौजूद होने पर भरोसा नहीं कर सकते , निश्चित रूप से स्मृति के लिए बंधी मशीनों पर नहीं। आपको /tmpतब तक उपयोग करना चाहिए जब तक आपके पास उपयोग करने का एक बहुत अच्छा कारण न हो /dev/shm।
याद रखें कि एक अलग माउंट के बजाय फाइलसिस्टम /tmpका हिस्सा हो सकता है /, और इसलिए आवश्यकतानुसार बढ़ सकता है। का आकार /dev/shmसिस्टम पर अतिरिक्त रैम द्वारा सीमित है, और इसलिए आप इस फाइल सिस्टम पर अंतरिक्ष से बाहर चलने की अधिक संभावना रखते हैं।
/dev/shm। /dev/shmडिस्क (स्वैप) द्वारा समर्थित मेमोरी (tmpfs) है। /var/tmpमेमोरी (डिस्क कैश) डिस्क (ऑन-डिस्क फाइल सिस्टम) द्वारा समर्थित है। व्यवहार में, प्रदर्शन उसी के बारे में है (tmpfs के पास थोड़ी बढ़त है लेकिन बात के लिए पर्याप्त नहीं है)। /tmptmpfs हो सकता है या नहीं, यह इस पर निर्भर करता है कि व्यवस्थापक ने इसे कैसे कॉन्फ़िगर किया है। /dev/shmआपकी स्क्रिप्ट में उपयोग करने का कोई अच्छा कारण नहीं है ।
/tmpतो सामान्य स्थान है ( $TMPDIRओवरराइड के साथ )। /tmpस्वैप, अन्य डिस्क स्थान या कुछ भी नहीं द्वारा समर्थित बनाने का विकल्प व्यवस्थापक का है।
tmpfsसंभावना के अवरोही क्रम में :
┌───────────┬──────────────┬────────────────┐
│ /dev/shm │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp │ can be tmpfs │ FHS 1.0 │
├───────────┼──────────────┼────────────────┤
│ /var/tmp │ never tmpfs │ FHS 1.0 │
└───────────┴──────────────┴────────────────┘
चूँकि आप एक लिनक्स विशिष्ट tmpfs माउंटपॉइंट बनाम एक विशिष्ट रूप से परिभाषित निर्देशिका के बारे में पूछ रहे हैं, जो tmpfs हो सकता है (आपके sysadmin के आधार पर और आपके डिस्ट्रो के लिए क्या डिफ़ॉल्ट है), आपके प्रश्न के दो पहलू हैं, जिन पर अन्य उत्तरों ने अलग से ज़ोर दिया है:
रूढ़िवादी संस्करण ( FHS और आम उपयोग से सम्मेलनों का मिश्रण ):
/tmp।/var/tmpबड़े डेटा के लिए उपयोग करें जो राम में आसानी से फिट नहीं हो सकते हैं।/var/tmpडेटा के लिए उपयोग करें जो रिबूट (कैश की तरह) के पार रखने के लिए फायदेमंद है।/dev/shmकॉलिंग के साइड-इफेक्ट के रूप में उपयोग करें shm_open()। इरादा दर्शकों को बफ़र से बांधा जाता है जो अंतहीन रूप से अधिलेखित होते हैं। तो यह लंबे समय तक रहने वाली फाइलों के लिए है जिनकी सामग्री अस्थिर है और बहुत बड़ी नहीं है।mktempप्रोग्राम TMPDIRपर्यावरण चर का सम्मान करता है।व्यावहारिक संस्करण:
का उपयोग करें /dev/shmजब यह tmpfs का उपयोग करने के लिए महत्वपूर्ण है, /var/tmpजब यह महत्वपूर्ण है कि नहीं /tmp।
fsynctmpfs पर कोई ऑप नहीं है। यह syscall (IO) प्रदर्शन (और यदि आप उस बारे में परवाह करते हैं, तो फ्लैश दीर्घायु) का नंबर एक दुश्मन है, हालांकि अगर आप खुद को tmpfs (या eatmydata) का उपयोग करते हुए पाते हैं) बस fsync को हराने के लिए, तब आप (या श्रृंखला में कोई अन्य डेवलपर) कुछ गलत कर रहे हैं। इसका मतलब है कि भंडारण डिवाइस की ओर लेनदेन आपके उद्देश्य के लिए अनावश्यक रूप से ठीक है - आप प्रदर्शन के लिए कुछ बचत करने वाले को छोड़ने के लिए स्पष्ट रूप से तैयार हैं, क्योंकि अब आप उन सभी को तोड़फोड़ करने के चरम पर चले गए हैं - शायद ही कभी सबसे अच्छा समझौता। इसके अलावा, यह लेन-देन के प्रदर्शन की भूमि में है, जहां एसएसडी होने के कुछ सबसे बड़े लाभ हैं - कोई भी सभ्य एसएसडी इस दुनिया से बाहर प्रदर्शन करने जा रहा है जो कताई डिस्क संभवतः ले सकती है (7200 आरपीएम = 120 हर्ट्ज) , यदि कोई अन्य व्यक्ति इसे एक्सेस नहीं कर रहा है), फ्लैश मेमोरी कार्ड का उल्लेख नहीं करना है, जो इस मीट्रिक पर व्यापक रूप से भिन्न होता है (कम से कम क्योंकि यह अनुक्रमिक प्रदर्शन के साथ एक व्यापार है, जिसे वे द्वारा रेट किया गया है, उदाहरण के लिए एसडी कार्ड क्लास रेटिंग)। इसलिए सावधान रहें,
एक हास्यास्पद कहानी सुनना चाहते हो? मेरा पहला fsyncसबक: मेरे पास एक नौकरी थी जो कभी-कभी बदलते वर्तमान प्रारूप में सकलाइट डेटाबेस के एक समूह को "अपग्रेड" करती थी (जिसे टेस्टकेस के रूप में रखा गया था)। "अपग्रेड" ढांचा स्क्रिप्ट का एक गुच्छा चलाएगा, जिससे एक डेटाबेस को अपग्रेड किया जा सकेगा। बेशक, मैंने अपने डेटाबेस को समानांतर (8 समानांतर में) में अपग्रेड किया, क्योंकि मैं एक शक्तिशाली 8 कोर सीपीयू के साथ धन्य था। लेकिन जैसे-जैसे मुझे पता चला, वहाँ कोई बनता है speedup (बल्कि एक मामूली था हिट ), क्योंकि प्रक्रिया पूरी तरह से आईओ बाध्य किया गया था। प्रफुल्लित करने वाला, एक डेटाबेस में अपग्रेड फ्रेमवर्क को लपेटकर, जिसने प्रत्येक डेटाबेस को कॉपी किया /dev/shm, उसे वहां अपग्रेड किया, और डिस्क पर वापस कॉपी किया वह 100 गुना तेज (अभी भी समानांतर में 8 के साथ) की तरह था। एक बोनस के रूप में, पीसी प्रयोग करने योग्य था डेटाबेस अपग्रेड करते समय भी।
Tmpfs का उचित उपयोग अस्थिर डेटा के अनावश्यक लेखन से बचने के लिए है। प्रभावी रूप से राइटबैक को अक्षम करना , जैसे /proc/sys/vm/dirty_writeback_centisecsएक नियमित फाइलसिस्टम पर अनंत की स्थापना ।
प्रदर्शन के साथ ऐसा करने के लिए बहुत कम है, और यह विफल करना fsync का दुरुपयोग करने की तुलना में बहुत छोटी चिंता है: राइटबैक टाइमआउट यह निर्धारित करता है कि पेजकेस सामग्री के बाद डिस्क सामग्री को कैसे अद्यतन किया जाता है, और 5 सेकंड का डिफ़ॉल्ट कंप्यूटर के लिए एक लंबा समय है। - एक एप्लिकेशन किसी फाइल को पेजचैच में जितनी बार चाहे उतनी बार अधिलेखित कर सकता है, लेकिन डिस्क पर सामग्री केवल 5 सेकंड में एक बार अपडेट की जाती है। जब तक कि एप्लिकेशन इसे fsync के साथ, अर्थात। इस बारे में सोचें कि कोई एप्लिकेशन कितनी बार इस समय में एक छोटी फ़ाइल का उत्पादन कर सकता है, और आप देखते हैं कि हर एक को fsyncing क्यों एक बहुत बड़ी समस्या होगी।
fsyncपाठ्यक्रम के साथ मजबूर न करें ।कोल्ड डाटा रखना । आपको यह सोचकर ललचाया जा सकता है कि स्वैप से बाहर फाइलें परोसना सामान्य फाइलसिस्टम की तरह ही कुशल है, लेकिन इसके कुछ कारण हैं जो यह नहीं है:
mount -t tmpfs "jarno is great" /mnt/jarnoयदि आप चाहें तो आप कर सकते हैं! तीसरा, डिफ़ॉल्ट आकार RAM की आधी राशि है - मुझे यकीन है कि आपके पास 4GiB RAM है।
ठीक है, यहाँ वास्तविकता है।
दोनों tmpfs और एक सामान्य फाइल सिस्टम डिस्क पर एक मेमोरी कैश है।
Tmpfs मेमोरी और स्वेपस्पेस का उपयोग करता है क्योंकि यह बैकिंग स्टोर है जो डिस्क के एक विशिष्ट क्षेत्र का उपयोग करता है, न ही उस आकार में सीमित है जो फाइल सिस्टम हो सकता है, मशीन पर 200 जीबी के टैम्पो को एक जीबी से कम रैम के साथ रखना काफी संभव है यदि आपके पास पर्याप्त स्वेपस्पेस है।
अंतर तब होता है जब डेटा डिस्क पर लिखा जाता है। एक tmpfs के लिए डेटा केवल तब लिखा जाता है जब मेमोरी बहुत अधिक हो जाती है या डेटा के जल्द ही उपयोग में नहीं आने की संभावना होती है। OTOH सबसे सामान्य लिनक्स फाइल सिस्टम को हमेशा डिस्क पर डेटा का अधिक या कम लगातार सेट करने के लिए डिज़ाइन किया जाता है, ताकि यदि उपयोगकर्ता प्लग को खींचता है तो वे सब कुछ नहीं खोते हैं।
व्यक्तिगत रूप से, मुझे ऑपरेटिंग सिस्टम रखने की आदत है, जो क्रैश नहीं करता है और यूपीएस सिस्टम (जैसे: लैपटॉप बैटरी) है, इसलिए मुझे लगता है कि ext2 / 3 फाइल सिस्टम अपने 5-10 सेकंड के चेकपॉइंट अंतराल के साथ बहुत अधिक पागल हैं। Ext4 फाइलसिस्टम 10 मिनट के चेकपॉइंट के साथ बेहतर है, सिवाय इसके कि यह उपयोगकर्ता डेटा को द्वितीय श्रेणी के रूप में मानता है और इसकी सुरक्षा नहीं करता है। (ext3 समान है, लेकिन आप 5 सेकंड के चेकपॉइंट के कारण इसे नोटिस नहीं करते हैं)
यह लगातार चेकपॉइंटिंग का मतलब है कि अनावश्यक डेटा को लगातार डिस्क पर लिखा जा रहा है, यहां तक कि / tmp के लिए भी।
तो इसका परिणाम यह है कि आपको स्वैप स्पेस बनाने की आवश्यकता है, क्योंकि आपको अपने / tmp होने की आवश्यकता है (भले ही आपको स्वैप स्वैप बनाना हो) और उस स्थान का उपयोग आवश्यक आकार के tmpfs को / tmp पर माउंट करने के लिए करें।
कभी उपयोग / देव / शम।
जब तक, आप इसे बहुत छोटी (शायद mmap'd) IPC फ़ाइलों के लिए उपयोग कर रहे हैं और आपको यकीन है कि यह मौजूद है (यह मानक नहीं है) और मशीन में पर्याप्त मेमोरी + स्वैप उपलब्ध है।
अस्थायी फ़ाइलों के लिए / tmp / का उपयोग करें। का उपयोग करें / dev / shm / जब आप साझा मेमोरी चाहते हैं (यानी, फ़ाइलों के माध्यम से संचार)।
आप / tmp / वहाँ होने पर भरोसा कर सकते हैं, लेकिन / dev / shm / एक अपेक्षाकृत हाल ही में लिनक्स है।
1>/dev/null 2>&1। मैं इसे कई हजार बार करूंगा ताकि एक tmpfs अच्छा होगा। हालांकि, अगर मैं उस स्क्रिप्ट को रिलीज़ करें जिस पर मैं tmpfs के लिए भरोसा नहीं कर सकता /tmpक्योंकि मुझे लगता है कि यह आम नहीं है। यदि यह /dev/shmतब के लिए अधिक सामान्य है तो मेरे लिए बेहतर है। लेकिन मैं पोर्टेबिलिटी आदि के बारे में दिशानिर्देशों की तलाश कर रहा हूं
एक और समय जब आपको / dev / shm (Linux 2.6 और इसके बाद के संस्करण के लिए) का उपयोग करना चाहिए, जब आपको एक गारंटीकृत tmpfs फ़ाइल सिस्टम की आवश्यकता होती है क्योंकि आप नहीं जानते कि क्या आप डिस्क पर लिख सकते हैं ।
एक निगरानी प्रणाली जिसे मैं केंद्रीय सर्वर को प्रस्तुत करने के लिए अपनी रिपोर्ट बनाते समय अस्थायी फ़ाइलों को लिखने की आवश्यकता से परिचित हूं। यह व्यवहार में कहीं अधिक संभावना है कि कुछ फ़ाइल सिस्टम को लिखने से रोकेगा (या तो डिस्क स्थान से बाहर है या एक अंतर्निहित RAID विफलता ने सिस्टम को हार्डवेयर रीड-ओनली मोड में धकेल दिया है) लेकिन फिर भी आप अलर्ट करने में सक्षम होंगे इसके बारे में अगर कुछ सर्पिल उपलब्ध स्मृति जैसे कि tmpfs अनुपयोगी होगा (और बॉक्स मृत नहीं होगा) इसके बारे में। इस तरह के मामलों में, एक निगरानी प्रणाली रैम को लिखना पसंद करेगी ताकि संभावित रूप से एक पूर्ण डिस्क या मृत / मरने वाले हार्डवेयर के बारे में अलर्ट भेजने में सक्षम हो।
/ dev / shm का उपयोग साझा वर्चुअल मेमोरी सिस्टम विशिष्ट डिवाइस ड्राइवर और प्रोग्राम के लिए किया जाता है।
यदि आप एक ऐसा प्रोग्राम बना रहे हैं जिसके लिए वर्चुअल मेमोरी हीप की आवश्यकता होती है जिसे वर्चुअल मेमोरी में मैप किया जाना चाहिए। यह दोगुना हो जाता है यदि आपको उस मेमोरी को सुरक्षित रूप से एक्सेस करने में सक्षम होने के लिए कई प्रक्रियाओं या थ्रेड्स की आवश्यकता होती है।
तथ्य यह है कि सिर्फ इसलिए कि ड्राइवर इसके लिए tmpfs के एक विशेष संस्करण का उपयोग करता है, इसका मतलब यह नहीं है कि आपको इसे एक सामान्य tcpsps विभाजन के रूप में उपयोग करना चाहिए। इसके बजाय, आपको अपनी अस्थायी निर्देशिका के लिए बस एक और tmpfs विभाजन बनाना चाहिए।
PERL में, किसी भी मशीन पर 8GB न्यूनतम (सभी चल रहे लिनक्स टकसाल), मुझे लगता है कि मुझे लगता है कि DB_File- आधारित (किसी फ़ाइल में डेटा संरचना) लाखों एल्गोरिदम और देव / / का उपयोग करते हुए लिखते हैं की एक अच्छी आदत है shm
अन्य भाषाओं में, नेटवर्क ट्रांसफर में शुरू होने और रुकने से बचने के लिए, हर जगह टमटम नहीं होने पर (किसी क्लाइंट-सर्वर वातावरण में सर्वर पर स्थित फ़ाइल पर स्थानीय रूप से काम करना), किसी प्रकार की बैच फ़ाइल का उपयोग करके, मैं कॉपी करूँगा संपूर्ण (300-900MB) फ़ाइल एक ही बार में / dev / shm पर, आउटपुट को / dev / shm के साथ चलाएं, परिणाम वापस सर्वर पर लिखें, और / dev / shm से हटाएं
स्वाभाविक रूप से, अगर मेरे पास रैम कम था, तो मैं ऐसा नहीं करूंगा। सामान्यतया, इन-मेमोरी फ़ाइल सिस्टम / dev / shm आपके उपलब्ध रैम के आधे हिस्से के आकार के रूप में पढ़ता है। हालांकि, रैम का साधारण उपयोग निरंतर है। तो आप वास्तव में 2GB या उससे कम वाले डिवाइस पर ऐसा नहीं कर सकते। Paraphrase को hyperbole में बदलने के लिए, RAM में अक्सर ऐसी चीजें होती हैं जो सिस्टम को अच्छी तरह से रिपोर्ट नहीं करती हैं।
/dev/shmमौजूद है तो मैं इसकी जांच करूंगा , अगर यह करता है तो इसका उपयोग करें, या इसमें गिरावट आएगी/tmp। क्या यह अच्छा लगता है?