জ্যাম্যাপ চলছে চলছে সকেট ফাইল খুলতে অক্ষম


88

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 গাদা ডাম্প করার জন্য Allright হয়?
  2. আমি 20 মিনিট অপেক্ষা করছি এবং এখনও শেষ হয়নি। কোন ধারণা কেন?

উত্তর:


187

jmapবনাম jmap -F, পাশাপাশি jstackবনাম jstack -F। লক্ষ্য জেভিএমের সাথে যোগাযোগের জন্য সম্পূর্ণ ভিন্ন প্রক্রিয়া ব্যবহার করে।

jmap / jstack

-Fএই সরঞ্জামগুলি ছাড়াই চালিত হলে ডায়নামিক সংযুক্তি মেকানিজম ব্যবহার করুন । এটি নিম্নলিখিত হিসাবে কাজ করে।

  1. জাভা প্রক্রিয়া 1234 এ সংযুক্ত হওয়ার আগে, লক্ষ্য প্রক্রিয়াটির কার্যকরী ডিরেক্টরিতে বা jmapএটিতে একটি ফাইল তৈরি .attach_pid1234করে /tmp

  2. তারপরে লক্ষ্য প্রক্রিয়ায় jmapপ্রেরণ SIGQUITকরে। যখন জেভিএম সিগন্যালটি ধরে এবং সন্ধান করে .attach_pid1234, এটি AttachListenerথ্রেড শুরু করে ।

  3. AttachListenerথ্রেডটি ইউনিক্স ডোমেন সকেট তৈরি করে /tmp/.java_pid1234বাহ্যিক সরঞ্জামগুলি থেকে আদেশগুলি শুনতে।

  4. সুরক্ষা কারণে যখন কোনও সংযোগ (থেকে jmap) গৃহীত হয়, জেভিএম যাচাই করে যে সকেট পিয়ারের শংসাপত্রগুলি JVM প্রক্রিয়ার সমান euidএবং সমান egid। এজন্য jmapবিভিন্ন ব্যবহারকারী (এমনকি মূল দ্বারা) চালিত হলে কাজ করবে না।

  5. jmapসকেটে সংযুক্ত করে এবং dumpheapআদেশ পাঠায় ।

  6. এই কমান্ডটি AttachListenerJVM এর থ্রেড দ্বারা পড়া এবং সম্পাদন করা হয় । সমস্ত আউটপুট সকেটে ফিরে পাঠানো হয়। যেহেতু হিপ ডাম্প সরাসরি জেভিএম দ্বারা প্রক্রিয়াজাত করা হয়, তাই অপারেশনটি সত্যিই দ্রুত is যাইহোক, জেভিএম কেবলমাত্র নিরাপদ পয়েন্টগুলিতে এটি করতে পারে । যদি কোনও সাফাইপয়েন্টে পৌঁছানো না যায় (যেমন প্রক্রিয়াটি স্তব্ধ হয়ে গেছে, সাড়া দিচ্ছে না, বা দীর্ঘ जीসির কাজ চলছে), jmapসময়সীমা শেষ হবে এবং ব্যর্থ হবে।

আসুন গতিশীল সংযুক্তির সুবিধাগুলি এবং ত্রুটিগুলি সংক্ষেপে ze

পেশাদাররা।

  • হিপ ডাম্প এবং অন্যান্য ক্রিয়াকলাপগুলি সর্বোচ্চ গতিতে জেভিএমের সহযোগিতামূলকভাবে পরিচালিত হয়।
  • আপনি জেভিএম এর অন্য কোনও সংস্করণে jmapবা jstackসংযোগ করতে যে কোনও সংস্করণ ব্যবহার করতে পারেন ।

কনস

  • টুলটি একই ব্যবহারকারী ( euid/ egid) দ্বারা লক্ষ্য হিসাবে জেভিএম চালানো উচিত ।
  • শুধুমাত্র লাইভ এবং স্বাস্থ্যকর জেভিএম ব্যবহার করা যেতে পারে।
  • টার্গেট জেভিএম দিয়ে শুরু করা হলে কাজ করবে না -XX:+DisableAttachMechanism

jmap -F / jstack -F

যখন -Fসরঞ্জামগুলি চালিত হয় তখন বিশেষ মোডে স্যুইচ করুন যা হটস্পট পরিষেবাযোগ্যতা এজেন্ট বৈশিষ্ট্যযুক্ত । এই মোডে লক্ষ্য প্রক্রিয়া হিমশীতল; সরঞ্জামগুলি ptraceলিনাক্সে ওএস ডিবাগিং সুবিধাগুলির মাধ্যমে এর মেমরিটি পড়ে ।

  1. jmap -Fপূজা PTRACE_ATTACHলক্ষ্য জেভিএম উপর। SIGSTOPসিগন্যালের প্রতিক্রিয়াতে লক্ষ্য প্রক্রিয়াটি নিঃশর্ত স্থগিত করা হয় ।

  2. সরঞ্জামটি ব্যবহার করে জেভিএম মেমরি পড়ছে PTRACE_PEEKDATAptraceএকসাথে কেবল একটি শব্দ পড়তে পারে, তাই লক্ষ্য প্রক্রিয়াটির বৃহত স্তূপটি পড়তে অনেক বেশি কল প্রয়োজন। এটি খুব এবং খুব ধীর।

  3. নির্দিষ্ট জেভিএম সংস্করণের জ্ঞানের উপর ভিত্তি করে সরঞ্জামটি জেভিএম অভ্যন্তরীণ কাঠামো পুনর্গঠন করে। যেহেতু জেভিএমের বিভিন্ন সংস্করণে বিভিন্ন মেমরি লেআউট রয়েছে, -Fমোড কেবল তখনই কাজ করে jmapযখন লক্ষ্য জাভা প্রক্রিয়া হিসাবে একই জেডিকে থেকে আসে।

  4. সরঞ্জামটি হিপ ডাম্প নিজেই তৈরি করে এবং তারপরে লক্ষ্য প্রক্রিয়াটি পুনরায় শুরু করে।

পেশাদাররা।

  • লক্ষ্য জেভিএম থেকে কোনও সহযোগিতা প্রয়োজন। এমনকি একটি স্তব্ধ প্রক্রিয়াতেও ব্যবহার করা যেতে পারে।
  • ptraceওএস-স্তরের সুবিধাগুলি পর্যাপ্ত হলেই কাজ করে। যেমন rootঅন্যান্য সমস্ত ব্যবহারকারীর প্রসেস ডাম্প করতে পারে।

কনস

  • বড় গাদা জন্য খুব ধীর।
  • সরঞ্জাম এবং লক্ষ্য প্রক্রিয়াটি জেডিকে একই সংস্করণ থেকে হওয়া উচিত।
  • যখন সরঞ্জামটি জোর করে মোডে সংযুক্ত করা হয় তখন সাফপয়েন্টের গ্যারান্টি দেওয়া হয় না। যদিও jmapসমস্ত বিশেষ ক্ষেত্রে পরিচালনা করার চেষ্টা করা হয়, কখনও কখনও এটি ঘটতে পারে যে লক্ষ্য JVM একটি সামঞ্জস্যপূর্ণ অবস্থায় নেই state

বিঃদ্রঃ

জোর করে মোডে হ্যাপ ডাম্প নেওয়ার আরও দ্রুত উপায় রয়েছে। প্রথমে একটি করডাম্প তৈরি করুন gcore, তারপরে jmapউত্পন্ন কোর ফাইলটি চালান over দেখুন সংশ্লিষ্ট প্রশ্ন


85

আমি সবেমাত্র পেয়েছি যে jmap (এবং সম্ভবত একটি japisvvvm এটি একটি হিপ ডাম্প তৈরির জন্য ব্যবহার করার সময়) প্রয়োগ করে যে jmap চলমান ব্যবহারকারীর অবশ্যই একই ব্যবহারকারীর প্রক্রিয়ায় ডাম্প করার চেষ্টা করা উচিত।

আমার ক্ষেত্রে jvm আমি একটি হিপ ডাম্প চাই লিনাক্স ব্যবহারকারী "jboss" দ্বারা চালিত হয়। সুতরাং যেখানে sudo jmap -dump:file.bin <pid>"সকেট খুলতে অক্ষম:" প্রতিবেদন করছিল, আমি আমার হিপ ডাম্প ব্যবহার করে এটি ধরতে সক্ষম হয়েছি:

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

আমি মনে করি এটি \ -ডাম্প: ফাইল.বিন <পিড> হওয়া উচিত - যখন সুডো থেকে জ্যাম্যাপে প্যারামিটারটি পাস করার সময় আপনাকে এড়াতে হবে।
অ্যাডাম

এই হল! আপনাকে জ্যাম্যাপ এবং জেসিএমডি এর জন্যও সুডো দরকার।
xtian

বাহ .. এটি আসলে কাজ করেছে। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
ললিত রাও

3

বেন_উইং যেমন বলেছেন, আপনি এটির সাথে চালাতে পারেন:

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। আমি ইতিমধ্যে .বাশ_ প্রোফাইলে জাভা পাথটি কনফিগার করেছি, আমার কী করা উচিত।
রোমারের

@ রৌমার সম্ভবত এটি কারণ আপনি যখন esব্যবহারকারী হিসাবে চালাবেন তখন .bash_profileপ্রয়োগ করা হচ্ছে না (কারণ ব্যাশ প্রোফাইলটি আপনার ব্যবহারকারীর সাথে সম্পর্কিত, আমি ধরে নিই)। আমি আরো বিশ্বব্যাপী ভাবে জাভা রাস্তা অন্তর্ভুক্ত করার জন্য উপদেশ, হয়তো বা, কমান্ড জাভা পাথ নির্দিষ্ট মত sudo sudo -u es PATH="$PATH:/java/path" jmap -dump:file=tmp.bin 26283(যেখানে /java/pathজাভা পথ, এবং নিশ্চিত এটা আছে যে jmapএটা )।
লুকাস বাস্কেরোত্তো

আমি জাভা পাথটি / home/es/.Bash_profile এ কনফিগার করি এবং এই ব্যবহারকারীর সাথে লগইন করার সময় আমি jmap ব্যবহার করতে পারি। এই সিএমডি sudo sudo -u es /usr/java/jdk1.8.0_181-cloudera/bin/jmap -dump:file=tmp.bin 26283কাজ করে। অনেক ধন্যবাদ.
রোমার

2

যদি আপনার অ্যাপ্লিকেশনটি সিস্টেমড পরিষেবাদি হিসাবে চলমান থাকে You /usr/lib/systemd/system/আপনার পরিষেবা নামটি অনুসারে সার্ভিস ফাইলটি খোলা উচিত । তারপরে প্রাইভেটটিম্প বৈশিষ্ট্যটি সত্য কিনা তা পরীক্ষা করে দেখুন ।

যদি এটি সত্য হয়, আপনি systemctl daemon-reload systemctl restart [servicename] জোরে জোরে এটিকে পরিবর্তন করবেন, তারপরে আদেশ অনুসারে সার্ভিসটি রিফ্রেশ করুন: আপনি যদি পুনরায় আরম্ভ করার আগে jmap / jcmd চালনা করতে চান তবে আপনি সার্ভিস ফাইলে এক্সিকিস্টপ স্ক্রিপ্টটি ব্যবহার করতে পারেন। এটিতে কমান্ডটি প্রয়োগ করুন এবং সম্পাদন করুনsystemctl stop [service name]


আমি /usr/lib/systemd/system/elasticsearch.service আপডেট করার আগে, প্রাইভেটটিম্পকে মিথ্যা হিসাবে সেট করার আগে, আমি এই ত্রুটিটি পেয়েছি: সকেট ফাইলটি খুলতে অক্ষম: টার্গেট প্রক্রিয়াটি সাড়া দিচ্ছে না বা হটস্পট ভিএম লোড হয়নি - যদিও আমি জ্যাম্যাপ হিসাবে চলছিলাম though
স্থিতিস্থাপক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.