একাধিক কোরগুলিতে সংকলন করার সময় হ্যাং হওয়ার কারণ কী হতে পারে?


17

আমি গতকাল কম্পাইল করার চেষ্টা ছিল রুট উৎস থেকে প্যাকেজ। যেহেতু আমি এটি একটি 6 টি মূল দৈত্য মেশিনে সংকলন করছি, তাই আমি একাধিক কোর ব্যবহার করে এগিয়ে যাওয়ার এবং নির্মাণের সিদ্ধান্ত নিয়েছি make -j 6। সংকলনটি প্রথমে মসৃণ এবং সত্যিই দ্রুতগতিতে চলেছিল, তবে এক পর্যায়ে makeমাত্র একটি কোরটিতে 100% সিপিইউ ব্যবহার করে স্তব্ধ হয়ে গেছে।

আমি কিছু গুগলিং করেছি এবং এই পোস্টটি আরওটি বার্তা বোর্ডগুলিতে পেয়েছি । যেহেতু আমি নিজেই এই কম্পিউটারটি তৈরি করেছি, তাই আমি উদ্বিগ্ন ছিলাম যে আমি হিটসিংকটি সঠিকভাবে প্রয়োগ করি নি এবং সিপিইউ অত্যধিক গরম বা অন্য কোনও বিষয়। দুর্ভাগ্যক্রমে, আমার এখানে কর্মক্ষেত্রে কোনও ফ্রিজ নেই যা আমি এটি আটকে রাখতে পারি; ;-)

আমি lm-sensorsপ্যাকেজটি ইনস্টল করে make -j 6আবার দৌড়েছি , এবার সিপিইউ তাপমাত্রা পর্যবেক্ষণ করছি। যদিও এটি উচ্চতর (60০ ডিগ্রি সেন্টিগ্রেডের কাছাকাছি) হয়ে গেছে, এটি কখনও কখনও উচ্চ বা সমালোচনামূলক তাপমাত্রার কাছাকাছি যায়নি।

আমি দৌড়ানোর চেষ্টা করেছিলাম make -j 4তবে আবার makeসংকলনের সময় আবার কিছুটা ঝুলিয়েছিলাম, এবার অন্য জায়গায়।

শেষ পর্যন্ত, আমি কেবল চলমান সংকলন করেছি makeএবং এটি দুর্দান্ত কাজ করেছে। আমার প্রশ্ন: এটি কেন ঝুলছিল? এটি দুটি পৃথক স্পটে থামার কারণে, আমি অনুমান করব যে এটি কোনও ধরণের রেসের শর্তের কারণে হয়েছিল, তবে আমি মনে করব যে makeএটি সঠিকভাবে অর্ডার দেওয়ার জন্য যথেষ্ট চৌকস হওয়া উচিত কারণ এটি -jবিকল্পটি সরবরাহ করে।


4
এটি রেসের শর্তের মতো শব্দ করে। আপনি যা করতে পারেন তা হ'ল চলমান মেক প্রক্রিয়াটি (যা ঘুরছে) এর সাথে সংযুক্ত করা, উদাহরণস্বরূপ strace -p <pid>এবং এটি কী / কী খুঁজছেন তা আপনি খুঁজে পেতে পারেন কিনা তা দেখুন। স্ট্রেস কেবল আপনাকে সাইকোলে প্রদর্শিত হবে (ফাংশন কল নয়), তবে এটি কোনও নির্দিষ্ট ফাইল দেখার জন্য বা সন্ধান করার সময় এটি ঘুরছে তবে তা আপনাকে মূল্যবান তথ্য দিতে পারে।
jlp

গুগলের মাধ্যমে আপনি যে থ্রেডটি পেয়েছেন তা এই সিদ্ধান্তে নিয়ে যায় যে এটির সাথে কেউ সংকলন করতে সক্ষম হয়নি -j >1
নীল

সমান্তরাল সংকলনের সাথে সম্পর্কিত নয়, তবে আমার একটি ঝুলন্ত মেকফিল ছিল যা ডিবাগ করতে চিরতরে লেগেছিল। দেখা যাচ্ছে এটি কেবল একটি চলকের সূচনাতে $(shell ...)ছিল , শেষ পর্যন্ত একটি কমান্ড চালাচ্ছিল যা ইনপুটটির জন্য অপেক্ষাstdin করছিল । কোনও ভেরিয়েবল খালি থাকাকালীন এবং কমান্ডের কাছে কোনও ফাইল আর্গুমেন্ট পাস না হওয়ার কারণে এটি ঘটেছিল।
জোজকিয়াক্ক

উত্তর:


13

এই সুনির্দিষ্ট সমস্যার উত্তর আমার কাছে নেই তবে আমি কী ঘটতে পারে তার একটি ইঙ্গিত দেওয়ার চেষ্টা করতে পারি: মেকফাইলে নির্ভরতা মিস করা।

উদাহরণ:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

আপনি কল করলে make targetসবকিছু সঠিকভাবে সংকলিত হবে। সংকলনটি a.sourceপ্রথমে (নির্বিচারে, তবে নির্বিচারে) সম্পন্ন হয়। তারপরে সংকলন b.sourceসম্পাদন করা হয়।

তবে আপনি যদি make -j2 targetউভয় compileকমান্ড সমান্তরালভাবে চালানো হবে। এবং আপনি প্রকৃতপক্ষে লক্ষ্য করবেন যে আপনার মেকফিলের নির্ভরতা নষ্ট হয়েছে। দ্বিতীয় সংকলন ধরে a.bytecodeনেওয়া ইতিমধ্যে সংকলিত হয়েছে, তবে এটি নির্ভরতাতে উপস্থিত হয় না। সুতরাং একটি ত্রুটি ঘটতে পারে সম্ভবত। এর জন্য সঠিক নির্ভরতা লাইনটি হ'ল b.bytecode:

b.bytecode: b.source a.bytecode

আপনার সমস্যায় ফিরে আসতে যদি আপনি ভাগ্যবান না হন তবে অনুপস্থিত নির্ভরতার কারণে একটি কমান্ড 100% সিপিইউ লুপে ঝুলতে পারে। সম্ভবত এটি এখানে যা ঘটছে, অনুপস্থিত নির্ভরতাটি অনুক্রমিক বিল্ড দ্বারা প্রকাশ করা যায়নি, তবে এটি আপনার সমান্তরাল বিল্ড দ্বারা প্রকাশ করা হয়েছে।


মজাদার. আপনি কি জানেন যে এমন কোনও সরঞ্জাম উপলব্ধ রয়েছে যা একটি মেকফিলের মাধ্যমে চলতে পারে এবং এই নির্ভরতাগুলি পরীক্ষা করতে পারে?
ব্যবহারকারীর 4545424

আমি কিছু জানি না। যে কোনও ক্ষেত্রে যেমন একটি সরঞ্জাম কেবল সুস্পষ্ট ভুল খুঁজে পেতে পারে। যতক্ষণ না এটি মেকফিলটিতে প্রদর্শিত প্রতিটি কমান্ডের বাক্য গঠন বোঝে এবং না (কীভাবে সম্ভাব্য অন্তর্নিহিত) নির্ভরতাগুলি তা জানে।
স্টাফেন গিমেনেজ

2

আমি জানি না আপনি কতক্ষণ মেশিনটি রেখেছিলেন, তবে আমার প্রথম সুপারিশটি হ'ল মেমরি পরীক্ষার চেষ্টা করা এবং মেমরিটি সঠিকভাবে কাজ করছে কিনা তা যাচাই করা। আমি জানি এটি প্রায়শই সমস্যা হিসাবে স্মৃতি নয়, তবে এটি যদি হয় তবে সম্ভবত অন্যান্য সমস্যাগুলি আবিষ্কার করার চেষ্টা করার আগে প্রথমে কারণ হিসাবে এটি নির্মূল করা ভাল।


1

আমি বুঝতে পারি এটি একটি সত্যই পুরানো প্রশ্ন, তবে এটি এখনও অনুসন্ধান ফলাফলের শীর্ষে উঠে আসে, তাই আমার সমাধানটি এখানে:

জিএনইউ মেকের তৈরির বিষয়টি নিশ্চিত করার জন্য একটি জবসিভার ব্যবস্থা আছে এবং এর পুনরাবৃত্ত শিশুরা নির্দিষ্ট সংখ্যক কোরের চেয়ে বেশি গ্রাস না করে: http://make.mad-scientist.net/papers/jobserver-implementation/

এটি সমস্ত প্রক্রিয়া দ্বারা ভাগ করা পাইপের উপর নির্ভর করে। অতিরিক্ত বাচ্চাদের কাঁটাচামচ করতে চায় এমন প্রতিটি প্রক্রিয়া প্রথমে পাইপ থেকে টোকেন গ্রহণ করতে হবে, তারপরে এগুলি ছেড়ে দিতে হবে। যদি কোনও শিশু প্রক্রিয়া এটি ব্যবহার করে টোকেনগুলি ফেরত না দেয় তবে তাদের ফিরে আসার জন্য অপেক্ষা করে চিরকাল স্তব্ধ স্তরের স্তরের তৈরি।

https://bugzilla.redhat.com/show_bug.cgi?id=654822

আমার সোলারিস বাক্সে জিএনইউ দিয়ে বাইন্টিলগুলি তৈরি করার সময় আমি এই ত্রুটির মুখোমুখি হয়েছি, যেখানে "সেড" জিএনইউ শেড নয়। সিস্টেমে == গেসড তৈরি করতে PATH এর সাথে ফিডলিং সমস্যাটিকে স্থির করে priority যদিও পাইপটি পাইপ থেকে টোকেন গ্রহণ করছিল কেন তা আমি জানি না।


0

আপনার সিস্টেমটি ঠিক আছে, তবে makeসমান্তরালে বিল্ডিং চালানোর সময় এটি একটি জাতি শর্ত হতে পারে ।

যদি আপনার সিস্টেমে কিছু ভুল হয়, তবে এটি অন্যান্য প্যাশনগুলির জন্য ঝুলিয়ে / ক্র্যাশ করবে, কেবলমাত্র সমান্তরাল বিল্ডগুলি করার সময় নয়।


0

এটি একটি দৌড় শর্ত হতে পারে, তবে সমস্ত প্রয়োজনীয় সংকলন সমান্তরালভাবে করা হয় এবং অন্যের জন্য অপেক্ষা করা হয়, লিঙ্কিং আপনার মেশিনে আপনার সময় নেয়। আমি মনে করি যে যদি লিঙ্কিং সমান্তরালভাবে পূর্ববর্তী প্রয়োজনীয় সংকলনের জন্য অপেক্ষা করে, তবে আপনি যা সংকলন করেন তা সংযুক্ত করার ক্ষেত্রে আপনি উচ্চ সিপিইউ ফ্রিকোয়েন্সি পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.