फोर्स डाइरेक्टरी हमेशा कैश में होनी चाहिए


35

मैं अपने संपूर्ण c ++ प्रोजेक्ट को संकलित करने में लगने वाले समय को बेहतर बनाने के लिए विभिन्न तरीकों का परीक्षण कर रहा हूं। वर्तमान में इसमें ~ 5 मिनट का समय लगता है। मैंने डिस्टेक, ccache, और अन्य के साथ प्रयोग किया। हाल ही में, मुझे पता चला कि अगर मैं रैम-ड्राइव पर अपनी पूरी परियोजना की प्रतिलिपि बनाता हूं, और फिर वहां से संकलन करता हूं, तो यह संकलन समय को इसके मूल के 30% तक घटा देता है - सिर्फ 1.5 मिनट।

जाहिर है, रैम ड्राइव से काम करना व्यावहारिक नहीं है। तो, क्या किसी को इस तरह से पता है कि मैं ओएस को हमेशा एक निश्चित निर्देशिका को कैश रखने के लिए मजबूर कर सकता हूं ? मैं अब भी चाहता हूं कि निर्देशिका सामान्य की तरह डिस्क पर वापस सिंक हो जाए, लेकिन मैं हमेशा मेमोरी में डेटा की एक प्रति भी चाहता हूं। क्या यह संभव है?

EDIT: एक संभावित समाधान के रूप में, हमने बस एक डेमॉन लॉन्च करने के बारे में सोचा जो rsyncहर 10 सेकंड में चलता है या रैम ड्राइव के साथ डिस्क ड्राइव को सिंक करने के लिए। फिर हम रैम ड्राइव से संकलन चलाते हैं। rsyncतेज़ है, लेकिन यह वास्तव में काम करेगा? निश्चित रूप से ओएस बेहतर कर सकता है ...।


कैश केवल tmpfs और ext3 / 4 के बीच का अंतर नहीं है; उनके पास जर्नलिंग है, उदाहरण के लिए, जो कि कैशिंग की परवाह किए बिना लिखा जाएगा।
आंद्रे परमेस

1
क्या आप timeअपना संकलन और परिणाम हमारे साथ साझा कर सकते हैं ? यह कुछ विवाद खड़ा करेगा। make clean && /usr/bin/time -v make( timeकमांड में निर्मित बैश का उपयोग न करें )
शेलहोलिक

1
@ शेष क्यों नहीं बनाया गया है?
tshepang

3
@Tshepang timeबिल्ट इन ( help time) में बहुत कम विवरण (कोई क्रिया विकल्प नहीं है) GNU समय की तुलना में ( man time) I / O से संबंधित है, संदर्भ स्विच, ...
शेलहोलिक

जवाबों:


18

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

यह देखने का प्रयास करें कि प्रत्येक मामले में IO क्या कर रहा है। उसके लिए मूल उपकरण है iotop। अन्य उपकरण उपयोगी हो सकते हैं; देख लिनक्स डिस्क आईओ लोड टूटने, फाइल सिस्टम पथ और / या प्रक्रिया के द्वारा? , लिनक्स में कौन सा प्रोग्राम समय के साथ I / O को माप सकता है? , और सर्वर फॉल्ट पर अन्य सूत्र।

यहाँ कुछ परिकल्पनाएँ की जा रही हैं जैसा कि हो सकता है। यदि आप माप लेते हैं, तो कृपया उन्हें दिखाएं ताकि हम इन परिकल्पनाओं की पुष्टि या अवहेलना कर सकें।

  • यदि आपके पास फ़ाइल एक्सेस समय चालू है, तो OS इन एक्सेस समय को लिखने में काफी समय बर्बाद कर सकता है। संकलन के पेड़ के लिए पहुंच का समय बेकार है, इसलिए सुनिश्चित करें कि वे noatimeमाउंट विकल्प के साथ बंद हो गए हैं । आपका tmpfs + rsync समाधान हार्ड डिस्क से कभी नहीं पढ़ता है, इसलिए इसे कभी भी अतिरिक्त समय लिखने के लिए खर्च नहीं करना पड़ता है।
  • यदि लेखन सिंक्रनाइज़ कर रहे हैं , या तो क्योंकि कंपाइलर कॉल करता है sync()या क्योंकि कर्नेल अक्सर अपने आउटपुट बफ़र्स को फ्लश करता है, तो राइट्स को tmpfs की तुलना में हार्ड डिस्क में अधिक समय लगेगा।

मेरी भी यही भावना है। संकलन IO के बजाय सीपीयू गहन है।
फुनेह

हम्म, मैं यहाँ @JaredC की एक टिप्पणी देखना चाहूंगा जो गाइल्स परिकल्पना की पुष्टि या खंडन कर रहा है। 1.5 बनाम 5 मिनट काफी बड़ा अंतर है ...
डैनियल एल्डर

8

लिनक्स डिफ़ॉल्ट रूप से रैम को डिस्क कैश के रूप में उपयोग करता है। एक प्रदर्शन के रूप में, time find /some/dir/containing/a/lot/of/files > /dev/nullदो बार चलाने का प्रयास करें , दूसरी बार बहुत तेज है क्योंकि प्रत्येक डिस्क इनकोड कैश हैं। यहाँ बिंदु यह है कि इस कर्नेल सुविधा का उपयोग कैसे किया जाए और इसे बदलने के अपने प्रयास को रोकें।

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

आपकी समस्या का मेरा हल यह है कि स्वैग को बहुत अधिक बदल दिया जाए (90-95 को 100 नहीं कहना) और कैश लोड करना:

echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

जैसा कि आप यह अनुमान लगाते हैं, आपके पास आपके सभी स्रोत फ़ाइलों और ऑब्जेक्ट फ़ाइलों के साथ-साथ संकलक, शामिल हेडर फाइलें, लिंक किए गए लाइब्रेरी, आपके आईडीई और अन्य उपयोग किए गए कार्यक्रमों को कैश करने के लिए पर्याप्त स्वतंत्र मेमोरी होनी चाहिए।


यह सामान्य रूप से उपयोगी है, लेकिन मैं वास्तव में जो चाहता हूं वह मेरे स्रोत कोड के लिए कम स्वैच्छिकता है, लेकिन बाकी सब कुछ सामान्य स्वैगनेस है। अनिवार्य रूप से, मेरे पास पृष्ठभूमि में बहुत सारा सामान चल रहा है, लेकिन मैं उन्हें 8 जीबी के 6 तक सीमित करना चाहता हूं, जबकि स्रोत कोड के लिए हमेशा अन्य 2 जीबी रखते हैं। मैं मौका नहीं लेना चाहता कि यह बदली जाए ... कभी ... क्योंकि यह गुस्सा है।
JaredC

स्वप्नदोष व्यापक है। वास्तव में यदि आप कुछ और कर रहे हैं और आपकी फाइलें मेमोरी से अनलोड हो जाती हैं, तो आपको इसे दूसरी लाइन के साथ फिर से लोड करना होगा। यदि स्मृति को किसी और चीज के लिए मुक्त किया जाना है, तो आप वास्तव में "मौका नहीं लेना चाहते हैं" यह स्वैप से किया जाना है। BTW, tmpfsएक ही मामले में भी अदला-बदली की जाएगी।
शेलहोलिक

2
व्यक्तिगत रूप से मैं गिर गया एक उच्च स्वप्नदोष कार्यस्थलों पर बुरी तरह से भयानक है। हालाँकि कुछ कार्यों को बड़ी कैश (यानी अधिक कैश की गई फ़ाइलों) द्वारा त्वरित किया जा सकता है, यह एक कीमत पर आता है: आप प्रोग्राम के बीच स्विच करते समय जवाबदेही के संदर्भ में इसके लिए भुगतान करते हैं, जो कि उपयोगकर्ताओं को सिस्टम पर काम करते समय सबसे पहले नोटिस होता है। जब एक अन्य ब्राउज़र के लिए कार्यालय के लिए ब्राउज़र से स्विच मैं ईमेल करने के लिए बस में स्वैप वापस करने के लिए प्रत्येक कार्यक्रम के लिए 1-2 सेकंड प्रतीक्षा किए पालन नहीं कर सकते हैं अपने सभी लिनक्स मशीनों पर मैं आम तौर पर 10 के एक कम मूल्य के swappiness निर्धारित किया है।
fgysin

6

कैश को मजबूर करना ऐसा करने का सही तरीका नहीं है। हार्ड ड्राइव पर स्रोतों को रखने के लिए बेहतर है और उन्हें tmpfs पर संकलित करें। कई बिल्ड सिस्टम, जैसे कि qmake और CMake, आउट-ऑफ-सोर्स बिल्ड का समर्थन करते हैं।


6

inosyncऐसा लगता है जैसे डेमॉन लगता है कि वास्तव में करता है कि आप क्या चाहते आप रैमडिस्क को rsync के लिए जा रहे हैं। हर 10 सेकंड या तो rsyncing के बजाय, यह फ़ाइल बदलने पर rsync के लिए लिनक्स की इनोटिफ़ाइड सुविधा का उपयोग करता है। मुझे यह inosyncपैकेज के रूप में डेबियन रिपॉजिटरी में मिला , या इसका स्रोत http://bb.xnull.de/projects/inosync/ पर उपलब्ध है ।


जो काफी उपयोगी लगता है। मैं इसे देखूंगा और वापस रिपोर्ट करूंगा। धन्यवाद!
JaredC

5

यह चीज मेरे लिए काम करती है अगर मैं कुछ फाइलों या सभी फाइलों को एक निश्चित निर्देशिका में कैश में रखना चाहता हूं।

vmtouch सिर्फ बात करने के लिए लगता है। उदाहरण 5 वहाँ आप क्या जरूरत हो सकती है।

vmtouch -dl /whatever/directory/

मुझे इसे जड़ के रूप में चलाने की आवश्यकता थी sudo


1
यह नई / हटाई गई फ़ाइलों को नहीं देखता है।
वि।

3

पर्याप्त मेमोरी को देखते हुए रैमडिस्क से आपके निर्माण में कोई I / O नहीं है। यह फ़ाइलों को पढ़ने या लिखने वाली किसी भी चीज़ को गति दे सकता है। I / O सबसे धीमे संचालन में से एक है। यहां तक ​​कि अगर आपको बिल्ड के आगे सबकुछ कैश हो जाता है तो भी आपके पास लिखने के लिए I / Os है, हालांकि उनका न्यूनतम प्रभाव होना चाहिए।

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

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

आप एक चालू 2 विभाजन का उपयोग करके कुछ प्रदर्शन प्राप्त कर सकते हैं। आपका स्रोत ext3 / 4 जैसी जर्नल फ़ाइल सिस्टम पर संस्करण नियंत्रण में होना चाहिए।


2

जैसा कि पहले कहा गया है, स्पष्ट तरीका यह है कि सभी निर्देशिका संरचना को पढ़ा जाए और आप जो भी कैश करना चाहते हैं उसकी सामग्री को फाइल करें।

आप इसके उत्पादन की निगरानी के लिए एक स्क्रिप्ट लिखकर इसे स्वचालित कर सकते हैं vmstat 1(अपने ओएस के लिए जो भी समान उपकरण का उपयोग करें) और लिखे और पढ़े गए ब्लॉकों की संख्या का एक योग रखें। एक बार जब राशि आपके चयन की सीमा पार कर जाती है, तो उन सभी फ़ाइलों को पढ़ें जिन्हें आप कैश करना चाहते हैं, राशि को रीसेट करें, फिर vmatat आउटपुट की निगरानी जारी रखें। फ़ाइलों को जल्दी से पढ़ने के लिए: यदि आपके पेड़ में कई फाइलें हैं, find ... -exec catतो इसके बजाय, कोशिश करें find ... -print0 | xargs -0 catया एक कस्टम प्रोग्राम करें जो प्रत्येक फ़ाइल के लिए बिल्ली को निष्पादित नहीं करेगा।

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

मैंने इस स्वचालित पद्धति का सफलतापूर्वक उन प्रणालियों पर उपयोग किया है, जहाँ मुझे हार्ड ड्राइव I / O से बचने के लिए कुछ इंडेक्स फ़ाइल की आवश्यकता होती है जो हमेशा त्वरित हो। मैंने हर फाइल की एक सूची बनाने के लिए स्ट्रेस का भी उपयोग किया है जो कि जब मैं लॉग इन करता हूं तो एक्सेस हो जाता है ताकि मैं फास्ट लॉगिन के लिए कैश में सब कुछ गर्म रख सकूं।

यह सबसे अच्छा संभव समाधान नहीं हो सकता है, लेकिन यह मुझे अच्छी तरह से अनुकूल है।

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