2014-04-16 17 views
10

में जावा एप्लिकेशन मेमोरी उपयोग की निगरानी कैसे करें I डॉकर कंटेनर में टॉमकैट पर जावा वेब एप्लिकेशन चलाएं।डॉकर

क्या जावा एप्लिकेशन के मेमोरी उपयोग की निगरानी करने का कोई तरीका है? मैं डॉकर की प्रक्रिया आईडी के साथ jconsole का उपयोग करने का प्रयास करता हूं, लेकिन यह मुझे Invalidate process id

मैं टॉमकैट में जेएमएक्स को भी सक्षम करता हूं, लेकिन यह नहीं जानता कि इसे कैसे बांधें। मैं मेजबान मशीन को बांधने के लिए अपने स्थानीय से visualvm का उपयोग कर सकता हूं, लेकिन मेजबान के अंदर डॉकर से जुड़ने का तरीका नहीं ढूंढ सकता।

क्या यह हासिल करने का कोई अच्छा तरीका है?

धन्यवाद

+1

समग्र मेमोरी उपयोग प्राप्त करने के लिए आपको डॉकर कंटेनर प्रक्रिया की निगरानी करने में सक्षम होना चाहिए, है ना? Jconsole के साथ नहीं, क्योंकि यह जावा प्रक्रिया नहीं है, लेकिन लिनक्स टूल जैसे 'टॉप', 'ps',' smem' आदि के साथ) या आप मेमोरी डिबगिंग की बात कर रहे हैं और क्या आप अधिक विस्तृत जानकारी चाहते हैं? – qkrijger

+0

@qkrijger हाँ, मैं मेमोरी लीक मुद्दे को डीबग करना चाहता हूं। मुझे पता है कि मैं इसे करने के लिए स्थानीय रूप से एप्लिकेशन चला सकता हूं। बस यह जानना चाहते हैं कि इसे हासिल करने का कोई दूरस्थ तरीका है। धन्यवाद –

+1

ठीक है, अपने होस्ट पर 'jconsole' चलाने के बारे में क्या है और http://stackoverflow.com/questions/856881/how-to-activate-jmx-on-my-jvm-for-access-with-jconsole और इन का उपयोग करें डॉकर जेएमएक्स रिमोट पोर्ट का पर्दाफाश करता है? – qkrijger

उत्तर

3

यह उपयोग है पर नजर रखने के लिए, आप इसे वास्तविक प्रक्रिया ID है पाने के लिए की जरूरत है। आप कंटेनर में सीधे बिल्ला चला रहे हैं, तो यह होना चाहिए:

DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)` 

आप Phusion के baseimage की तरह कुछ का उपयोग कर रहे हैं, तो अपने जावा प्रक्रिया है कि प्रक्रिया का एक बच्चा हो जाएगा।

pstree $DOCKER_ROOT_PROC 

एक बार जब आप गए हैं, आपको

ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC 

अपनी स्क्रिप्ट में उपयोग करते हुए रिकर्सिवली जावा प्रक्रिया आप (कुछ नियमित अभिव्यक्ति को छानने के साथ निगरानी करना चाहते हैं खोजने के लिए अपनी स्क्रिप्ट लिख सकते हैं: पदानुक्रम उपयोग को देखने के लिए , बेशक)। फिर अंत में आप किलोबाइट में अपने जावा आवेदन की स्मृति उपयोग पाने के लिए इस का उपयोग कर सकते हैं:

ps -o vsz -p $JAVAPROCESS 

मैं इस JConsole के साथ इस्तेमाल किया जा सकता है, तो पता नहीं है, लेकिन यह स्मृति के उपयोग की निगरानी का एक तरीका है।

3

डॉकर कंटेनर की निगरानी करने के लिए मैं Google's cAdvisor project की अनुशंसा करता हूं। इस तरह आपके पास डॉकर कंटेनर की निगरानी करने के लिए एक सामान्य समाधान है। बस अपने ऐप को चलाएं, जो कुछ भी है, एक डॉकर कंटेनर में, और सीपीयू और मेमोरी उपयोग जैसी चीज़ों की जांच करें। यहां आपके पास एक http API और साथ ही एक वेब UI है।

6

एक जावा visualvm साथ boot2docker में एक डोकर कंटेनर की दौड़ में शामिल चलने वाली प्रक्रिया से कनेक्ट करने के लिए आप निम्न प्रयास कर सकते हैं:

java -Dcom.sun.management.jmxremote.port=<port> \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false \ 
-Dcom.sun.management.jmxremote.rmi.port=<port> \ 
-Djava.rmi.server.hostname=<boot2docker_ip> \ 
<Main> 

आप को चलाने के लिए की जरूरत है:

निम्नलिखित विकल्पों का उपयोग कर अपने जावा प्रक्रिया प्रारंभ करें आपकी छवि --expose <port> -p <port>:<port> के साथ।

फिर में <boot2docker_ip>:<port> के साथ "जेएमएक्स कनेक्शन जोड़ें"।

यह boot2docker के बिना बहुत अलग नहीं होना चाहिए।

+1

सुनिश्चित करें कि आपके पास "-Dcom.sun.management.jmxremote.local.only = false" विकल्प नहीं है क्योंकि यही कारण है कि यह मेरे लिए काम नहीं कर रहा था। आपके उत्तर ने मुझे इसे समझने में मदद की। धन्यवाद! –

0

ऊपर वर्णित सीएडविसर कंटेनर के अंदर चल रहे टोमकैट की निगरानी में मदद नहीं करेगा। आप एसपीएम क्लाइंट डॉकर कंटेनर पर एक नज़र डालना चाहते हैं, जो वास्तव में करता है!यह डोकर में चल रहे विभिन्न अनुप्रयोगों के एक नंबर की निगरानी के लिए एजेंट है - Elasticsearch, Solr, बिलाव, MySQL, और इतने पर: https://github.com/sematext/docker-spm-client

0

डोकर में अपने आवेदन की स्मृति उपयोग निगरानी के लिए, आप भी अंदर एक ejstatd शुरू कर सकते हैं आपका डॉकर कंटेनर (आपकी मुख्य कंटेनर प्रक्रिया लॉन्च करने से पहले ejstatd फ़ोल्डर से mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" & पर कॉल करना), docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage का उपयोग करके डॉकर होस्ट में उन 3 बंदरगाहों को उजागर करना।

फिर आप JVisualVM का उपयोग करके इस विशेष jstatd डिमन से कनेक्ट करने में सक्षम होंगे, उदाहरण के लिए, "रिमोट होस्ट" को अपने डॉकर होस्टनाम को "होस्ट नाम" के रूप में निर्दिष्ट करना और "कस्टम जेस्टैट कनेक्शन" ("उन्नत सेटिंग्स में) जोड़ना ")" पोर्ट "को" 2222 "सेट करके।

अस्वीकरण: मैं इस ओपन सोर्स टूल का लेखक हूं।