2012-10-19 18 views
5

हाल ही में हमने वाईजेपी 11.0.9 का उपयोग करके हमारे आवेदन (एक एक्सएमपीपी आधारित चैट सर्वर) का परीक्षण शुरू कर दिया। हमारे परीक्षण के दौरान हमने अजीब व्यवहार के बाद देखा।पार्क/अनपर्क में 60% CPU उपयोग क्यों है?

  1. नमूनाकरण sun.misc.Unsafe.unpark (ऑब्जेक्ट) ने 60% सीपीयू लिया।
  2. उसी ऐप के लिए ट्रेसिंग से पता चलता है कि LockSupport.park (ऑब्जेक्ट) ने 52% CPU लिया।

मैंने परिणामों की पुष्टि करने के लिए कई परीक्षण किए और हर बार मुझे इसी तरह के परिणाम मिलते हैं।

मुझे समझ में नहीं आता कि क्यों अनपर्क 60% समय लेना चाहिए और क्यों ट्रेसिंग बिल्कुल विपरीत परिणाम दिखाती है।

क्या कोई मुझे इन परिणामों को समझने में मदद कर सकता है। क्या मुझसे कोई चूक हो रही है?

पर्यावरण:

java -version 
java version "1.6.0_31" 
Java(TM) SE Runtime Environment (build 1.6.0_31-b04) 
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
+1

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

+0

@ मार्कोटोपॉलिक थ्रेड अन्य चीजें भी करता है। मूल रूप से इसके निर्माता/उपभोक्ता समस्या। कार्य का उत्पादन करें और इसे कतार में जमा करें और प्रतीक्षा उपभोक्ताओं को सूचित करें। उपभोक्ता कार्य पर कार्य करता है और यदि पार्क से स्वयं कोई कार्य उपलब्ध नहीं है। –

+0

थ्रेड जो 'अनपर्क' कहता है वह धागा अनपर्क नहीं होता है। बदले में, यह धागा उचित उपभोक्ता धागे को अनदेखा करने के अलावा ही थोड़ा काम कर सकता है। 'पार्क' के सीपीयू समय के लिए, यह एक है) अवरुद्ध होने के कारण मापना कठिन है और बी) अप्रासंगिक है क्योंकि यह पार्क किए गए राज्य में व्यतीत वास्तविक समय का एक महत्वपूर्ण अंश होगा। नमूना परीक्षण में –

उत्तर

3
कुछ निम्न स्तर को अवरुद्ध आदेशों के साथ

पढ़ पसंद/लिखने/पार्क/ताला अनुमान से अधिक के रूप में यह मान लिया गया यह सीपीयू लेने वाली है, जब वास्तव में आपरेशन ब्लॉक कर रहा है "सीपीयू" समय है। तथ्य अनपर्क/पार्क दोनों उच्च हैं, सुझाव देते हैं कि आपको कोई समस्या है, लेकिन मुझे संदेह है कि आपको अनुमान के रूप में दो प्रतिशत के निचले हिस्से को कम करना चाहिए।

3

Unsafe.unpark का उच्च CPU समय अत्यधिक संदर्भ स्विचिंग का संकेत है। यहाँ कैसे महंगा एक संदर्भ स्विच है के विचार प्राप्त करने के लिए एक लेख है:

How long does it take to make a context switch?

लिनक्स पर सीएस गिनती पता लगाने के लिए सबसे आसान विकल्प vmstat <seconds> चलाया जाता है।

एक बार उच्च सीएस की पुष्टि हो जाती है (उदाहरण के लिए प्रति कोर/प्रति सेकंड 10k स्विच) आप अपमानजनक थ्रेड लेते हैं (आप अपने सीपीयू समय से वाईजेपी में धागे को सॉर्ट कर सकते हैं) और strace -p <pid> -c को स्विचिंग के कारण का पता लगाने के लिए चलाएं, उदा। थ्रेड छोटे टुकड़ों में सॉकेट से पढ़ रहा है और बंद हो जाता है, इस मामले में सॉकेट बफर बढ़ने में मदद मिल सकती है।