فشار منابع را با شواهد تشخیص بده
در این درس ۳ بخش
سناریو: یک برنامه هنگام ساخت گزارش کند شده است. همکار شما load average بالا و حافظهٔ آزاد کم را میبیند و پیشنهاد افزایش RAM میدهد. هنوز معلوم نیست برنامه منتظر پردازنده، حافظه یا ورودیوخروجی است. هدف این درس تهیهٔ گزارشی کوتاه با زمان، نشانه و محدودیت اندازهگیری است؛ تغییردادن تنظیمات کرنل یا ایجاد بار مصنوعی بخشی از تمرین نیست. روی رایانهٔ خودتان و با کاربر معمولی کار کنید و هیچ پردازشی را صرفاً بهخاطر یک عدد متوقف نکنید.
هر عدد دقیقاً چه چیزی را میسنجد؟
در لینوکس load average میانگین تعداد کارهای آمادهٔ اجرا و کارهای در انتظار غیرقابلوقفه، معمولاً مرتبط با I/O، است. سه مقدار آن پنجرههای یک، پنج و پانزده دقیقه را توصیف میکنند؛ درصد مصرف CPU نیستند. عدد ۴ روی دستگاهی با دو CPU منطقی با همان عدد روی دستگاهی با شانزده CPU معنای یکسانی ندارد. حتی پس از پایان یک گرفتاری، میانگین ممکن است مدتی بالا بماند. تعداد CPUهای قابلمشاهده نیز لزوماً سهم مجاز یک کانتینر را نشان نمیدهد.
MemFree مقدار RAM کاملاً آزاد است. لینوکس از حافظه برای کش فایلها استفاده میکند، پس کمبودن این مقدار بهتنهایی کمبود RAM را اثبات نمیکند. MemAvailable برآورد فضای قابلاستفاده برای برنامههای جدید بدون swapping است و بازیافتپذیری بخشی از کش را لحاظ میکند. این مقدار تضمین موفقیت هر تخصیص نیست. روند نزولی آن همراه با افزایش توقف حافظه شواهد قویتری میدهد. وجود swap مصرفشده نیز با جابهجایی فعال صفحات در همین لحظه تفاوت دارد.
یک مشاهدهٔ کوتاه و محدود
date -Is
getconf _NPROCESSORS_ONLN
cat /proc/loadavg
awk '/^(MemTotal|MemFree|MemAvailable|SwapTotal|SwapFree):/ {print}' /proc/meminfo
vmstat 1 5
for resource in cpu memory io; do
if [ -r "/proc/pressure/$resource" ]; then
printf '\n%s\n' "$resource"
cat "/proc/pressure/$resource"
else
printf '%s: PSI unavailable\n' "$resource"
fi
doneاین فرمانها تنظیمی را عوض نمیکنند و نمونهگیری vmstat بعد از پنج گزارش پایان مییابد. اگر vmstat نصب نیست، خواندن فایلهای موجود را انجام دهید و نبود ابزار را ثبت کنید. نخستین گزارش vmstat برای نرخها میانگین از زمان راهاندازی است؛ گزارشهای بعدی بازههای یکثانیهایاند، درحالیکه وضعیت پردازش و حافظه لحظهای است. us و sy زمان CPU در فضای کاربر و کرنل، id بیکاری و wa زمان انتظار I/O را نشان میدهند. wa بهتنهایی نام دیسک یا علت کندی را مشخص نمیکند.
PSI میزان زمان متوقفماندن کارها بهعلت کمبود منابع را نشان میدهد. some یعنی دستکم بخشی از کارها متوقفاند؛ full یعنی همهٔ کارهای غیربیکار همزمان متوقفاند. avg10، avg60 و avg300 درصد زمان توقف در پنجرههای ده، شصت و سیصد ثانیهاند و total شمارندهٔ تجمعی میکروثانیه است. full برای CPU در سطح کل سیستم تعریف معناداری ندارد و صفر بودنش نشانهٔ سلامت قطعی نیست. نبود /proc/pressure میتواند ناشی از پیکربندی یا محدودیت محیط باشد؛ آن را صفر تلقی نکنید.
برای تعیین علت، نشانهها را در یک بازه کنار هم بگذارید. CPU پرکار با صف آمادهٔ طولانی فرضیهٔ محدودیت پردازش را تقویت میکند. CPU کمکار همراه با توقف io فرضیهٔ انتظار ذخیرهسازی را تقویت میکند؛ هنوز باید رفتار خود برنامه بررسی شود. در VM یا کانتینر، میزبان، سهم CPU و محدودیت حافظه میتوانند تصویر را ناقص کنند. فایلهای /proc مربوط به محیط جاریاند؛ خواندن اطلاعات پردازشهای دیگر نیز ممکن است محدود باشد. سراغ environ یا خروجی حاوی اطلاعات محرمانه نروید.
از مشاهده تا تصمیم
گزارش مفید بنویسید: «کندی بین ساعت مشخص رخ داد؛ در چهار بازهٔ یکثانیهای CPU بیشتر بیکار بود؛ MemAvailable افت محسوسی نداشت؛ PSI مربوط به io بالا رفت؛ علت دیسک هنوز تأیید نشده است.» زمان پاسخ خود برنامه و تکرار مشاهده هنگام رخداد بعدی، این فرضیه را قابلآزمایش میکند. با نمونهٔ کوتاه دربارهٔ تمام روز حکم ندهید و از تولید فایل عظیم، حلقهٔ سنگین یا خالیکردن کش برای ساختن عدد نمایشی استفاده نکنید.
تمرین: دو مشاهدهٔ فرضی دارید. در اولی load یکدقیقهای بالا، CPU بیشتر بیکار و io some رو به افزایش است. در دومی load بالا، us زیاد و cpu some رو به افزایش است. برای هرکدام یک فرضیه و یک شاهد تکمیلی پیشنهاد کنید. همچنین توضیح دهید چرا پایینبودن MemFree با MemAvailable مناسب، بهتنهایی درخواست خرید RAM را توجیه نمیکند.
پاسخ تشریحی: مشاهدهٔ اول انتظار I/O را محتمل میکند؛ زمان عملیات خواندن یا نوشتن برنامه را در همان بازه بررسی میکنیم. مشاهدهٔ دوم با رقابت برای CPU سازگار است؛ مدت کار محاسباتی و سهم CPU مجاز برنامه را بررسی میکنیم. هیچکدام علت نهایی را ثابت نمیکنند. در بخش حافظه، فضای کشِ قابلبازیافت میتواند فاصلهٔ دو مقدار را توضیح دهد؛ تصمیم ظرفیت به روند MemAvailable، توقف حافظه و نیاز واقعی برنامه وابسته است.
منابع رسمی انگلیسی:
loadavg: https://man7.org/linux/man-pages/man5/proc_loadavg.5.html
proc: https://docs.kernel.org/filesystems/proc.html
PSI: https://docs.kernel.org/accounting/psi.html
vmstat: https://man7.org/linux/man-pages/man8/vmstat.8.html
تألیف و مثالهای اختصاصی: تحریریه درسآوند. منابع رسمی انگلیسی برای مطالعهٔ تکمیلی معرفی شدهاند.
متن درسهای عمومی را بدون ورود بخوانید.