2013-02-25 21 views
7

पर चल रहे धागे की अधिकतम संख्या को अनुकूलित करना बस यह सोचने का सबसे अच्छा तरीका क्या है कि एकल-कोर मशीन पर नए धागे बनाने को रोकने के लिए सबसे अच्छा तरीका क्या है जो एक ही प्रोग्राम को थ्रेड के रूप में कई बार चला रहा है?सीपीयू

धागे वेब सामग्री ला रहे हैं और थोड़ा प्रसंस्करण कर रहे हैं, जिसका अर्थ यह है कि थ्रेड समाप्त होने तक प्रत्येक थ्रेड का भार स्थिर नहीं होता है।

मैं एक थ्रेड रखने की सोच रहा हूं जो सीपीयू/रैम लोड पर नज़र रखता है, और अगर लोड एक निश्चित ट्रेसहोल्ड तक पहुंचता है तो थ्रेड बनाने से रोकता है, लेकिन यह सुनिश्चित करने के लिए कि कोई निश्चित थ्रेड गिनती हो गई है, थ्रेड बनाने से रोकें सीपीयू अधिभारित नहीं होता है।

किसी भी प्रतिक्रिया क्या तकनीक वहाँ बाहर हैं पर इस लक्ष्य को हासिल करने के लिए?

बहुत धन्यवाद, व्लादिमीर

+3

मुझे लगता है कि आप सही रास्ते पर हैं। विचार करने की एक बात यह है कि एनआईओ और चयनकर्ताओं का उपयोग करना ताकि आपके धागे हमेशा आईओ के इंतजार के विरोध में व्यस्त रहें।अन्यथा चोटियों और घाटियों के बिना थ्रूपुट को अधिकतम करना मुश्किल होगा। – Gray

+0

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

+0

आप खुद धागे बनाना नहीं चाहते हैं। 'निष्पादक सेवा' का प्रयोग करें, जो 'रननेबल' या 'कॉल करने योग्य' कार्यों के लिए थ्रेड का पुन: उपयोग करता है और नष्ट करने वाले धागे बनाने के ऊपरी हिस्से को कम करता है। –

उत्तर

1

यह मौजूदा प्रक्रिया द्वारा इस्तेमाल किया सीपीयू की निगरानी के द्वारा ऐसा करने के लिए मुश्किल होने जा रहा है। उन संख्याओं को हकीकत में कमी आती है और परिणाम एक बड़ी डिग्री के लिए चोटियों और घाटियों के लिए जा रहा है। समस्या यह है कि आपके धागे को ज्यादातर आईओ द्वारा अवरुद्ध किया जा रहा है और निकट भविष्य में बाइट्स को पढ़ने के लिए उपलब्ध होने का अनुमान लगाने का कोई अच्छा तरीका नहीं है।

उस ने कहा, आप एक निश्चित अधिकतम थ्रेड नंबर पर एक ThreadPoolExecutor के साथ शुरू कर सकते हैं (एक प्रोसेसर के लिए मान लें 4) और फिर प्रत्येक 10 सेकंड या तो लोड औसत की जांच करें। यदि लोड औसत आप जो चाहते हैं उससे नीचे है तो आप setMaximumPoolSize(...) पर अगले 10 सेकंड के लिए इसे बढ़ाने के लिए एक बड़े मूल्य के साथ कॉल कर सकते हैं। आपको अपने आवेदन के प्रदर्शन को सुगम बनाने के लिए प्रत्येक गणना के बीच 30 या अधिक सेकंड मतदान करने की आवश्यकता हो सकती है।

आप सभी धागे के लिए अपने कुल CPU समय पर नज़र रखने के लिए निम्न कोड इस्तेमाल कर सकते हैं। यकीन है कि ऐसा नहीं है कि अगर यह इसके बजाय अपने मकड़ी के लिए CPU स्तर को अधिकतम करने की कोशिश कर के

long total = 0; 
    for (long id : threadMxBean.getAllThreadIds()) { 
     long cpuTime = threadMxBean.getThreadCpuTime(id); 
     if (cpuTime > 0) { 
      total += cpuTime; 
     } 
    } 
    // since is in nano-seconds 
    long currentCpuMillis = total/1000000; 

करने के लिए सबसे अच्छा तरीका है, आप प्रवाह क्षमता को अधिकतम करने की कोशिश कर विचार हो सकता है। समय की एक इकाई प्रति spidered पृष्ठों की संख्या का नमूना ले लो और बढ़ाना होगा या अपनी ExecutorService में धागे की अधिकतम संख्या में कमी जब तक यह अधिकतम है।

विचार करने की एक बात एनआईओ और चयनकर्ताओं का उपयोग करना है ताकि आपके धागे हमेशा आईओ की प्रतीक्षा करने के विरोध में व्यस्त रहें। यहां एक good example tutorial about NIO/Selectors है। आप Pyronet का उपयोग करने पर भी विचार कर सकते हैं जो एनआईओ के आसपास कुछ अच्छी सुविधाएं प्रदान करता है।

+0

मैं सोच रहा था। मैंने 'पायोनेट' पर क्लिक किया और इसमें लगभग 150 डाउनलोड हैं। किसी परियोजना के हिस्से के रूप में कोई व्यक्ति इतनी छोटी उपयोगकर्ता आधार वाली लाइब्रेरी क्यों शामिल करेगा? – Cratylus

+0

इससे पहले कि कोई बदलाव न हो और आप व्हील @ क्रेटिलस को फिर से आविष्कार नहीं करना चाहते हैं। :-) – Gray

1

यदि एसिंक I/O एक अच्छा फिट नहीं है, तो मैं थ्रेड पूल का उपयोग करने पर विचार करता हूं, उदा। ThreadPoolExecutor, तो आपके पास धागे बनाने, नष्ट करने और पुनर्निर्माण करने का ऊपरी भाग नहीं है।

तब मैं बदलाव करने धागे की अधिकतम संख्या सबसे अच्छा प्रदर्शन प्रदान करता है निष्पादन परीक्षण करना होगा।

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

प्रदर्शन परीक्षण के लिए आपको यह सुनिश्चित करना होगा कि आपका परीक्षण दोहराने योग्य है (यानी एक ही इनपुट का उपयोग करना) और वास्तविक इनपुट का प्रतिनिधि जो आपका प्रोग्राम उपयोग करेगा।

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