সময়ের আউটপুটে 'রিয়েল', 'ইউজার' এবং 'সিস' বলতে কী বোঝায়?


1743
$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

সময়ের আউটপুটে 'রিয়েল', 'ইউজার' এবং 'সিস' বলতে কী বোঝায়?

আমার অ্যাপটি বেঞ্চমার্ক করার সময় কোনটি অর্থবহ?


2
আমি কীভাবে তাদের একটিতে অ্যাক্সেস করতে পারি? যেমন ঠিক সময়?
মোজতাবা আহমদী

1
@ কনসার্নডঅফ টিউনব্রিজ ওয়েলস
মোজতাবা আহমেদী


7
যদি আপনার প্রোগ্রামটি দ্রুত থেকে প্রস্থান করে, সেগুলির কোনওটিই অর্থবহ নয়, এটি কেবলমাত্র ওভারহেডের স্টার্টআপ। আপনি যদি পুরো প্রোগ্রামটি দিয়ে পরিমাপ করতে চান তবে timeএটি এমন কিছু করুন যা কমপক্ষে এক সেকেন্ড সময় নেবে।
পিটার

5
এটি timeএকটি বাশ কীওয়ার্ড তা লক্ষ করা সত্যই গুরুত্বপূর্ণ । তাই টাইপিং man timeকরা হয় না আপনি ব্যাশ জন্য একজন লোক পৃষ্ঠা দান time, বরং তার জন্য man পৃষ্ঠা দিচ্ছেন /usr/bin/time। এটি আমাকে ছড়িয়ে দিয়েছে।
বিরক্তিকর_এফডি_সান্দ্রাম

উত্তর:


2057

বাস্তব, ব্যবহারকারী এবং সিস প্রক্রিয়া সময়ের পরিসংখ্যান

এই জিনিসগুলোর একটি আরেকটার মতো না। রিয়েল প্রকৃত অতিবাহিত সময়কে বোঝায়; ব্যবহারকারী এবং সিসগুলি কেবল প্রক্রিয়া দ্বারা ব্যবহৃত সিপিইউ সময়কে বোঝায়

  • রিয়েল হ'ল দেয়ালের ঘড়ির সময় - কলটি শুরু থেকে শেষের সময়। এটি অন্যান্য প্রসেস দ্বারা ব্যবহৃত সময় স্লাইস এবং প্রক্রিয়াটি অবরুদ্ধ করতে ব্যয় করার সময় সহ সমস্ত সময় অতিবাহিত হয় (উদাহরণস্বরূপ যদি এটি I / O সম্পূর্ণ হওয়ার অপেক্ষায় থাকে)।

  • ব্যবহারকারী CPU- র সময় (কার্নেল বাইরে) ব্যবহারকারী-মোড কোডে অতিবাহিত পরিমাণ মধ্যে প্রক্রিয়া। প্রক্রিয়াটি কার্যকর করতে এটি কেবল আসল সিপিইউ সময়। অন্যান্য প্রক্রিয়া এবং প্রক্রিয়া অবরুদ্ধ সময় ব্যয় করে এই চিত্রের দিকে গণনা করা হয় না।

  • প্রক্রিয়াটির মধ্যে কার্নেলের মধ্যে সিপিইউ সময় ব্যয় করে সিস ys এর অর্থ কার্নেলের মধ্যে সিস্টেম কলগুলিতে ব্যয় করা সিপিইউ সময় কার্যকর করা, লাইব্রেরি কোডের বিপরীতে, যা এখনও ব্যবহারকারী-স্পেসে চলছে। 'ব্যবহারকারীর' মতো, এটি কেবলমাত্র প্রক্রিয়া দ্বারা ব্যবহৃত সিপিইউ সময়। কার্নেল মোড ('সুপারভাইজার' মোড হিসাবে পরিচিত) এবং সিস্টেম কল প্রক্রিয়া সম্পর্কে একটি সংক্ষিপ্ত বিবরণ জন্য নীচে দেখুন।

User+Sysআপনার প্রক্রিয়াটি কতটা আসল সিপিইউ ব্যবহার করেছে তা আপনাকে বলবে। নোট করুন যে এটি সমস্ত সিপিইউ জুড়ে রয়েছে, সুতরাং যদি প্রক্রিয়াটির একাধিক থ্রেড থাকে (এবং এই প্রক্রিয়াটি একাধিক প্রসেসরের সাথে কম্পিউটারে চলমান থাকে) তবে এটি সম্ভবত Real(যা সাধারণত ঘটে থাকে) রিপোর্ট করা প্রাচীর ঘড়ির সময় অতিক্রম করতে পারে । নোট করুন যে আউটপুটে এই পরিসংখ্যানগুলিতে সমস্ত শিশু প্রক্রিয়া (এবং তাদের বংশধর) এর সময় Userএবং Sysসময় অন্তর্ভুক্ত রয়েছে যখন তারা সংগ্রহ করা যেতে পারে, উদাহরণস্বরূপ wait(2)বা দ্বারা waitpid(2), যদিও অন্তর্নিহিত সিস্টেম কলগুলি প্রক্রিয়া এবং এর শিশুদের জন্য পৃথকভাবে পরিসংখ্যান ফিরিয়ে দেয়।

রিপোর্ট করেছেন পরিসংখ্যানগুলির উত্স time (1)

দ্বারা প্রতিবেদন করা পরিসংখ্যান timeবিভিন্ন সিস্টেম কল থেকে সংগ্রহ করা হয়। 'ব্যবহারকারী' এবং 'সিস' নির্দিষ্ট সিস্টেমের উপর নির্ভর করে wait (2)( পসিক্স ) বা times (2)( পসিক্স ) থেকে আসে । 'রিয়েল' gettimeofday (2)কল থেকে সংগ্রহ করা শুরু এবং শেষ সময় থেকে গণনা করা হয় । সিস্টেমের সংস্করণ অনুসারে অন্যান্য অন্যান্য পরিসংখ্যান যেমন প্রসঙ্গের সুইচের সংখ্যাও সংগ্রহ করা যেতে পারে time

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

কার্নেল বনাম বনাম ব্যবহারকারী মোডের একটি সংক্ষিপ্ত প্রাইমার

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

সুবিধাপ্রাপ্ত মোডটি সাধারণত 'কার্নেল' মোড হিসাবে পরিচিত কারণ কার্নেলটি এই মোডে চলমান সিপিইউ দ্বারা চালিত হয়। কার্নেল মোডে স্যুইচ করার জন্য আপনাকে একটি নির্দিষ্ট নির্দেশ প্রদান করতে হবে (প্রায়শই একটি ট্র্যাপ বলা হয় ) যা সিপিইউকে কার্নেল মোডে চলতে স্যুইচ করে এবং একটি জাম্প টেবিলের মধ্যে থাকা নির্দিষ্ট স্থান থেকে কোড চালায়। সুরক্ষার কারণে আপনি কার্নেল মোডে স্যুইচ করতে পারবেন না এবং নির্বিচারে কোডটি চালাতে পারবেন না - ফাঁদগুলি এমন ঠিকানাগুলির একটি টেবিলের মাধ্যমে পরিচালিত হয় যা সিপিইউ সুপারভাইজার মোডে চলমান না থাকলে লেখা যায় না। আপনি একটি স্পষ্ট ফাঁদ নম্বর দিয়ে ফাঁদে এবং ঠিকানাটি জাম্প টেবিলটিতে সন্ধান করা হবে; কার্নেলের সীমিত সংখ্যক নিয়ন্ত্রিত এন্ট্রি পয়েন্ট রয়েছে।

সি লাইব্রেরিতে 'সিস্টেম' কলগুলিতে (বিশেষত ম্যান পৃষ্ঠাগুলির বিভাগ 2 এ বর্ণিত) এর একটি ব্যবহারকারী-মোড উপাদান রয়েছে যা আপনি নিজের সি প্রোগ্রাম থেকে আসলে কল করেন। পর্দার আড়ালে, তারা I / O এর মতো নির্দিষ্ট পরিষেবাগুলি করতে কর্নেলকে এক বা একাধিক সিস্টেম কল জারি করতে পারে তবে তাদের ইউজার-মোডে কোড চলমান রয়েছে। ইচ্ছুক হলে যে কোনও ব্যবহারকারীর স্পেস কোড থেকে কার্নেল মোডে সরাসরি একটি ট্র্যাপ ইস্যু করা বেশ সম্ভব, যদিও কলটির জন্য নিবন্ধগুলি সঠিকভাবে সেট আপ করতে আপনাকে সমাবেশ ভাষার একটি স্নিপেট লিখতে হতে পারে।

'Sys' সম্পর্কে আরও

এমন কিছু জিনিস রয়েছে যা আপনার কোডটি ব্যবহারকারী মোড থেকে করতে পারে না - মেমরি বরাদ্দকরণ বা হার্ডওয়্যার অ্যাক্সেস করার মতো জিনিস (এইচডিডি, নেটওয়ার্ক ইত্যাদি)। এগুলি কার্নেলের তত্ত্বাবধানে রয়েছে এবং কেবল এটিই সেগুলি করতে পারে। এর মতো কিছু / mallocঅথবা এই কার্নেল ফাংশনগুলির অনুরোধ জানাবে এবং তারপরে 'sys' সময় হিসাবে গণ্য হবে। দুর্ভাগ্যক্রমে এটি এতটা সহজ নয় যে "ম্যালোকের প্রতিটি কলই 'সময়" গণনা করা হবে "। কলটি তার নিজস্ব কিছু প্রক্রিয়াজাতকরণ করবে (এখনও 'ব্যবহারকারীর সময় গণনা করা) এবং তারপরে কোথাও এটি কার্নেলে ফাংশনটি কল করতে পারে (' সিস্টেমে গণনা করা ')) কার্নেল কল থেকে ফিরে আসার পরে, 'ব্যবহারকারী' এবং তারপরে আরও কিছু সময় আসবেfreadfwritemallocmallocআপনার কোড ফিরে আসবে। যখন স্যুইচটি ঘটে এবং এর কতটা কার্নেল মোডে ব্যয় হয় ... আপনি বলতে পারবেন না। এটি গ্রন্থাগারের বাস্তবায়নের উপর নির্ভর করে। এছাড়াও, অন্যান্য আপাতদৃষ্টিতে নিরীহ ফাংশনগুলিও ব্যবহার করতে পারে mallocএবং ব্যাকগ্রাউন্ডে এর মতো, যা আবার 'সিস' এর জন্য কিছুটা সময় পাবে।


15
শিশু প্রক্রিয়াগুলিতে ব্যয় করা সময়টি কি বাস্তব / সিসে গণনা করা হয়?
রন

1
@ আয়রন - লিনাক্স ম্যান পৃষ্ঠা অনুসারে, এটি প্রক্রিয়া সময়ের সাথে 'সি' বারগুলিকে একত্রিত করে, তাই আমার মনে হয় এটি হয়। যদিও পিতামাতার সময় এবং সন্তানের সময়গুলি কল (2) কল থেকে পৃথকভাবে উপলব্ধ। আমি অনুমান করি সোলারিস / এসআইএসভি সংস্করণের সময় (1) তেমন কিছু করে।
কনসার্নড

3
ব্যবহারকারী + সিস আপনাকে একটি প্রক্রিয়ার সিপিইউ ব্যবহার পরিমাপ করতে দেয়। আপনি এটি মানদণ্ডের কর্মক্ষেত্রে ব্যবহার করতে পারেন। এটি বিশেষত মাল্টি-থ্রেড কোডের জন্য দরকারী যেখানে একাধিক সিপিইউ কোর একটি গণনায় কাজ করতে পারে।
কনফারডঅফটুনব্রিজ

1
বিষয়টিতে সুনির্দিষ্টভাবে নয়, তবুও: "\ সময় <সিএমডি>" চালানো আকর্ষণীয় - এটি আরও বিশদ সরবরাহ করে: (মন্তব্যে দুর্বল বিন্যাসটি ক্ষমা করুন): ps সময় পিএস পিআইডি টিটিওয়াই টাইম সিএমডি 9437 পিটিস / 19 00:00:00 বাশ 11459 পিটিএস / 19 00:00:00 পিএস রিয়েল 0m0.025s ব্যবহারকারী 0m0.004s sys 0m0.018s \ সময় পিএস পিআইডি টিটিওয়াই টাইম সিএমডি 9437 পিটিস / 19 00:00:00 বাশ 11461 পিটিএস / 19 00:00:00 সময় 11462 পিটিএস / 19 00:00:00 পিএস 0.00 ব্যবহারকারীর 0.01 সিস্টেম 0: 00.02 95% সিপিইউ বিভক্ত (0avgtext + 0avgdata 2160 ম্যাক্সারসিসিডেন্ট) কে 0 ইনপুট + 0 আউটপুট (0 মজোর + 103 মিনার) পেজফল্ট 0 সেপ্পস $
কাইওয়ান

1
(পূর্বের মন্তব্যে চরিত্রগুলি ছাপিয়ে গেছে): আরও বিশদ? পারফ ব্যবহার করুন [1], [2]। [1] perf.wiki.kernel.org/index.php/Main_Page [2] brendangregg.com/perf.html
কাইওয়ান

285

উপর প্রসারিত করতে গৃহীত উত্তর , আমি শুধু অন্য কারণ কেন প্রদান করতে চেয়েছিলেন realuser+ + sys

মনে রাখবেন যে realপ্রকৃত সময় অতিবাহিত সময়কে উপস্থাপন করে, userএবং sysমানগুলি সিপিইউ সম্পাদনের সময়কে উপস্থাপন করে। ফলস্বরূপ, একটি মাল্টিকোর সিস্টেমে, userএবং / অথবা sysসময় (পাশাপাশি তাদের যোগফল) প্রকৃত সময়কে অতিক্রম করতে পারে । উদাহরণস্বরূপ, একটি জাভা অ্যাপে আমি ক্লাসে দৌড়াচ্ছি আমি এই মানগুলির সেটটি পাই:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

11
আমি সবসময় এই সম্পর্কে ভাবতাম। যেহেতু আমি জানি যে আমার প্রোগ্রামগুলি একক থ্রেডযুক্ত, তাই ব্যবহারকারী এবং বাস্তব সময়ের মধ্যে পার্থক্যটি অবশ্যই ভিএম ওভারহেড হওয়া উচিত, সঠিক?
কোয়ান্টাম

9
অগত্যা নয়; সোলারিস মেশিনে সান জেভিএম পাশাপাশি ম্যাক ওএস এক্সে অ্যাপলের জেভিএম এমনকি একক থ্রেডেড অ্যাপ্লিকেশনগুলিতেও একাধিক কোর ব্যবহার করতে পারে। আপনি যদি জাভা প্রক্রিয়াটির নমুনা করেন তবে দেখবেন যে আবর্জনা সংগ্রহের মতো জিনিসগুলি পৃথক থ্রেডে চালিত হয় (এবং কিছু অন্যান্য জিনিসও যা আমার মাথার উপরের দিক থেকে মনে নেই)। আপনি যদি সত্যিই সেই "ভিএম ওভারহেড" বলতে চান তবে আমি জানি না।
লেন্সভেট

4
আমার ধারণা, আপ-ভোটের পরিমাণ আপনাকে এখন যথেষ্ট খ্যাতি দিয়েছে: ডি। সুতরাং আপনি realঅতিক্রম userএবং sysমোট সম্পর্কে কি মনে করেন ? ওএস ওভারহেড যেমন থ্রেড প্রসঙ্গে সুইচিং হতে পারে?
মুহাম্মদ জেলবানা

19
আর একটি সম্ভাব্য সমস্যা আই / ও হতে পারে: যদি আপনার অ্যাপ্লিকেশন কোনও ফাইল বা প্রবাহ পাওয়ার জন্য অপেক্ষা করতে খুব ভাল সময় ব্যয় করে তবে অবশ্যই বাস্তব সময়টি ব্যবহারকারীর / সময়কালকে ছাড়িয়ে যাবে কারণ অ্যাক্সেসের জন্য অপেক্ষা করার সময় কোনও সিপিইউ সময় ব্যবহৃত হয় না because একটি ফাইল বা অনুরূপ কিছু।
লেন্সভেট

1
@ মুহাম্মাদ জেলবানা - যদি কোনও কারণে অ্যাপ্লিকেশনটি কার্যকর করতে বাধা দেওয়া হয় তবে এটি ঘটতে পারে। উদাহরণস্বরূপ, যদি এটি I / O, IPC বা সকেট সংযোগের অপেক্ষায় থাকে তবে এটি নিষ্ক্রিয় হয়ে বসে থাকবে, ব্লকিং কল রিটার্ন না হওয়া পর্যন্ত কোনও সিপিইউ সময় জমে না।
কনসার্নড

41

আসল : প্রক্রিয়াটি শুরু থেকে শেষ পর্যন্ত চালানোর ক্ষেত্রে ব্যয় করা আসল সময়, যেন কোনও স্টপ ওয়াচ দিয়ে কোনও মানুষ এটি পরিমাপ করে

ব্যবহারকারী : গণনার সময় সমস্ত সিপিইউ দ্বারা ব্যয় করা संचयी সময়

sys : ক্রমসঞ্চিত সময় যেমন মেমরি বরাদ্দ সিস্টেম-সম্পর্কিত কাজগুলো এ সব কিছুই অনেক সিপিইউ দ্বারা কাটিয়েছি।

লক্ষ্য করুন যে কখনও কখনও ব্যবহারকারী + সিসগুলি বাস্তবের চেয়ে বড় হতে পারে, কারণ একাধিক প্রসেসর সমান্তরালভাবে কাজ করতে পারে।


sysসিপিইউ-সময় কি সিস্টেম কলগুলিতে (এবং পৃষ্ঠা-ফল্ট হ্যান্ডলারগুলি) ব্যয় করেছে
পিটার

1
realপ্রায়শই "দেয়াল-ঘড়ি" সময় হিসাবে বর্ণনা করা হয়।
পিটার

30

ন্যূনতম চলমান POSIX সি উদাহরণ

জিনিসগুলিকে আরও কংক্রিট করার জন্য, আমি timeকয়েকটি ন্যূনতম সি পরীক্ষা প্রোগ্রামের সাথে কয়েকটি চরম মামলার উদাহরণ দিতে চাই ।

সমস্ত প্রোগ্রাম সংকলিত এবং এর সাথে চালানো যেতে পারে:

gcc -ggdb3 -o main.out -pthread -std=c99 -pedantic-errors -Wall -Wextra main.c
time ./main.out

এবং উবুন্টু 18.10, জিসিসি 8.2.0, গ্লিবসি 2.28, লিনাক্স কার্নেল 4.18, থিঙ্কপ্যাড পি 51 ল্যাপটপ, ইন্টেল কোর আই 7-7820 এইচকিউ সিপিইউ (4 কোর / 8 থ্রেড), 2 এক্স স্যামসুং এম 471 এ 2 কে 43 বিবি 1-সিআরসি র‌্যাম (2x 16 জিবিবি) পরীক্ষা করা হয়েছে।

ঘুম

অ-ব্যস্ত ঘুম কেবল userবা sysকেবলমাত্র গণনা করে না real

উদাহরণস্বরূপ, এমন একটি প্রোগ্রাম যা সেকেন্ডের জন্য ঘুমায়:

#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    sleep(1);
    return EXIT_SUCCESS;
}

গিটহাব উজানের দিকে

ফলাফল কিছু:

real    0m1.003s
user    0m0.001s
sys     0m0.003s

আইও উপলব্ধ হয়ে ওঠার জন্য অবরুদ্ধ কর্মসূচিগুলির জন্য একই ধার্য।

উদাহরণস্বরূপ, নিম্নলিখিত প্রোগ্রামটি ব্যবহারকারী একটি অক্ষর প্রবেশ করানোর জন্য অপেক্ষা করে এবং এন্টার টিপুন:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("%c\n", getchar());
    return EXIT_SUCCESS;
}

গিটহাব উজানের দিকে

এবং যদি আপনি প্রায় এক সেকেন্ডের জন্য অপেক্ষা করেন, তবে এটি ঘুমের উদাহরণের মতো ফলাফল দেয়:

real    0m1.003s
user    0m0.001s
sys     0m0.003s

এই কারণে timeআপনাকে সিপিইউ এবং আইও বাউন্ড প্রোগ্রামগুলির মধ্যে পার্থক্য করতে সহায়তা করতে পারে: "সিপিইউ বাউন্ড" এবং "আই / ও বাউন্ড" শব্দের অর্থ কী?

একাধিক থ্রেড

নিম্নলিখিত উদাহরণটি থ্রেডগুলিতে nitersবেহুদা বিশুদ্ধ সিপিইউযুক্ত কাজের পুনরাবৃত্তি করে nthreads:

#define _XOPEN_SOURCE 700
#include <assert.h>
#include <inttypes.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

uint64_t niters;

void* my_thread(void *arg) {
    uint64_t *argument, i, result;
    argument = (uint64_t *)arg;
    result = *argument;
    for (i = 0; i < niters; ++i) {
        result = (result * result) - (3 * result) + 1;
    }
    *argument = result;
    return NULL;
}

int main(int argc, char **argv) {
    size_t nthreads;
    pthread_t *threads;
    uint64_t rc, i, *thread_args;

    /* CLI args. */
    if (argc > 1) {
        niters = strtoll(argv[1], NULL, 0);
    } else {
        niters = 1000000000;
    }
    if (argc > 2) {
        nthreads = strtoll(argv[2], NULL, 0);
    } else {
        nthreads = 1;
    }
    threads = malloc(nthreads * sizeof(*threads));
    thread_args = malloc(nthreads * sizeof(*thread_args));

    /* Create all threads */
    for (i = 0; i < nthreads; ++i) {
        thread_args[i] = i;
        rc = pthread_create(
            &threads[i],
            NULL,
            my_thread,
            (void*)&thread_args[i]
        );
        assert(rc == 0);
    }

    /* Wait for all threads to complete */
    for (i = 0; i < nthreads; ++i) {
        rc = pthread_join(threads[i], NULL);
        assert(rc == 0);
        printf("%" PRIu64 " %" PRIu64 "\n", i, thread_args[i]);
    }

    free(threads);
    free(thread_args);
    return EXIT_SUCCESS;
}

গিটহাব আপস্ট্রিম + প্লট কোড

তারপরে আমরা আমার 8 হাইপারথ্রেড সিপিইউতে স্থির 10 ^ 10 পুনরাবৃত্তির জন্য থ্রেডের সংখ্যার ফাংশন হিসাবে প্রাচীর, ব্যবহারকারী এবং সিস প্লট করি:

এখানে চিত্র বর্ণনা লিখুন

প্লট ডেটা

গ্রাফ থেকে আমরা দেখতে পাচ্ছি:

  • সিপিইউ নিবিড় একক কোর অ্যাপ্লিকেশনটির জন্য, প্রাচীর এবং ব্যবহারকারী প্রায় একই রকম

  • 2 টি কোরের জন্য ব্যবহারকারী প্রায় 2x প্রাচীর, যার অর্থ ব্যবহারকারীর সময়টি সমস্ত থ্রেডে গণনা করা হয়।

    ব্যবহারকারী মূলত দ্বিগুণ, এবং প্রাচীর একই থাকাকালীন।

  • এটি 8 টি থ্রেড পর্যন্ত অব্যাহত থাকে যা আমার কম্পিউটারে আমার হাইপারথ্রেডগুলির সংখ্যার সাথে মেলে।

    8 এর পরে, প্রাচীরটিও বাড়তে শুরু করে, কারণ নির্দিষ্ট সময় মতো আরও কাজ করার জন্য আমাদের কোনও অতিরিক্ত সিপিইউ নেই!

    এই সময়ে অনুপাতের মালভূমি।

মনে রাখবেন যে এই গ্রাফটি কেবলমাত্র পরিষ্কার এবং সহজ কারণ কাজটি সম্পূর্ণ সিপিইউ-বাউন্ডড: যদি এটি মেমরির সীমাবদ্ধ থাকে তবে আমরা কম কোর দিয়ে পারফরম্যান্সে অনেক আগেই পতিত হব কারণ মেমরির অ্যাকসেসগুলি কী হিসাবে দেখানো হয়েছে তেমন একটি বাধা হতে পারে What "সিপিইউ বাউন্ড" এবং "আই / ও বাউন্ড" শব্দগুলি কি বোঝায়?

সঙ্গে ভারী কাজ sys sendfile

আমি যে ভারীতম কাজের কাজের চাপটি নিয়ে আসতে পারি তা হ'ল sendfileকার্নেল স্পেসে একটি ফাইল অনুলিপি অপারেশন করে: একটি ফাইলকে বুদ্ধিমান, নিরাপদ এবং দক্ষ উপায়ে অনুলিপি করুন

সুতরাং আমি কল্পনা করেছি যে এই ইন-কার্নেলটি memcpyসিপিইউ নিবিড় অপারেশন হবে।

প্রথমে আমি একটি বৃহত 10GiB এলোমেলো ফাইলটি এর সাথে শুরু করি:

dd if=/dev/urandom of=sendfile.in.tmp bs=1K count=10M

তারপরে কোডটি চালান:

#define _GNU_SOURCE
#include <assert.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char *source_path, *dest_path;
    int source, dest;
    struct stat stat_source;
    if (argc > 1) {
        source_path = argv[1];
    } else {
        source_path = "sendfile.in.tmp";
    }
    if (argc > 2) {
        dest_path = argv[2];
    } else {
        dest_path = "sendfile.out.tmp";
    }
    source = open(source_path, O_RDONLY);
    assert(source != -1);
    dest = open(dest_path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    assert(dest != -1);
    assert(fstat(source, &stat_source) != -1);
    assert(sendfile(dest, source, 0, stat_source.st_size) != -1);
    assert(close(source) != -1);
    assert(close(dest) != -1);
    return EXIT_SUCCESS;
}

গিটহাব উজানের দিকে

যা প্রত্যাশা অনুযায়ী মূলত সিস্টেম সময় দেয়:

real    0m2.175s
user    0m0.001s
sys     0m1.476s

আমি জানতে আগ্রহী ছিলাম যে timeবিভিন্ন প্রক্রিয়ার সিস্টেমে কল করার মধ্যে পার্থক্য আছে কি না, তাই আমি চেষ্টা করেছিলাম:

time ./sendfile.out sendfile.in1.tmp sendfile.out1.tmp &
time ./sendfile.out sendfile.in2.tmp sendfile.out2.tmp &

এবং ফলাফল ছিল:

real    0m3.651s
user    0m0.000s
sys     0m1.516s

real    0m4.948s
user    0m0.000s
sys     0m1.562s

সিস্টেমে সময় একক প্রক্রিয়া হিসাবে উভয়ের জন্য একই, কিন্তু প্রাচীর সময় বৃহত্তর কারণ প্রক্রিয়া ডিস্ক রিড অ্যাক্সেস সম্ভবত প্রতিযোগিতা হয়।

সুতরাং মনে হচ্ছে এটি বাস্তবে অ্যাকাউন্টের জন্য রয়েছে যার জন্য কোনও প্রদত্ত কার্নেল কাজ শুরু করে।

বাশ সোর্স কোড

আপনি যখন কেবল time <cmd>উবুন্টুতে কাজ করেন, এটি বাশ কীওয়ার্ডটি ব্যবহার করে যা দেখতে পাওয়া যায়:

type time

কোন ফলাফল:

time is a shell keyword

সুতরাং আমরা আউটপুট স্ট্রিংয়ের জন্য বাশ 4.19 উত্স কোডে উত্সটি গ্রেপ করি:

git grep '"user\b'

যা আমাদের এক্সিকিউট_সিএমডি.সি ফাংশনে নিয়ে যায় time_command, যা ব্যবহার করে:

  • gettimeofday()এবং getrusage()যদি উভয় উপলব্ধ
  • times() অন্যভাবে

যার সবগুলি লিনাক্স সিস্টেম কল এবং পসিক্স ফাংশন

GNU Coreutils উত্স কোড

যদি আমরা এটিকে কল করি:

/usr/bin/time

তারপরে এটি GNU Coreutils বাস্তবায়ন ব্যবহার করে।

এইটি কিছুটা জটিল, তবে প্রাসঙ্গিক উত্সটি resuse.cউপস্থিত বলে মনে হচ্ছে এবং এটি করে:

  • wait3যদি পাওয়া যায় তবে একটি নন-পসিক্স বিএসডি কল
  • timesএবং gettimeofdayঅন্যথায়

14

প্রক্রিয়াটির জন্য রিয়েল মোট টার্ন-এয়ার টাইম দেখায়; যখন ব্যবহারকারী ব্যবহারকারী-সংজ্ঞায়িত নির্দেশাবলীর জন্য মৃত্যুর সময় দেখায় এবং সিস্টেমে সিস্টেম কল সম্পাদনের জন্য সময় হয়!

আসল সময়টিতে অপেক্ষার সময়ও অন্তর্ভুক্ত থাকে (I / O ইত্যাদির অপেক্ষার সময়)

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