
به اشتراک بگذارید

به اشتراک بگذارید
خروجی uptime روی سرورتان نوشته load average: 3.50, 2.10, 1.20 و نمیدانید خبر بدی است یا نه؟ اول ببینیم load average چیست: میانگین تعداد کارهایی که روی پردازنده اجرا میشوند یا در صفش منتظرند، بهاضافه کارهای منتظر دیسک. این عدد واحد ندارد و بدون دانستن تعداد هستهها خوب یا بدش معلوم نمیشود.
| نسبت load به هسته | برداشت | اقدام |
|---|---|---|
| کمتر از ۰٫۷ | پردازنده جای خالی دارد | کاری لازم نیست |
| بین ۰٫۷ و ۱ | نزدیک ظرفیت کامل | عدد پانزدهدقیقهای را بپایید |
| بین ۱ و ۲ | کارها در صف میمانند | سهم پردازنده و دیسک را جدا کنید |
| بیشتر از ۲ و ماندگار | بیشتر سرورها کند شدهاند | همین حالا علت را پیدا کنید |
💡 با یک تقسیم بر nproc شروع کنید
عدد بار میانگین کارهای اجراشدنی و منتظر دیسک است و درصد نیست.
✅ آن را بر خروجی nproc تقسیم کنید و بعد جدول بالا را بخوانید.
✅ مرزهای جدول قاعده سرانگشتی تحریریه است؛ کرنل هیچ آستانه «امنی» تعریف نکرده.
پیش از ادامه uptime و nproc را روی سرور خودتان بزنید و هر پاسخ پایینتر را روی همین چهار عدد امتحان کنید. روی سرور مجازی عدد پنجمی هم هست، یعنی زمان انتظار پردازنده مجازی برای هسته فیزیکی؛ همین عدد پنجم کلید تشخیص اورسل سرور مجازی است.
📌 پرسشهایی که عدد بار پیش میکشد
◀️ سه عدد بار چه چیزی را میشمارند
◀️ عدد ۴ روی هستههای مختلف
◀️ سهم پردازنده یا دیسک
◀️ مرز خطر بار سرور

هر سه عدد کارهای در حال اجرا یا در صف پردازنده (وضعیت R) بهاضافه کارهای منتظر پایان I/O دیسک (وضعیت D) را میشمارند و فقط بازه میانگینگیریشان فرق دارد: یک و پنج و پانزده دقیقه.
صفحه راهنمای proc_loadavg(5) همین تعریف را برای فایل /proc/loadavg آورده و میگوید uptime هم همین سه عدد را نشان میدهد. تعریف لینوکس از اینکه load average چیست، «صف پردازنده بهاضافه صف انتظار» است. به خاطر نیمه دوم تعریف، سروری با پردازنده بیکار هم میتواند بار بالا نشان دهد.
در بزرگراهی چهاربانده، چهار ماشین در چهار لاین یعنی جاده پر است ولی همه حرکت میکنند؛ این همان بار ۴ روی سرور چهارهستهای است. حالا چند ماشین هم پشت باجه عوارضی متوقفاند و جلو نمیروند، اما شمارنده ترافیک لینوکس آنها را هم حساب میکند. کارهای وضعیت D همین ماشینهای بیحرکتاند.
برندن گرگ در مقاله Linux Load Averages: Solving the Mystery ایمیلی از سال ۱۹۹۳ را پیدا کرده که Matthias Urlichs با آن وصله شمردن کارهای غیرقابلوقفه را فرستاد. به نظر او پردازه منتظر I/O هم منابع مصرف میکند. به گفته گرگ، امروز بعضی قفلهای کرنل و NFS هم کار را به وضعیت D میبرند.
کرنل هر پنج ثانیه این کارها را میشمارد (ثابت LOAD_FREQ در loadavg.h) و عدد قبلی را با سهمی از نمونه تازه ترکیب میکند. در kernel/sched/loadavg.c تابع calc_load هر یک از سه عدد را از مقدار قبلی خودش میسازد؛ خلاصهاش load = load * exp + active * (1 - exp) است. به این نوع میانگین، میانگین میرا یا نمایی میگویند. به حساب گرگ، پس از یک دقیقه فقط حدود ۶۲ درصد عدد اول از همان دقیقه آمده و بقیه از قبلتر.
نتیجه آزمایش خودمان: روی یک ماشین مجازی دوهستهای (خروجی uname -r: 6.18.44) دو حلقه بیپایان پوسته را ۷۵ ثانیه اجرا کردیم و هر پانزده ثانیه /proc/loadavg را خواندیم:
start 0.65 0.20 0.06
t=15s 1.18 0.34 0.11
t=30s 1.58 0.47 0.16
t=60s 2.03 0.68 0.24
t=75s 2.39 0.83 0.30
stop+30s 1.84 0.85 0.32
عدد اول در شصت ثانیه به 2.03 رسید و عدد سوم فقط از 0.06 به 0.24. سی ثانیه بعد از توقف هم عدد اول هنوز 1.84 بود. عبور از ۲ به خاطر بار پسزمینه خود محیط بود. پیش از شروع 0.65 بود و فیلد چهارم فایل در طول آزمایش ۳ تا ۵ کار اجراشدنی نشان میداد.

خیر. اگر همه بار از پردازنده باشد، عدد ۴ روی سرور دوهستهای یعنی برای هر هسته دو کار که یکی در صف منتظر است. روی سرور هشتهستهای همین عدد یعنی نیمی از هستهها بیکارند.
راهنمای uptime(1) میگوید عدد بار بر تعداد پردازندهها نرمال نمیشود: بار ۱ روی سیستم تکپردازندهای یعنی همیشه مشغول و روی سیستم چهارپردازندهای یعنی ۷۵ درصد وقت بیکار. سؤال load average چیست بدون این تقسیم نیمهجواب میماند: عدد را بر شمار هستهها تقسیم کنید تا «بار بهازای هر هسته» به دست بیاید.
دستور nproc از بسته coreutils واحدهای پردازشی در دسترس پردازه فعلی را میشمارد. کرنل عدد بار را سراسری حساب میکند، پس اگر خروجی آن با nproc --all (که سهمیه CPU را نادیده میگیرد) فرق داشت، به دومی تکیه کنید. خروجی همان ماشین آزمایشی:
$ nproc
2
$ cat /proc/loadavg
0.65 0.20 0.06 3/101 28528
بار یکدقیقهای تقسیم بر ۲ میشود حدود ۰٫۳۳ برای هر هسته. طبق proc_loadavg(5)، 3/101 یعنی سه موجودیت اجراشدنی از ۱۰۱ موجودیت موجود و عدد آخر شناسه آخرین پردازه ساختهشده است. اگر فرق هسته فیزیکی با vCPU برایتان روشن نیست، راهنمای انتخاب CPU سرور را ببینید؛ روی سرور مجازی، خروجی nproc همان تعداد vCPU است که سیستمعامل مهمان میبیند.
⚠️ بار را با درصد مصرف پردازنده یکی نگیرید
عدد 2.00 یعنی «بهطور میانگین دو کار» و ربطی به ۲۰۰ درصد ندارد. درصد مصرف را در فیلدهای us و id دستور top ببینید.
دستور vmstat -y 1 5 را اجرا کنید: ستون r کارهای اجراشدنی و ستون b کارهای منتظر I/O را نشان میدهد. بار بالا همراه با wa بالا و پردازههای وضعیت D معمولاً یعنی گلوگاه دیسک.
راهنمای vmstat(8) ستون r را پردازههای اجراشدنی (در حال اجرا یا منتظر نوبت) و ستون b را پردازههای مسدود در انتظار پایان I/O تعریف میکند. پردازنده بیکار کنار بار بالا همان صحنهای است که خیلیها را به جستوجوی load average چیست میکشاند؛ این دو ستون تقریباً همان دو گروه عدد بارند. گزینه -y گزارش اول را که میانگین از زمان بوت است حذف میکند. ستون wa زمان انتظار برای I/O است، ولی مستندات کرنل (proc.rst) iowait را دقیق نمیداند و فقط نشانه است.
vmstat -y 1 5
در آزمایش دوم، dd با bs=4k و oflag=dsync روی یک فایل موقت در /tmp نوشت تا هر بلوک چهارکیلوبایتی با I/O همگام برود (فایل بعد از آزمایش پاک شد). یکی از خطهای vmstat (ستونهای میانی و ستون آخر حذف شده):
r b (...) us sy id wa st (...)
2 0 (...) 2 37 32 29 0 (...)
ستون wa بین ۲۶ تا ۲۹ درصد ماند. ستون b چه؟ در بیشتر نمونهها صفر. دلیل احتمالی: dd مدام بین اجرا و انتظار جابهجا میشد و vmstat فقط یک لحظه را میبیند.
🔸 فهرست پردازههای وضعیت D با ps
دستور زیر پردازههای وضعیت D را با تابع کرنلی که در آن خوابیدهاند (wchan) فهرست میکند.
ps -eo stat,pid,comm,wchan | grep '^D'
در آزمایش ما خروجی D 31191 dd submit_bio_wait بود. نام تابع یعنی dd منتظر تکمیل درخواست بلوکی دیسک است؛ اگر نام تابع به قفل یا NFS اشاره کند، مقصر دیسک محلی نیست. وضعیت D گذراست و خروجی خالی طبیعی است؛ دستور را چند بار تکرار کنید.

وقتی بار بهازای هر هسته مدت طولانی بالای ۱ بماند و عدد پانزدهدقیقهای رو به بالا باشد؛ بهخصوص اگر کاربران همزمان کندی ببینند. آستانه رسمی وجود ندارد و هر عددی که میشنوید قاعده سرانگشتی است.
گرگ مینویسد قاعده واقعی برای خوب یا بد بودن عدد بار وجود ندارد؛ سرور ایمیل دوپردازندهای با بار ۱۱ تا ۱۶ بیشکایت کار میکرد، ولی بیشتر سیستمها با نسبت حدود ۲ اذیت میشوند. حالا که میدانید load average چیست، جهت حرکت سه عدد را ببینید:
| الگوی سه عدد | نمونه سه عدد | برداشت |
|---|---|---|
| صعودی | ۶٫۱ و ۳٫۲ و ۱٫۴ | فشار تازه است؛ همین حالا vmstat را ببینید |
| نزولی | ۰٫۸ و ۲٫۵ و ۳٫۹ | اوج گذشته؛ علت را در لاگها بگردید |
| ثابت و بالا | ۳٫۹ و ۴٫۰ و ۴٫۱ روی دوهستهای | فشار مزمن؛ وقت برنامهریزی ظرفیت است |
| پایین ولی سرور کند | ۰٫۴ و ۰٫۵ و ۰٫۵ | گلوگاه بیرون از پردازنده و دیسک است |
ردیف آخر: پردازه منتظر شبکه معمولاً در وضعیت S است و در عدد بار نمینشیند.
🎯 آستانه پیشنهادی برای هشدار مانیتورینگ
پیشنهاد تحریریه: هشدار را روی عدد پانزدهدقیقهای تقسیم بر تعداد هسته بگذارید، چون عدد یکدقیقهای با هر جهش کوتاه هشدار بیمورد میسازد. نسبت ۱ «بررسی کنید» و نسبت ۲ «فوری»؛ بعد از چند هفته مرزها را با رفتار سرور خودتان تنظیم کنید.
عدد هنوز روی صفحه است و فرصت خواندن همه متن را ندارید؟ سه عدد را کنار خروجی nproc نگه دارید و از پرسش اول شروع کنید.
عدد ثابتی ندارد. بار تقسیم بر nproc زیر ۰٫۷ معمولاً جای خالی دارد و بالای ۲ بیشتر سرورها را کند میکند؛ هر دو مرز تجربیاند.
لینوکس کارهای وضعیت D را هم میشمارد؛ ستونهای b و wa در vmstat و فهرست D در ps مقصر را نشان میدهند.
عدد یکدقیقهای برای واکنش فوری و عدد پانزدهدقیقهای برای تصمیم درباره ظرفیت.
لزوماً نه. اگر همه بار از پردازنده باشد، یعنی هسته بهطور میانگین تمام وقت مشغول بوده؛ اما همین عدد از یک کار وضعیت D روی پردازنده بیکار هم ساخته میشود. میانگین یکدقیقهای هم ممکن است صفهای کوتاه را پنهان کند؛ ستونهای r و b در vmstat تصویر روشنتری میدهند.
حدود هر پنج ثانیه، طبق ثابت LOAD_FREQ در کد کرنل.
بله، با تقسیم بر vCPUها. اگر مقصر دیگری پیدا نشد، ستون st در top زمانی است که هایپروایزر از ماشین شما گرفته.
اول علت را جدا کنید. اگر بیشتر بار از کارهای وضعیت D است، آن کارها منتظر I/O یا قفلاند و اول باید سراغ همان منبع رفت. اگر ستون r مدام از تعداد هستهها بیشتر است، احتمالاً پردازنده کم آمده و ارتقا یا بهینهسازی برنامه منطقی است.
جمعبندی؛ load average چیست، در چهار جمله. عدد بار لینوکس میانگین میرای کارهای اجراشدنی و کارهای منتظر I/O است و بعد از تقسیم بر خروجی nproc معنا پیدا میکند. وقتی نسبت بالاست، با vmstat 1 و فهرست پردازههای وضعیت D سهم پردازنده و انتظار I/O را جدا کنید، چون راهحل این دو یکی نیست. برای هشدار عدد پانزدهدقیقهای را مبنا بگیرید و جهت سه عدد را کنار هم بخوانید. آستانههای این صفحه قاعده سرانگشتیاند.
🚀 بار بالا، بدون مقصر روشن
وقتی روی سرور مجازی نه ستون r مقصر است نه انتظار I/O، زمان انتظار vCPU برای هسته فیزیکی را بسنجید.
سه عدد uptime سرورتان، خروجی nproc و نوع کارش، مثلاً وب یا پایگاه داده، چیست؟ اگر نسبت از ۲ گذشته، یک خط vmstat همان لحظه را هم بیاورید.
منابع