सॉकेट फ़ाइल खोलने में असमर्थ जंपिंग रनिंग


85

मुझे jmapअपनी प्रक्रिया के ढेर डंप लेने के लिए दौड़ना पड़ा । लेकिन jvmवापस लौटा:

Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

तो मैंने इस्तेमाल किया -F:

./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
  1. का उपयोग करते -F हुए ढेर डंप लेने के लिए बिल्कुल सही है?
  2. मैं 20 मिनट इंतजार कर रहा हूं और अभी समाप्त नहीं हुआ हूं। कोई विचार क्यों?

जवाबों:


181

jmapबनाम jmap -F, साथ ही साथ jstackबनाम jstack -Fलक्ष्य JVM के साथ सामंजस्य करने के लिए पूरी तरह से अलग तंत्र का उपयोग करें।

jmap / jstack

जब -Fइन उपकरणों के बिना रन डायनेमिक अटैच मैकेनिज्म का उपयोग करते हैं । यह निम्नानुसार काम करता है।

  1. जावा प्रक्रिया 1234 से कनेक्ट करने से पहले, लक्ष्य प्रक्रिया की कार्यशील निर्देशिका में या पर jmapएक फ़ाइल बनाता है ।.attach_pid1234/tmp

  2. फिर लक्ष्य प्रक्रिया को jmapभेजता SIGQUITहै। जब जेवीएम सिग्नल को पकड़ता है और पाता है .attach_pid1234, तो यह AttachListenerथ्रेड शुरू होता है।

  3. AttachListener/tmp/.java_pid1234बाहरी उपकरणों से कमांड सुनने के लिए धागा UNIX डोमेन सॉकेट बनाता है ।

  4. एक कनेक्शन (से jmap) स्वीकार किए जाने पर सुरक्षा कारणों के लिए , जेवीएम यह सत्यापित करता है कि सॉकेट पीयर की साख जेवीएम प्रक्रिया के बराबर euidऔर बराबर है egid। यही कारण है कि jmapअगर अलग-अलग उपयोगकर्ता (यहां तक ​​कि रूट) द्वारा चलाया जाता है तो काम नहीं करेगा।

  5. jmapसॉकेट से कनेक्ट करता है, और dumpheapकमांड भेजता है ।

  6. इस कमांड को AttachListenerJVM के थ्रेड द्वारा पढ़ा और निष्पादित किया जाता है । सभी आउटपुट को सॉकेट में वापस भेज दिया जाता है। चूंकि ढेर डंप सीधे जेवीएम द्वारा प्रक्रिया में बनाया जाता है, इसलिए ऑपरेशन वास्तव में तेज है। हालांकि, जेवीएम केवल सेफ पॉइंट्स पर ऐसा कर सकता है । यदि कोई सेफपॉइंट नहीं पहुँचा जा सकता है (जैसे प्रक्रिया लटका दी गई है, जवाब नहीं दे रहा है, या एक लंबी जीसी प्रगति पर है), jmapसमय समाप्त हो जाएगा और विफल हो जाएगा।

आइए डायनामिक अटैच के लाभों और कमियों को संक्षेप में प्रस्तुत करें।

पेशेवरों।

  • हीप डंप और अन्य ऑपरेशन अधिकतम गति से जेवीएम द्वारा सहयोगी रूप से चलाए जाते हैं।
  • आप JVM के किसी भी अन्य संस्करण से जुड़ने के लिए jmapया किसी भी संस्करण का उपयोग कर सकते हैं jstack

विपक्ष।

  • उपकरण को उसी उपयोगकर्ता ( euid/ egid) द्वारा लक्षित JVM के रूप में चलाया जाना चाहिए ।
  • केवल जीवित और स्वस्थ जेवीएम पर इस्तेमाल किया जा सकता है।
  • लक्ष्य JVM के साथ शुरू किया गया है तो काम नहीं करेगा -XX:+DisableAttachMechanism

jmap -F / jstack -F

जब हॉटस्पॉट सर्विसएबिलिटी एजेंट-F को बनाने वाले विशेष मोड पर उपकरण स्विच के साथ चलते हैं । इस मोड में लक्ष्य प्रक्रिया जमी है; उपकरण OS पर डीबगिंग सुविधाओं के माध्यम से इसकी स्मृति को पढ़ते हैं, अर्थात् लिनक्स पर।ptrace

  1. jmap -Fआह्वान PTRACE_ATTACHलक्ष्य JVM पर। SIGSTOPसिग्नल की प्रतिक्रिया में लक्ष्य प्रक्रिया बिना शर्त के निलंबित है ।

  2. उपकरण JVM मेमोरी का उपयोग करके पढ़ता है PTRACE_PEEKDATAptraceएक समय में केवल एक शब्द पढ़ सकता है, इसलिए लक्ष्य प्रक्रिया के बड़े ढेर को पढ़ने के लिए बहुत अधिक कॉल की आवश्यकता होती है। यह बहुत और बहुत धीमा है।

  3. उपकरण विशेष JVM संस्करण के ज्ञान के आधार पर JVM आंतरिक संरचनाओं का पुनर्निर्माण करता है। चूँकि JVM के विभिन्न संस्करणों में अलग-अलग मेमोरी लेआउट होते हैं, -Fमोड तभी काम करता jmapहै जब एक ही JDK से लक्ष्य जावा प्रक्रिया आती है।

  4. उपकरण हीप डंप बनाता है और फिर लक्ष्य प्रक्रिया को फिर से शुरू करता है।

पेशेवरों।

  • लक्ष्य JVM से किसी भी सहयोग की आवश्यकता नहीं है। एक त्रिशंकु प्रक्रिया पर भी इस्तेमाल किया जा सकता है।
  • ptraceजब भी OS- स्तर के विशेषाधिकार पर्याप्त होते हैं। ईजी rootअन्य सभी उपयोगकर्ताओं की प्रक्रियाओं को डंप कर सकता है।

विपक्ष।

  • बड़े ढेर के लिए बहुत धीमी।
  • उपकरण और लक्ष्य प्रक्रिया JDK के एक ही संस्करण से होनी चाहिए।
  • जब उपकरण मजबूर मोड में संलग्न होता है, तो सेफपॉइंट की गारंटी नहीं होती है। यद्यपि jmapसभी विशेष मामलों को संभालने की कोशिश की जाती है, कभी-कभी ऐसा हो सकता है कि जेवीएम को लक्षित करना सुसंगत स्थिति में नहीं है।

ध्यान दें

मजबूर मोड में हीप डंप लेने का एक तेज़ तरीका है। सबसे पहले, के साथ एक coredump बनाएँ gcore, फिर jmapजेनरेट की गई कोर फ़ाइल पर चलाएँ । संबंधित प्रश्न देखें ।


84

मैंने पाया कि जम्प (और संभवतया jvisualvm जब यह ढेर डंप उत्पन्न करने के लिए उपयोग करता है) तो यह बताता है कि जंप चलाने वाला उपयोगकर्ता वही उपयोगकर्ता होना चाहिए जो डंप होने का प्रयास कर रहा हो।

मेरे मामले में jvm मैं चाहता हूँ के लिए एक ढेर डंप किया जा रहा है Linux उपयोगकर्ता "jboss" द्वारा चलाया जा रहा है। इसलिए जहां sudo jmap -dump:file.bin <pid>"सॉकेट खोलने में असमर्थ:" रिपोर्ट कर रहा था, मैं अपने हीप डंप का उपयोग करने में सक्षम था:

sudo -u jboss jmap -dump:file.bin <pid>

मुझे लगता है कि यह होना चाहिए: -dump: file.bin <pid> जैसा कि आपको बचने की ज़रूरत है - जब पैरामीटर को sudo से jmap में पार कर रहा हो।
adam

यह बात है! आपको जैम और जेडएमसीडी के लिए भी सूडो की आवश्यकता है।
xtian

वाह .. यह वास्तव में काम किया। इसका स्वीकृत उत्तर होना चाहिए
ललित राव

3

जैसे ben_wing ने कहा, आप साथ दौड़ सकते हैं:

sudo -u jboss-as jmap -dump:file.bin <pid>

(मेरे मामले में उपयोगकर्ता है jboss-as, लेकिन आपका jbossया कुछ और हो सकता है ।)

लेकिन यह पर्याप्त नहीं था, क्योंकि इसने मुझसे एक पासवर्ड ( [sudo] password for ec2-user:) मांगा , हालाँकि मैं sudoअन्य कमांड वाले पासवर्ड के लिए मुझे संकेत दिए बिना चला सकता था ।

मुझे यहाँ समाधान मिला , और मुझे अभी और sudoपहली जोड़ने की ज़रूरत थी :

sudo sudo -u jboss-as jmap -dump:file.bin <pid>

यह अन्य कमांड जैसे jcmdऔर के साथ काम करता jinfoहै।


डबल sudoमेरा दिन बचाता है!
Sher10ck

[root@v5 ~]# sudo sudo -u es jmap -dump:file=tmp.bin 26283 त्रुटि हो जाती है sudo: jmap: command not found। मैं पहले से ही .bash_profile में जावा पथ को कॉन्फ़िगर करता हूं, मुझे क्या करना चाहिए।
रोमर

@roamer शायद ऐसा इसलिए है क्योंकि जब आप esउपयोगकर्ता के रूप में चलते हैं , तो .bash_profileइसे लागू नहीं किया जा रहा है (क्योंकि bash प्रोफ़ाइल आपके उपयोगकर्ता से संबंधित है, मुझे लगता है)। मैं एक और अधिक वैश्विक तरह से जावा पथ शामिल करने की सलाह, या हो सकता है, आदेश में जावा पथ निर्दिष्ट की तरह sudo sudo -u es PATH="$PATH:/java/path" jmap -dump:file=tmp.bin 26283(जहां /java/pathजावा पथ है, और यकीन है कि यह है कि कर jmapउस में )।
लुकास बेसकर्प्टो

मैं /home/es/.bash_profile में जावा पथ को कॉन्फ़िगर करता हूं, और es उपयोगकर्ता के साथ लॉगिन करते समय मैं jmap का उपयोग कर सकता हूं। यह cmd sudo sudo -u es /usr/java/jdk1.8.0_181-cloudera/bin/jmap -dump:file=tmp.bin 26283काम करता है। बहुत बहुत धन्यवाद।
घूमते हैं

2

यदि आपका एप्लिकेशन एक systemd सेवा के रूप में चल रहा है। आपको सेवा फ़ाइल खोलनी चाहिए जो /usr/lib/systemd/system/आपके सेवा नाम से और उसके नाम से है। फिर जांचें कि क्या PrivateTmp विशेषता सत्य है।

यदि यह सही है, तो आप इसे गलत में बदल देते हैं, फिर सेवा को systemctl daemon-reload systemctl restart [servicename] निम्नानुसार रीफ्रेश करें: यदि आप पुनः आरंभ करने से पहले जम्प / jcmd चलाना चाहते हैं, तो आप सेवा फ़ाइल में निष्पादन स्क्रिप्ट का उपयोग कर सकते हैं। बस इसमें कमांड डालें और निष्पादित करेंsystemctl stop [service name]


इससे पहले कि मैंने /usr/lib/systemd/system/elasticsearch.service को अपडेट किया, PrivateTmp को गलत पर सेट करना, मुझे यह त्रुटि मिली: सॉकेट फ़ाइल खोलने में असमर्थ: लक्ष्य प्रक्रिया का जवाब नहीं दे रहा है या हॉटस्पॉट VM लोड नहीं हुआ है, भले ही मैं jmap के रूप में चल रहा हो
एलिटिक्स खोज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.