प्रोग्राम को धीरे-धीरे चलाएं


102

क्या लिनक्स में किसी भी OS मापदंडों को बदलकर C ++ प्रोग्राम धीमा चलाने का कोई तरीका है? इस तरह से मैं अनुकरण करना चाहूंगा कि क्या होगा यदि वह विशेष कार्यक्रम वास्तविक धीमी मशीन पर चलने के लिए होता है।

दूसरे शब्दों में, एक तेज मशीन को उस विशेष कार्यक्रम के लिए एक धीमी मशीन के रूप में व्यवहार करना चाहिए।


5
आप 'अच्छा' का उपयोग कर सकते हैं इसे वास्तव में कम प्राथमिकता देने के लिए - एक निश्चित बात नहीं है, लेकिन यह मदद कर सकता है!
जॉन ३१३६

7
प्रोसेसर के साथ घूमने वाले एक अन्य प्रोग्राम के साथ इसे vm के अंदर चलाएं।
थांग

12
niceएक कमांड है जो शेड्यूलिंग प्राथमिकता को कम करता है। भिन्न प्राचीन, अपेक्षाकृत क्रूड। आप शेड्यूलिंग प्राथमिकताओं को देख सकते हैं, लेकिन अगर मशीन अन्य चीजों को करने में व्यस्त नहीं है, तो आप प्रोग्राम अभी भी तेजी से चलाएंगे। तो, यह शायद पर्याप्त रूप से मदद नहीं करेगा।
जोनाथन लेफ़लर

9
आपको यह ध्यान रखना होगा कि कंप्यूटर में किसी भी समय बहुत अधिक चलने वाली प्रक्रियाएं होती हैं, जैसे कि आपका ऐप रन धीमा होना विशेष रूप से उपयोगी नहीं होगा। यदि आप यह देखना चाहते हैं कि आपका ऐप भद्दे हार्डवेयर पर कैसा प्रदर्शन करता है तो आपको कहा जाना चाहिए कि भद्दा हार्डवेयर या अस्थायी रूप से आपके हार्डवेयर की BIOS सेटिंग्स को भद्दा बनाने के लिए इसे बदल देना चाहिए। कुछ BIOS आपको अतिरिक्त कोर को अक्षम करने और सीपीयू को क्लॉक करने देंगे।
माइक ट्रूसोव

23
"टर्बो" बटन को अनप्लग करें!
सॉफ्टडे

जवाबों:


145
  • nice(और / या renice) का उपयोग कर प्राथमिकता कम करें । आप इसे nice()सिस्टम कॉल का उपयोग करके प्रोग्रामेटिक रूप से भी कर सकते हैं । यह प्रति सत्र निष्पादन गति को धीमा नहीं करेगा, लेकिन लिनक्स अनुसूचक को कम (और संभवतः कम) निष्पादन समय फ्रेम आवंटित करेगा, अधिक बार प्रीमेच करेगा, आदि। शेड्यूलिंग पर अधिक विवरण के लिए लिनक्स कर्नेल को समझने की प्रक्रिया निर्धारण (अध्याय 10) देखें। ।
  • आप कर्नेल पर अधिक लोड डालने के लिए टाइमर की बाधित आवृत्ति को बढ़ाना चाह सकते हैं , जिससे सब कुछ धीमा हो जाएगा। इसके लिए कर्नेल पुनर्निर्माण की आवश्यकता होती है।
  • आप CPU फ्रीक्वेंसी स्केलिंग मैकेनिज्म (कर्नेल मॉड्यूल की आवश्यकता होती है) का उपयोग कर सकते हैं और cpufreq-setकमांड का उपयोग करके सीपीयू को नियंत्रित (धीमा, स्पीड अप) कर सकते हैं ।
  • एक अन्य संभावना यह है कि कॉल करने के लिए sched_yield(), जो आपके कार्यक्रम के महत्वपूर्ण भागों के प्रदर्शन में (कोड परिवर्तन की आवश्यकता है) अन्य प्रक्रियाओं के लिए क्वांटम प्राप्त करेगा।
  • आप की तरह आम कार्यों हुक कर सकते हैं malloc(), free(), clock_gettime()का उपयोग कर आदि LD_PRELOAD , और साथ कुछ लाख CPU चक्र को जलाने जैसे कुछ मूर्खतापूर्ण चीजें करते rep; hop;स्मृति बाधाओं आदि यह नीचे पक्का कार्यक्रम धीमी हो जाएगी डालने,। ( इस बात का एक उदाहरण देखें कि इस सामान को कैसे करना है)।
  • जैसा कि @ उल्लिखित है, आप हमेशा एक वर्चुअलाइजेशन सॉफ़्टवेयर में लिनक्स चला सकते हैं जो आपको आवंटित सीपीयू संसाधनों, मेमोरी आदि की मात्रा को सीमित करने की अनुमति देता है।
  • यदि आप वास्तव में चाहते हैं कि आपका कार्यक्रम धीमा हो, तो इसे Valgrind के अंतर्गत चलाएं (आपके एप्लिकेशन में कुछ समस्याओं को खोजने में आपकी मदद कर सकता है जैसे कि मेमोरी लीक, खराब मेमोरी रेफरेंस आदि)।
  • कुछ धीमेपन को आपके बाइनरी को अक्षम ऑप्टिमाइज़ेशन (यानी -O0सक्षम करें और सक्षम करें -DDEBUG) के साथ प्राप्त किया जा सकता है ।
  • आप हमेशा एक पुराने पीसी या एक सस्ते नेटबुक (जैसे एक लैपटॉप प्रति बच्चा , और एक बार जब आप परीक्षण कर रहे हैं एक बच्चे को दान करने के लिए मत भूलना) एक धीमी सीपीयू के साथ खरीद सकते हैं और अपना कार्यक्रम चला सकते हैं।

आशा करता हूँ की ये काम करेगा।


15
+1: सुझावों का विविध सेट, जिनमें से प्रत्येक के लिए बुनियादी आवश्यकताएं शामिल हैं
lxop

4
डिबगिंग प्रतीकों को सक्षम करना ( -ggdb3) बाइनरी के निष्पादन को धीमा नहीं करता है । यह केवल इसे बड़ा बनाता है।
कैफे

11
+1 esp। के लिए, "... एक पुराने पीसी या एक सस्ते नेटबुक खरीदें ..., और एक बच्चे को दान करने के लिए मत भूलना जब आप एक बार परीक्षण कर रहे हैं"
क्रिश

3
क्या आप अपने उत्तर को यह दिखाने के लिए संपादित कर सकते हैं कि विभिन्न प्रकार के 'धीमों' का अनुकरण कैसे करें? धीमे I / O, धीमी सीपीयू, धीमी मेमोरी, मेमोरी थ्रैशिंग, आदि के बीच अंतर है
पैरासाइटजे

3
व्लाद के लिए +1। संभवतः cpufreq करना आसान है, अगर आपके पास समर्थन के साथ सीपीयू और लिनक्स कर्नेल है। इसमें निर्देश स्तर की ग्रैन्युलैरिटी होनी चाहिए। यह शायद नया हार्डवेयर खरीदने के बिना सबसे अच्छा सामान्य उत्तर है; यह एक धीमे नेटवर्क, डिस्क, वीडियो आदि का अनुकरण नहीं करता है, जो दौड़ का कारण भी बन सकता है।
आर्टलेस शोर

36

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

वैकल्पिक रूप से, आप किसी अन्य CPU-linux (arm-none-gnueabi-linux, आदि) को संकलित कर सकते हैं और फिर QEMU को चलाने के लिए उस कोड का अनुवाद कर सकते हैं।

अच्छा सुझाव सरल है और यदि आप इसे किसी अन्य प्रक्रिया जो सीपीयू की खपत होगी के साथ गठबंधन काम कर सकते हैं।

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

आपने यह नहीं कहा कि क्या आपको ग्राफिक्स, फ़ाइल और / या नेटवर्क I / O की आवश्यकता है? क्या आप उस त्रुटि के वर्ग के बारे में कुछ जानते हैं जिसकी आप तलाश कर रहे हैं? क्या यह एक दौड़ की स्थिति है, या ग्राहक साइट पर कोड केवल खराब प्रदर्शन करता है?

संपादित करें: आप अपने कार्यक्रम को शुरू करने और रोकने के लिए STOP और CONT जैसे संकेतों का उपयोग कर सकते हैं । एक डिबगर भी ऐसा कर सकता है। मुद्दा यह है कि कोड पूरी गति से चलता है और फिर बंद हो जाता है। लिनक्स अनुसूचक के साथ अधिकांश समाधानों में यह समस्या होगी। इंटेल एफ़ेयर से थ्रेड एनालाइज़र का कुछ प्रकार था। मुझे Vtune रिलीज़ नोट्स दिखाई देते हैं । यह Vtune है, लेकिन मुझे पूरा यकीन था कि थ्रेड रेस का विश्लेषण करने के लिए एक और उपकरण है। देखें: इंटेल थ्रेड चेकर , जो थ्रेड रेस की कुछ शर्तों के लिए जाँच कर सकता है। लेकिन हमें नहीं पता कि ऐप मल्टी-थ्रेडेड है या नहीं?


1
और bochs पुराना और धीमा सीपीयू एमुलेटर (केवल x86) है।
ऑस्कैक्स

22

उपयोग करें cpulimit:

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

प्रयुक्त सीपीयू राशि का नियंत्रण SIGSTOP और SIGCONT POSIX संकेतों को प्रक्रियाओं को भेजने के लिए किया जाता है।

सभी बच्चे प्रक्रियाएं और निर्दिष्ट प्रक्रिया के धागे सीपीयू के समान प्रतिशत को साझा करेंगे।

यह उबंटू के रिपोज में है। केवल

apt-get install cpulimit

यहां पहले से चल रहे प्रोग्राम पर इसका उपयोग करने के कुछ उदाहरण दिए गए हैं:

40% CPU के लिए निष्पादन योग्य नाम द्वारा प्रक्रिया 'बिग्लूप' को सीमित करें:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

PID द्वारा 55% CPU तक एक प्रक्रिया सीमित करें:

cpulimit --pid 2960 --limit 55

मैंने अभी तक cpulimit का परीक्षण नहीं किया है, लेकिन ऐसा लगता है कि SE साइटों पर समान प्रश्नों के सर्वश्रेष्ठ उत्तर हैं। क्या cpulimit द्वारा लगाई गई सीमाओं और धीमी हार्डवेयर पर चलने वाले प्रोग्राम के बीच कोई उल्लेखनीय अंतर है? मेरा लक्ष्य यह सुनिश्चित करने के लिए ऐप का परीक्षण करना है कि ऐप धीमी मशीनों पर पर्याप्त रूप से उत्तरदायी है (और धीमी मशीनों के लिए ग्राफिक्स नीचे ट्यून करने के लिए)।
trusktr

@trusktr जो वास्तव में उस कार्यक्रम पर बहुत निर्भर करता है। पुराने हार्डवेयर के साथ मैं डिस्क गति और उपलब्ध मेमोरी (रैम) के प्रदर्शन को भी प्रभावित कर सकता हूं, और ग्राफिक्स, जीपीयू के बारे में भी। और भी हो सकते हैं। यदि CPU वास्तव में अड़चन है, तो cpulimit शायद अभी भी कोशिश करने लायक है। (यह जवाब 7 साल पुराना है, और वापस तो इस तरह के प्रदर्शन हिट मेरे दिमाग के शीर्ष के आसपास कहीं भी नहीं थे)
इज़कटा

दिलचस्प। आप सही हैं, मैंने HDD या GPU पर विचार नहीं किया। मुझे लगता है कि वास्तविक धीमी हार्डवेयर के साथ परीक्षण करना सबसे अच्छा तरीका है, लेकिन इस समय मेरे पास केवल एक शक्तिशाली कार्य केंद्र है, हालांकि मैं लो-एंड फोन (JS + WebGL ऐप) के लिए भी प्रकाशित करना चाहता हूं।
trusktr

13
  1. एक पुराना कंप्यूटर लें
  2. VPS होस्टिंग पैकेज धीरे-धीरे चलने लगते हैं, बहुत सारे व्यवधान होते हैं, और बेतहाशा भिन्नताएं होती हैं। सस्ता तुम जाओ हार्डवेयर बदतर हो जाएगा। वास्तव में पुराने हार्डवेयर के विपरीत, एक अच्छा मौका है कि वे निर्देश सेट (SSE4) शामिल होंगे जो आमतौर पर पुराने हार्डवेयर पर नहीं पाए जाते हैं। कभी नहीं, यदि आप एक ऐसी प्रणाली चाहते हैं जो धीरे-धीरे चले और अक्सर बंद हो जाए, तो एक सस्ता वीपीएस होस्ट सबसे तेज शुरुआत होगी।

3

यदि आप वास्तव में धीमी मशीन पर उसके व्यवहार का विश्लेषण करने के लिए अपने कार्यक्रम का अनुकरण करना चाहते हैं, तो आप अपने पूरे कार्यक्रम को threadकिसी अन्य मुख्य कार्यक्रम के रूप में चलाने की कोशिश कर सकते हैं ।

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


2

नींद का उपयोग करें या अपने कोड के अंदर प्रतीक्षा करें। यह अलग-अलग गति वाले सभी प्रकार के कंप्यूटर में करने का सबसे उज्ज्वल तरीका नहीं है लेकिन स्वीकार्य है।


2

इसे करने का सबसे सरल संभव तरीका यह होगा कि आप अपने मुख्य रन योग्य कोड को थोड़ी देर के लूप में सोते हुए अंत में लपेट दें।

उदाहरण के लिए:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

जैसा कि लोग उल्लेख करेंगे, यह सबसे सटीक तरीका नहीं है, क्योंकि आपका तर्क कोड अभी भी सामान्य गति से चलेगा, लेकिन रनों के बीच विलंब के साथ। साथ ही, यह मानता है कि आपका लॉजिक कोड एक ऐसी चीज है जो लूप में चलती है।

लेकिन यह सरल और विन्यास दोनों है।

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