रिबूट के बाद जारी रखने के लिए पूरी प्रक्रिया को सहेजें


54

मैंने गणित में काफी कठिन समस्या के लिए एक एल्गोरिथ्म विकसित किया है जिसे समाप्त करने के लिए कई महीनों की आवश्यकता है। जैसा कि मेरे पास सीमित संसाधन हैं, मैंने इसे अपने Ubuntu 12.04 (x86) लैपटॉप पर शुरू किया। अब मैं कुछ अपडेट इंस्टॉल करना चाहता हूं और वास्तव में लैपटॉप को पुनरारंभ करें ("कृपया रीबूट करें" संदेश बस कष्टप्रद है)।

क्या रिबूट से परे निरंतरता के लिए इसकी आवंटित मेमोरी सहित पूरी प्रक्रिया को बचाने का कोई तरीका है?

यहां आपको आवश्यक प्रक्रिया के बारे में कुछ जानकारी दी गई है। जरूरत पड़ने पर आगे की जानकारी मांगने के लिए स्वतंत्र महसूस करें।

  • मैंने ./binary > ./somefile &"या" समय ./binary> ./somefile & " कमांड के साथ एक टर्मिनल में प्रक्रिया को बुलाया , मैं वास्तव में याद रख सकता हूं।
  • यह std :: cerr (बहुत बार नहीं) के लिए कुछ डिबग जानकारी मुद्रित कर रहा है।
  • यह वर्तमान में लगभग 600.0 kiB का उपयोग कर रहा है और भले ही इसमें वृद्धि होगी, यह तेजी से बढ़ने की संभावना नहीं है।
  • प्रक्रिया सामान्य प्राथमिकता के साथ चलती है
  • कर्नेल 3.2.0-26-जेनेरिक-पे है, सीपीयू एक एएमडी है, ऑपरेटिंग सिस्टम उबंटू 12.04 x86 है।
  • यह 9 दिन और 14 घंटे से चलता है (इसलिए इसे रद्द करने के लिए बहुत लंबा; ;-))

3
जिज्ञासा से बाहर, आप क्या गणना कर रहे हैं?
विक्टर मेलग्रेन

3
@ user1261166: मैं ब्रांच-कट दृष्टिकोण के साथ टारगेट विजिटिंग प्रॉब्लम (जो ट्रैवलिंग सेल्समैन प्रॉब्लम का विस्तार है) का अध्ययन करता हूं। इस प्रकार मुझे संभव के रूप में कुछ विशेष उच्च-आयामी पॉलीटोप के कई पहलुओं को जानने की आवश्यकता है। असल में, यह एक बड़ी समस्या को बढ़ा रहा है और फिर इसे कम करने के लिए बस थोड़ा सा हल करने की कोशिश कर रहा है।
स्टीफन

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

मैंने कभी भी इस तरह के एक लोकप्रिय प्रश्न को नहीं सोचा था (कम से कम मेरे लिए हर दूसरे प्रश्न की तुलना में अधिक लोकप्रिय तरीका)। चूंकि प्रक्रिया अब समाप्त हो गई है (अप्रत्याशित रूप से, हालांकि एक दुर्घटना के बिना), मैं शीघ्र ही प्रत्येक विधि का प्रयास करूंगा। सभी को धन्यवाद!
स्टीफन

जवाबों:


41

सबसे अच्छा / सरल उपाय यह है कि प्रक्रिया को पुनर्स्थापित करने के लिए फ़ाइल को पुन: उपयोग करने के लिए राज्य को बचाने के लिए अपने प्रोग्राम को बदल दें।

अनुप्रयोग स्नैपशॉट के बारे में विकिपीडिया पृष्ठ के आधार पर कई विकल्प हैं:

  1. इसमें क्रायोपिड भी है लेकिन यह असम्बद्ध प्रतीत होता है।
  2. लिनक्स चेकपॉइंट / पुनरारंभ एक अच्छा विकल्प लगता है लेकिन आपके कर्नेल को CONFIG_CHECKPOINT_RESTOREसक्षम होना चाहिए।
  3. क्रिउ शायद सबसे अद्यतित परियोजना है और शायद आपका सबसे अच्छा शॉट है, लेकिन यह कुछ विशिष्ट कर्नेल विकल्पों पर भी निर्भर करता है जो आपके वितरण ने शायद सेट नहीं किए हैं।

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

भविष्य के बारे में सोचें कि आप अपनी लंबी चलने वाली प्रक्रियाएँ कहाँ से चलाते हैं, उन्हें कैसे परालिश करें और समस्याओं को कैसे निपटाएँ, जैसे कि फुल डिस्क, प्रोसेस की मौत हो जाती है आदि।


20

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

इससे हत्या की आवश्यकता और नौकरी को फिर से शुरू करने का नुकसान होता है। लेकिन अगर यह वास्तव में कई महीनों तक चलने वाला है तो नौ दिनों का अंतर तुच्छ हो जाता है (6 महीनों में 5% वृद्धि)।


संपादित करें: मुझे अभी पता चला है कि उलरिच ने पहले ही अपनी सूची में अनिर्धारित आइटम 4 में इसका उल्लेख किया है।

मैं अब भी आपको एक विकल्प के रूप में इस पर विचार करने के लिए प्रोत्साहित करूंगा, खासकर क्योंकि कोई भी विकल्प एक मजबूत समाधान की तरह नहीं लगता है। प्रत्येक के पास एक कारण है कि वह काम क्यों न करे।

मुझे लगता है कि सबसे अच्छी बात यह है कि उनमें से किसी एक को आज़माना होगा और अगर यह वीएम में काम को फिर से शुरू नहीं करेगा।


15

टूल क्रायोपीआईडी पर एक नज़र डालें

मुख पृष्ठ से: "क्रायोपीआईडी ​​आपको लिनक्स में चल रही प्रक्रिया की स्थिति को कैप्चर करने और इसे एक फ़ाइल में सहेजने की अनुमति देता है। इस फाइल को बाद में प्रक्रिया को फिर से शुरू करने के लिए इस्तेमाल किया जा सकता है, या तो रिबूट के बाद या किसी अन्य मशीन पर भी।"


4
लिनक्स बॉक्स पर चल रहे अजगर स्क्रिप्ट की स्थिति को बचाने के लिए इसका उपयोग करने से पहले इसे फ्रीबीएसडी बॉक्स में ले जाया गया और फिर से शुरू किया। वहाँ कुछ रहस्यमय जादू चल रहा है;)
टिम

मुझे नहीं पता था कि FreeBSD और Linux द्विआधारी-संगत थे; यह कुछ बहुत ही रोचक है जो मैंने अभी सीखा है। लेकिन क्या इसका मतलब है कि उनके पास बिल्कुल समान मेमोरी मॉडल हैं? यह मेरे लिए अविश्वसनीय लगता है कि उनके पास एक ही syscall परंपराएं हैं, एक ही libc (मुझे लगता है कि fbsd glibc का उपयोग करें), asm स्तर पर एक ही सटीक कॉलिंग कन्वेंशन, आदि। असंगतता मुझे लगता है जैसे कि आपने एक macOS प्रक्रिया ली और डंप किया। यह एक विंडोज बॉक्स पर है; यह वास्तव में काफी आश्चर्यजनक है।
बिल्ली

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

1
@ जोहान यह GitHub पर अब उपलब्ध है: github.com/maaziz/cryopid
starbeamrainbowlabs

7

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

यदि प्रक्रिया लंबे समय तक चलने वाली है, तो मशीन को पुनरारंभ करने पर पूरी प्रक्रिया स्थिति को सहेजने में सक्षम होने के नाते यह संभव नहीं है कि यदि प्रक्रिया चल रही है तो यह पूरी तरह से सहायक नहीं है।

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

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

इसके अतिरिक्त, यह देखने में सक्षम होना कि गणना में प्रगति के रूप में डेटा कैसे बदलता है, अपने आप में दिलचस्प हो सकता है!

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