JMX

2009-06-09 8 views
5

मैं वर्तमान में कुल धागा CPU समय निम्नलिखित तरीके से JMX का उपयोग कर हो रही है का उपयोग कर रही धागा CPU समय के कुशल तरीका:JMX

private long calculateTotalThreadCpuTime(ThreadMXBean thread) { 

    long totalTime = 0l; 

    for (ThreadInfo threadInfo : thread.dumpAllThreads(false, false)) 
     totalTime += thread.getThreadCpuTime(threadInfo.getThreadId()); 

    return totalTime; 
} 

ThreadMXBean वास्तव में एक दूरस्थ प्रॉक्सी है के रूप में, प्रदर्शन भयानक है , इस वास्तविक विधि कॉल के लिए सेकंड की परिमाण के क्रम में।

क्या ऐसा करने का कोई तेज़ तरीका है?


अद्यतन: मैं प्रदर्शन की निगरानी के लिए इस का उपयोग कर रहा हूँ। माप 'वॉल घड़ी' समय और जेपीरोफेलर दोनों थे, जो इस विधि में मेरे 85% समय व्यतीत किए गए थे। मेरे पास कुछ अन्य एमएक्सबीन कॉल हैं (रनटाइम, मेमोरी, जीसी), लेकिन वे बहुत सस्ता हैं। सबसे अधिक संभावना है क्योंकि thread.getThreadCpuTime पर प्रत्येक कॉल एक दूरस्थ है।

अपडेट 2: जेपीरोफाइलर स्क्रीनशॉट प्रदर्शन समस्याओं को दिखा रहा है।

alt text

उत्तर

1

अनुकूलन:

एक धागा पूल के अंदर
  • आह्वान getThreadCPUTime, क्योंकि यह नेटवर्क बाध्य हो रहा है;
  • जब भी एक धागा, Thread.STATE.TERMINATED में हो एक मानचित्र में अपना नाम रखने के लिए और अगली बार से क्वेरी को छोड़ पाया जाता है।
0

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

+0

मैं प्रदर्शन निगरानी के लिए इसका उपयोग कर रहा हूं। माप 'वॉल घड़ी' समय और जेपीरोफेलर दोनों थे, जो इस विधि में मेरे 85% समय व्यतीत किए गए थे। मेरे पास कुछ अन्य एमएक्सबीन कॉल हैं (रनटाइम, मेमोरी, जीसी), लेकिन वे बहुत सस्ता हैं। –

3

आप अमानक API का उपयोग करने को तैयार हैं, तो आप com.sun.management.OperatingSystemMXBean को OperatingSystemMXBean डाली और getProcessCpuTime() आह्वान, डेविड रॉबर्ट नाडेयु के ब्लॉग पर Using a Sun internal class to get JVM CPU time में वर्णित के रूप कर सकते हैं।

+0

उत्तर के लिए धन्यवाद। आदर्श नहीं है, लेकिन मैं इसे आज़मा दूंगा। –

2

यह आपकी कॉल की दूरस्थ प्रकृति होना चाहिए जो समस्या है।

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

+0

ठीक है, उसी JVM में यह सस्ता होना चाहिए लेकिन मैं इसे आरएमआई पर कर रहा हूं। –

1

खराब प्रदर्शन का कारण है कि thread.getThreadCpuTime() से प्रत्येक कॉल (एक दूरस्थ प्रॉक्सी के अपने मामले में) सबसे शायद एक RMI/रिमोट JMX कॉल जो ज़ाहिर है, महंगा है, खासकर जब संदेश वास्तव में के माध्यम से भेजा जाता है में परिणाम देगा टीसीपी (और शायद स्थानीयहोस्ट के बाहर भी)। (see JMX 1.4 spec, chapter 7.3)

हालांकि JMX multiple attribute retrieval एक ही बार में परिभाषित करता है यह तुम बाहर में मदद मिलेगी नहीं यहाँ क्योंकि thread.getThreadCpuTime(long) एक JMX विशेषता लेकिन एक दूरस्थ विधि मंगलाचरण नहीं है (और इसके अलावा, ThreadInfo वस्तु जिस पर तरीकों प्रत्येक कॉल द्वारा अलग शुरू हो जाती है)

दुर्भाग्य

, JMX 1।4 spec जैसे कुछ परिभाषित नहीं करता है "एकाधिक ऑब्जेक्ट्स के कई तरीकों का आह्वान करें और अपने रिटर्न वैल्यू को" पर वापस करें। तो इन कॉलों के समवर्ती आमंत्रण (जो समय बचाएगा लेकिन प्रयास को कम नहीं करेगा) के बगल में मुझे यहां किसी भी (संगत) अनुकूलन से अवगत नहीं है।

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

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