2010-01-17 15 views
8

मैंने एक सी ++ लाइब्रेरी लिखी है जो कुछ गंभीर रूप से भारी CPU काम करता है (यह सब गणित और गणना) और यदि अपने डिवाइस पर छोड़ा गया है, तो आसानी से उपलब्ध सभी CPU संसाधनों का 100% उपभोग करेगा (यह भी संख्या के लिए बहुप्रचारित है मशीन पर उपलब्ध तार्किक कोर)।धागे को धीमा करने का सबसे अच्छा तरीका? नींद का उपयोग कर रहा है() ठीक है?

इस तरह के रूप में, मैं मुख्य गणना पाश अंदर एक कॉलबैक कि सॉफ्टवेयर का उपयोग कर पुस्तकालय कॉल करने के लिए माना जाता है है:

while(true) 
{ 
    //do math here 
    callback(percent_complete); 
} 

कॉलबैक में, ग्राहक नींद (एक्स) धागा धीमा करने के लिए कहता है।

मूल रूप से, क्लाइंटसाइड कोड एक निश्चित नींद (100) कॉल था, लेकिन इससे खराब अविश्वसनीय प्रदर्शन हुआ क्योंकि कुछ मशीनें गणित को दूसरों की तुलना में तेज़ी से खत्म करती हैं, लेकिन नींद सभी मशीनों पर समान होती है। तो अब ग्राहक सिस्टम समय की जांच करता है, और यदि 1 सेकंड से अधिक पास हो गया है (जो == कई पुनरावृत्तियों), तो यह आधे सेकेंड तक सो जाएगा।

क्या यह धागा धीमा करने का एक स्वीकार्य तरीका है? क्या मुझे प्रदर्शन को अधिकतम करने के लिए स्लीप() के बजाय सेमाफोर/म्यूटेक्स का उपयोग करना चाहिए? प्रसंस्करण कार्य के प्रत्येक 1 सेकंड के लिए एक्स मिलीसेकंड सो रहा है या क्या कुछ गलत है जिसे मैं नहीं देख रहा हूं?

कारण मैं पूछता हूं कि मशीन अभी भी भारी हो गई है, भले ही कार्यकर्ता CPU की ~ 10% प्रक्रिया को दिखाता है। मैंने पहले से ही हार्ड डिस्क और मेमोरी विवाद की खोज नहीं की है, इसलिए अब मैं सोच रहा हूं कि जिस तरह से मैं धागे को धीमा कर रहा हूं, इस समस्या का कारण बन रहा है।

धन्यवाद!

उत्तर

2

नींद एक ऐप थ्रॉटलिंग के लिए ठीक होना चाहिए, जो आपकी टिप्पणियों से है जो आप के बाद हैं। शायद आपको और अधिक सटीक होने की आवश्यकता है कि आप कब तक सोते हैं।

एकमात्र सॉफ़्टवेयर जिसमें मैं इस तरह की सुविधा का उपयोग करता हूं वह BOINC client है। मुझे नहीं पता कि यह किस तंत्र का उपयोग करता है, लेकिन यह ओपन-सोर्स और मल्टी-प्लेटफार्म है, इसलिए स्वयं की मदद करें।

इसमें एक कॉन्फ़िगरेशन विकल्प है ("सीपीयू का उपयोग एक्स% तक सीमित करें")। जिस तरह से मैं कार्यान्वित करने की अपेक्षा करता हूं वह प्लेटफार्म-निर्भर एपीआई जैसे clock() या GetSystemTimes() का उपयोग करना है, और समतल दीवार घड़ी के समय प्रोसेसर समय की तुलना करना है। थोड़ा सा वास्तविक काम करें, जांचें कि क्या आप बराबर या नीचे हैं, और यदि आप थोड़ी देर के लिए वापस आना चाहते हैं तो नीचे आना।

बीओआईएनसी क्लाइंट प्राथमिकताओं के साथ अच्छी तरह से खेलता है, और अन्य ऐप्स के लिए 100% अधिकतम CPU पर भी कोई प्रदर्शन समस्या नहीं पैदा करता है। कारण मैं थ्रॉटल का उपयोग करता हूं, अन्यथा, क्लाइंट हर समय सीपीयू फ्लैट-आउट चलाता है, और प्रशंसक की गति और शोर को चलाता है। तो मैं इसे उस स्तर पर चलाता हूं जहां प्रशंसक चुप रहता है। बेहतर शीतलन के साथ शायद मुझे इसकी आवश्यकता नहीं होगी :-)

+0

लिनक्स पर, यदि आप अपनी प्रक्रिया को उच्च स्तर के साथ चलाते हैं, तो ओएस CPU घड़ी को कम रखेगा, मान लें कि आपका हार्डवेयर CPU गति स्केलिंग का समर्थन करता है। यह कृत्रिम थ्रॉटलिंग के बिना बिजली, गर्मी और शोर को कम रखेगा। – karunski

+0

स्वीट। पूरी तरह से लिनक्स पर स्विच करना एक विकल्प है जिसे मैं लगातार मानता हूं और अब तक हमेशा अस्वीकार करता हूं ... –

23

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

+4

प्रैक्टिस में, यह विंडोज पर बहुत विश्वसनीय नहीं है। मैंने पुस्तकालय को ओएस एक्स में पोर्ट किया है और वहां यह कम प्राथमिकता वाले सपने की तरह काम करता है, लेकिन विंडोज़ पर यह अभी भी समस्याएं पैदा करेगा। कुछ और: विपणन/तकनीकी सहायता उद्देश्यों के लिए हमें यह पता चलाना बुरा लगता है कि सॉफ़्टवेयर को कार्यकर्ता में कभी भी 20% से अधिक CPU लेना है, अन्यथा आपको कुछ सॉफ़्टवेयर शिकायतें और अपने सॉफ़्टवेयर की हत्या के बारे में अनजान समीक्षा मिलती है पीसी प्रदर्शन। लोग 50% सीपीयू उपयोग और आतंक देखते हैं! –

+1

मैं नहीं कह सकता कि आपके बंदरगाह ने ऐसा क्यों व्यवहार किया। मेरे अनुभव में शेड्यूलिंग विंडोज पर अच्छी तरह से काम करता है। किसी भी मामले में, सवाल यह है कि मुझे विश्वास है कि प्राथमिकताओं का उपयोग करके इसे ओएस में शेड्यूलिंग छोड़कर सबसे अच्छा हल किया जाता है। –

+11

कंप्यूटर गुरु, थ्रेड प्राथमिकताओं विंडोज पर काफी भरोसेमंद काम करते हैं। हालांकि, अगर आप बहुत सारे I/O कर रहे हैं (इससे कोई फर्क नहीं पड़ता कि यह प्रत्यक्ष है या मेमोरी पेजिंग के कारण है), तो आप अपनी आई/ओ प्राथमिकता को भी कम करना चाहेंगे। SetThreadPriority और THREAD_MODE_BACKGROUND_BEGIN देखें। – avakar

0

cpulimit पर एक नज़र डालें। यह SIGSTOP और SIGCONT भेजता है जैसा कि किसी दिए गए CPU उपयोग प्रतिशत के नीचे प्रक्रिया को रखने के लिए आवश्यक है।

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

संपादित करें: विंडोज़ पर, SuspendThread() और ResumeThread() शायद समान व्यवहार उत्पन्न कर सकते हैं।

0

एक और, इतना विस्तृत नहीं है, विधि एक पुनरावृत्ति के समय हो सकती है और थ्रेड को अगले पुनरावृत्ति से पहले (एक्स * टी) मिलीसेकंड के लिए सोना चाहिए जहां टी एक पुनरावृत्ति के लिए मिलीसेकंद समय है और एक्स चुनिंदा नींद का समय है (0 और 1 के बीच)।

4

सीपीयू के साथ 100% पर क्या गलत है? इससे बचने की कोशिश न करें, आपको यही प्रयास करना चाहिए। ये गणित की गणना महत्वपूर्ण हैं, नहीं? जब तक आप ओएस (एक म्यूटेक्स, डिस्क इत्यादि) द्वारा स्पष्ट रूप से प्रबंधित नहीं किए गए कुछ अन्य संसाधनों को छेड़छाड़ करने से बचने की कोशिश नहीं कर रहे हैं, तो आम तौर पर आपके धागे को धीमा करने की कोशिश करना एक बुरा विचार है। मल्टीकोर सिस्टम (जो लगभग सभी सिस्टम आगे बढ़ेंगे) पर क्या होगा? आप किसी भी कारण से धागे को धीमा कर देंगे।

ओएस में थ्रेड क्वांटम की अवधारणा है। यह सुनिश्चित करने का ख्याल रखेगा कि आपके सिस्टम पर कोई महत्वपूर्ण धागा भूखा नहीं है। और, जैसा कि मैंने उल्लेख किया है, मल्टीकोर सिस्टम पर एक सीपीयू पर एक धागा फैलाने से अन्य कोरों पर अन्य धागे के प्रदर्शन को नुकसान नहीं पहुंचाता है।

मैं यह भी एक और टिप्पणी में देखता हूं कि यह थ्रेड भी बहुत सी डिस्क I/O कर रहा है - ये ऑपरेशन पहले से ही आपके धागे को परिणाम देने की प्रतीक्षा कर रहे हैं, इसलिए नींद कुछ भी नहीं करेगी।

सामान्य में, अगर आप नींद कॉल कर रहे हैं (एक्स), वहाँ कुछ गड़बड़/अपने डिजाइन के साथ आलसी है, और अगर एक्स == 0, आप अपने आप को ताले रहने के लिए खोल रहे हैं (धागा नींद (0 बुला) वास्तव में इसे फिर से निर्धारित किया जा सकता है, इसे एक नोप बनाते हैं)।

+0

शायद थोड़ा सा संदर्भ मदद करेगा: गणित बैकअप प्रोग्राम के लिए दो फ़ाइलों के बीच न्यूनतम अंतर की गणना करना है। ए "इसे सेट करें और इसे भूल जाएं" बैकअप प्रोग्राम को 100% सीपीयू नहीं लेना चाहिए, जबकि एकल-उद्देश्य "फ़ाइल diff" प्रोग्राम होना चाहिए। इसमें इस डिजाइन की कुंजी है :) –

+1

आह, मैं देखता हूं; यही कारण है कि प्रक्रिया और आईओ प्राथमिकताओं का आविष्कार किया गया था। आपको ऐसा करना चाहिए और ओएस शेड्यूलर चीजों का ख्याल रखना चाहिए। नींद छोड़ो –

+3

मुझे लगता है कि कंप्यूटर गुरु कह रहे हैं कि उनके बैकअप प्रोग्राम को 100% सीपीयू नहीं लेना चाहिए, भले ही सिस्टम अन्यथा पूरी तरह से निष्क्रिय हो। * करुनस्की का कहना है कि लिनक्स पर्याप्त रूप से कम प्राथमिकता निर्दिष्ट करके इसे प्राप्त करता है, लेकिन यह नहीं है कि पीओएसईक्स में प्राथमिकता का अर्थ क्या है। प्रक्रियाओं के बीच सापेक्ष प्राथमिकता के बीच एक अंतर है ("अगर यह कुछ महत्वपूर्ण भूखा हो तो यह तेजी से मत करें") और मुझे लगता है कि आप पूर्ण प्राथमिकता कह सकते हैं ("यह तेज़ कभी नहीं करें")। –

संबंधित मुद्दे

 संबंधित मुद्दे