بعد از چندین ماه که اینجا رو به‌روز نکردم، امروز می‌خوام با ترجمه‌ی مقاله‌ای با عنوان Understanding Linux CPU Load، یه حالی بهش بدم!

چندین بار برای خودم سؤال پیش اومده بود که اصلا این load average که بارها باهاش مواجه شدم چیه؟! اما هر بار به هردلیلی نشد برم دنبالش و پیداش کنم، تا اینکه امروز این کارو کردم. البته ممکن است شما با load average یا میانگین بار در لینوکس آشنا باشید، اما اگر نیستید، با این مطلب همراه باشید.

میانگین بار (یا فشار) به صورت سه عدد نمایش داده می‌شود که با اجرای دستورات خط فرمان uptime و top می‌توانید ببینید. چیزی شبیه به این :

load averages: 0.22 0.22 0.24

اغلب افراد به صورت مختصر می‌دانند که این سه عدد، در حقیقیت میانگین بار را در سه دوره زمانی ( یک دقیقه، ۵ دیقیقه، ۱۵ دقیقه ) نشان می‌دهند و هرچقدر این اعداد کوچکتر باشند، بهتر است. عدد بزرگ نشان دهنده‌ی این است که مشکلی در سیستم بوجود آمده و یا ماشین اصطلاحا overload شده است. یعنی سیستم بار اضافی دارد.
اما چه اعدادی نشان دهنده «خوب» یا «بد» بودن میانگین بار سیستم هستند ؟
چه زمانی باید نگران بار اضافی سیستم باشیم و چه زمانی باید به فکر برطرف کردن مشکل بیافتیم ؟
برای درک بهتر موضوع، در ادامه با مثالی پیش می‌رویم و مساله را در ساده‌ترین حالت بررسی می‌کنیم : یک ماشین با یک پردازنده تک هسته‌ای.

مقایسه‌ی ترافیک
یک پردازنده تک هسته‌ای مشابه است با یک مسیر باریک ( مانند کوچه ) برای عبور و مرور. تصور کنید شما متصدی یک پل هستید …
زمانی ممکن است پل شلوغ باشد و همه ماشین‌ها در یک خط در عبور باشند. شما می‌خواهید به مردم اطلاع دهید که ترافیک روی پل به چه صورت است. یک راه خوب این است که بگویید چه تعداد ماشین در یک زمان خاص منتظر بوده‌اند. اگر هیچ ماشینی منتظر نمانده باشد، راننده‌هایی که در حال نزدیک شدن هستند می‌دانند که می‌توانند به راحتی از روی پل عبور نمایند. اگر قبل از پل ماشینی باشد، راننده‌ها می‌فهمند که عبورشان با تاخیر مواجه شده‌است.
بنابراین، متصدی پل از چه سیستم شماره‌گزاری باید استفاده کند ؟

۰.۰۰ یعنی هیچ ترافیکی روی پل نیست. در حقیقت هر عدد بین ۰.۰۰ و ۱.۰۰ به معنی این است که ترافیکی نیست و همه ماشین‌هایی که به پل می‌رسند، به راحتی می‌توانند از روی آن عبور کنند.
۱.۰۰ یعنی دقیقا ظرفیت پل تکمیل است. همچنان خوب است، اما اگر ترافیک کمی سنگین‌تر شود، عبور و مرور کند خواهد شد.
بیشتر از ۱.۰۰ یعنی ترافیک است. چقدر ترافیک است ؟ ۲.۰۰ یعنی در حال حاضر دو خط عبور ماشین است. یک خط روی پل است و خط دیگر در انتظار. ۳.۰۰ یعنی در حال حاضر سه خط عبور ماشین است، یکی روی پل و دو خط دیگر در انتظار و …
  = Load of 1.00
  = Load of 0.5
  = Load of 1.7

این یعنی میانگین بار پردازنده به صورت ساده! «ماشین‌ها» مانند پردازه‌هایی هستند که کمی از زمان پردازنده استفاده می‌کنند. ( ماشین در حال عبور از پل = پردازه‌ی در صف استفاده از پردازنده )
مانند متصدی پل، شما می‌خواهید ماشین‌ها / پردازه‌ها هرگز منتظر نمانند. بنابراین اگر بار پردازنده شما کمتر از ۱.۰۰ باشد، ایده‌آل است. همچنین مانند متصدی پل، اگر به صورت موقت این عدد به بیشتر از ۱.۰۰ برسد، همچنان مشکلی نخواهید داشت … اما اگر این عدد برای مدت زیادی بیشتر از ۱.۰۰ بماند، باید نگران شوید !

در مورد سیستم‌های چند پردازنده‌ای چطور؟
اگر شما سیستم ۴ پردازنده‌ای دارید، عدد ۳.۰۰ برای شما همچنان مناسب است !
در سیستم‌های چند پردازنده‌ای، میزان بار به تعداد هسته‌های فعال پردازنده بستگی دارد. عدد ۱.۰۰ بیانگر ۱۰۰٪ استفاده برای سیستم‌های تک هسته‌ای است. همینطور عدد ۲.۰۰ برای سیستم‌های ۲ هسته‌ای (Dual-Core) و عدد ۴ برای سیستم‌های ۴ هسته‌ای (Quad-Core) و … .

حال اگر به مثال ترافیک برگردیم، ۱.۰۰ دقیقا معادل یک خط ماشین است. برای یک پل با ظرفیت یک خط برای عبور، این به معنی پرشدن ظرفیت پل خواهد بود. برای یک پل با ۲ خط عبور، عدد ۱.۰۰ به معنی استفاده از ۵۰٪ ظرفیت پل است. یعنی فقط یک خط پر شده و یک خط دیگر برای عبور ماشین باز است.

= Load of 2.00 on two-lane road

به‌طور مشابه در مورد پردازنده‌ها، عدد ۱.۰۰ به معنی استفاده‌ی ۱۰۰٪ از پردازنده‌ی تک هسته‌ای است. برای پردازنده‌ی ۲ هسته‌ای، عدد ۲.۰۰ به معنی ۱۰۰٪ استفاده از پردازنده است.

چند هسته‌ای در مقایسه با چند پردازنده‌ای
اگر بخواهیم از لحاظ کارایی بررسی کنیم، آیا ماشینی با یک پردازنده ۲ هسته‌ای برابر است با ماشینی با ۲ پردازنده‌ی تک هسته‌ای ؟
بله!
البته اگر بخواهیم موشکافانه بررسی کنیم، موارد دیگری مانند میزان حافظه پنهان ( Cache )، فرکانس پردازه‌ای که بین پردازنده‌ها جا به جا می‌شود و … وجود دارد. با وجود این، برای بررسی میزان بار، دانستن تعداد هسته‌های پردازنده‌های واقعی کفایت می‌کند.
بنابراین نتیجه می‌گیریم :

در یک سیستم چند هسته‌ای، میزان بار نباید از تعداد هسته‌های سیستم تجاوز کند. ( تعداد هسته = بیشترین میزان بار )
  این مهم نیست که هسته‌ها بر روی چه تعداد پردازنده توزیع شده‌اند، بلکه تعداد هسته‌ها مهم است. ( ۲ پردازنده‌ی ۴ هسته‌ای = ۴ پردازنده‌ی ۲ هسته‌ای = ۸ پردازنده تک هسته‌ای )


امتحان کنید
به نمونه خروجی اجرای دستور uptime توجه کنید :

~ $ uptime
2:05  up 2 days,  4:05, 2 users, load averages: 0.47 0.40 0.34

این دستور بر روی لپ‌تاپ ۲ هسته‌ای من اجرا شده‌است و نشان می‌دهد که هنوز راه زیادی تا تکمیل شدن ظرفیت پردازنده باقی است! و من تا زمانیکه این عدد به بالاتر از ۱.۷ نرسد، نگران نخواهم شد !
همانطور که گفته شد، معنی این ۳ عدد به این صورت است :
۰.۴۷ یعنی میانگین در یک دقیقه گذشته،
۰.۴۰ یعنی میانگین در ۵ دقیقه گذشته،
۰.۳۴ یعنی میانگین در ۱۵ دقیقه گذشته.
با توجه به این اعداد ممکن است سؤال زیر برای شما ایجاد شود :

به کدام میانگین باید توجه کنیم ؟ ۱ دقیقه، ۵ دقیقه یا ۱۵ دقیقه ؟
برای عددی که در مورد آن صحبت کردیم ( ۱.۰۰ = مشکل را برطرف کن و … )، شما باید به میانگین ۵ یا ۱۵ دقیقه توجه کنید. یعنی اگر میانگین بار برای شما به بیشتر از ۱.۰۰ در بازه ۱ دقیقه رسید، وضعیت همچنان خوب است. زمانی که برای میانگین ۱۵ دقیقه این عدد به بیشتر از ۱.۰۰ رسید، باید دست بجنبانید و مشکل را برطرف کنید. ( توجه کنید، همانطور که گفته شد، این عدد به تعداد هسته‌های پردازنده(ها)‌ی شما بستگی دارد. )

از کجا بفهمیم سیستم ما چند هسته‌ای است ؟
در لینوکس برای دیدن اطلاعت پردازنده(ها) از دستور زیر استفاده کنید :

cat /proc/cpuinfo

البته این دستور برای Mac OS X جواب نمی‌دهد! چون اصلا مسیر proc/ وجود ندارد! کاربران مک می‌توانند از منوی اپل، گزینه‌ی About This Mac رو انتخاب کنند.
و در آخر اگر فقط می‌خواهید تعداد هسته‌ها را ببینید، از grep به صورت زیر استفاده کنید :

grep 'model name' /proc/cpuinfo | wc -l

این مطلب که خواندید، ترجمه‌ای آزاد بود از این مقاله.

بیشتر بخوانید :

کمی عمیق‌تر و دقیق‌تر در محاسبات : Wikipedia - A good, brief explanation of Load Average
عمیق‌تر از این پست و ویکی پدیا : Linux Journal - Very well-written article