কেন এই প্রক্রিয়াটি কোনও কিছুর জন্য অপেক্ষা করছে `strace` দেখায় না?


11

শক্তিমানরা straceআমাকে হতাশ করেছে। এটা কিভাবে সম্ভব?


time fooঅনুষ্ঠান fooইউজার-স্পেস ( "ব্যবহারকারী") এবং কার্নেল ( "sys") উভয় রান ( "বাস্তব") বেশ কয়েকটি সেকেন্ড সময় লাগে, কিন্তু তুচ্ছ cpu 'র সময় ব্যবহার করে। উত্সাহীদের জন্য, fooনীচে সংজ্ঞায়িত করা হয়েছে।

সুতরাং এটি বেশিরভাগ সময় সিপিইউ নির্দেশাবলী কার্যকর না করে অন্য কোনও কিছুর জন্য অপেক্ষা করতে ব্যয় করে। সাধারণত, আমি দেখতে পাচ্ছি যে এটি কীভাবে অপেক্ষা করছে strace- অর্থাত্ কোন সিস্টেম কলটি দীর্ঘ সময়ের জন্য অবরুদ্ধ করছে। দুর্ভাগ্যক্রমে এই পদ্ধতির কাজ হয়নি।

strace -ttt -T -C -w fooসিস্টেম কল, টাইমস্ট্যাম্পড এবং সিস্টেম কলগুলিতে ব্যয় করা (বাস্তব) সময়ের সংক্ষিপ্তসার দেখায়। তবে এই নির্দিষ্ট প্রক্রিয়াটি সিস্টেম কলের অভ্যন্তরে সামগ্রিক (বাস্তব) সময় ব্যয় করার মতো দেখায়।


fooআসলে journalctl -b -u dev-hugepages.mount। এটিকে পুনরুত্পাদন করার জন্য আমাকে সর্বশেষ যুক্তিটি প্রতিবার ভিন্ন সিস্টেমড ইউনিটে পরিবর্তন করতে হয়েছিল। অন্য কথায়, আমি যে বিলম্বটি তদন্ত করছি তা প্রথমবার হয়েছিল যখন আমি কোনও একটি সিস্টেমড ইউনিটের জন্য লগগুলি পাওয়ার চেষ্টা করি। সম্পাদনা : মূল প্রশ্নের উত্তর দেওয়ার পরে, আমি বিলম্বটি পুনরুত্পাদন করতে আমার এই সমস্যাটির কারণটিও উপলব্ধি করেছিলাম

এই প্রক্রিয়া দ্বারা ব্যয় করা সময়টি একটি নির্দিষ্ট সমস্যা, স্পষ্টতই এটি সমস্ত সিস্টেমে ঘটে না। https://github.com/systemd/systemd/issues/7963


হুম ... যেহেতু আপনার "ফু" প্রোগ্রামটি কেবল একটি সাধারণ একক প্রক্রিয়া, একক থ্রেডেড প্রক্রিয়া নয়, আপনি কাঁটাচামচ অনুসরণ এবং সংযুক্ত করার জন্য স্ট্রেসকে বলার মাধ্যমে আরও ভাল পরিবেশিত হবেন। '-ফ' আপনার বন্ধু! :) আপনিও চাইবেন, "-o / dev / shm / strace-foo" ব্যবহার করে সেই সমস্ত স্ট্রেফ প্রসেস আউটপুট ফাইলগুলিকে এক জায়গায় পরিণত করতে পারেন। শুধু একটি পরামর্শ।
জেসি অ্যাডেলম্যান

@ জেসি অ্যাডেলম্যান আমার ধারণা journalctlকেবল একটি প্রক্রিয়া চলে। আমার যে অনুভূতি আছে যে journalctlকোনও কারণে একটি অতিরিক্ত থ্রেড ব্যবহার করেছে - iirc সেখানে একটি ক্লোন () কল ছিল। আমি মনে করি এর অর্থ আপনি প্রযুক্তিগতভাবে সঠিক, তবে এটি প্রযুক্তিগত দিক থেকেও প্রশ্নটির সাথে অপ্রাসঙ্গিক। timeপ্রক্রিয়াটিকে সামগ্রিকভাবে দেখায় এবং দেখিয়েছে যে সামগ্রিকভাবে প্রক্রিয়াটি বরং নিদ্রাহীন (কোনও কিছুতে ব্লক করা)। straceযথেষ্ট ঘুম দেখায় নি। দ্বিতীয় থ্রেডটি ঘুমাচ্ছে কিনা তা বিবেচ্য নয়, timeফলাফলটি ব্যাখ্যা করতে মূল থ্রেডটিও খুব নিদ্রাহীন হতে হবে ।
সোর্সজেদি

উত্তর:


18

এই সমস্যাটিকে আঘাত করার স্বাভাবিক কারণটি হচ্ছে প্রক্রিয়াটি পৃষ্ঠা ত্রুটিগুলিতে অবরুদ্ধ হচ্ছে। এগুলি মেমরি ম্যাপিং ওরফে এর মাধ্যমে সম্পাদিত ফাইলগুলিতে পঠিত বা সম্ভবত লেখা হয় mmap()mmap()সিস্টেম কলগুলির সন্ধানে আপনি কিছু খেয়াল করেছেন ।

আপনি যদি শেল বিল্টিনের /usr/bin/timeপরিবর্তে প্রোগ্রামটি ব্যবহার করে থাকেন তবে timeআপনিও লক্ষ্য করতে পারেন:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorপেজফোল্টগুলি হ'ল ফাইল সিস্টেম আইও দরকার। minorপেজফল্টগুলি অনেক কম তাৎপর্যপূর্ণ (সম্ভবত কেবলমাত্র একটি "টিএলবি মিস")।

আমার সন্দেহ inputsহয় যে মোট পৃষ্ঠাগুলি সংখ্যা পড়েছে। বর্তমানে, আমি মনে করি ফাইল ম্যাপ করা পৃষ্ঠাগুলি সর্বদা একই আকার। 4096 বাইট বেশিরভাগ ক্ষেত্রে, তবে আপনি চেক করতে পারেন getconf PAGESIZE

সুতরাং এটি ~ 290 মেগাবাইট প্রতিনিধিত্ব করে, প্রতি সেকেন্ডে 100 মেগাবাইটের বেশি কিছু পড়ুন, আমার মতো হার্ড ডিস্কের জন্য একটি মানক গতি। রহস্য সমাধান!


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

straceসিস্টেম কলের কারণে যখন প্রক্রিয়া কার্নেলটি প্রবেশ করে (এবং তারপরে ছেড়ে যায়) কেবল তখন তা দেখায়। অথবা যখন ইউনিক্স সিগন্যাল সরবরাহ করা হয়। তবে অন্যান্য ধরণের বাধা রয়েছে যা straceএকেবারেই দেখা যায় না। সুতরাং এর অন্তর্ভুক্ত

  • পৃষ্ঠা ত্রুটি।
  • টাইমার বিঘ্নিত। এটি আলাদা প্রক্রিয়ায় স্যুইচ করার জন্য ব্যবহৃত হয়, যখন বর্তমানটি সিপিইউতে তার বরাদ্দ সময় স্লাইস শেষ করে দেয়।

1
ভাল উত্তর, অভিনন্দন! এটি যে সরঞ্জামগুলির দ্বারা ব্যবহৃত হচ্ছে তার সীমাবদ্ধতাগুলি বোঝা সত্যিই গুরুত্বপূর্ণ। +1; আমি এই বিষয়গুলিও উপভোগ করছি: unix.stackexchange.com/questions/418354/… এবং unix.stackexchange.com/questions/419697/…
রুই এফ রিবেইরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.