آموزش سرور

بررسی مصرف CPU و رم سرور لینوکس با top، htop، free و vmstat

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

RAMCPUCPUtophtopآموزش سروربررسی مصرف CPU و رمسرور لینوکس با top،htop، free و vmstatمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای دیدن مصرف منابع سرور لینوکس، free -h وضعیت رم را نشان می‌دهد و ستون available مهم‌ترین عدد آن است، نه free. دستور top یا نسخهٔ گرافیکی‌ترش htop فرایندها را به ترتیب مصرف CPU یا رم مرتب می‌کند و load average بار سیستم را نسبت به تعداد هسته‌ها نشان می‌دهد. برای دیدن روند در طول زمان از vmstat و برای فهرست مرتب‌شدهٔ پرمصرف‌ها از ps استفاده کنید.

چرا باید مصرف منابع را درست بخوانید؟

بسیاری از تصمیم‌های مهم دربارهٔ سرور، مثل ارتقای پلن، بهینه‌سازی برنامه یا پیدا کردن علت کندی، به یک سؤال ساده برمی‌گردند: منابع سرور الان صرف چه چیزی می‌شود؟ مشکل این است که خروجی ابزارهای لینوکس در نگاه اول گمراه‌کننده است. رایج‌ترین نمونه‌اش این است که کاربر دستور free را اجرا می‌کند، می‌بیند رم «آزاد» تقریباً صفر است و نتیجه می‌گیرد سرور رم کم دارد؛ در حالی که لینوکس فقط رم بیکار را برای کش دیسک استفاده کرده است.

در این آموزش ابزارهای استاندارد را یکی‌یکی مرور می‌کنیم و یاد می‌گیریم هر عدد واقعاً چه معنایی دارد. همهٔ این ابزارها روی اوبونتو، دبیان، AlmaLinux و Rocky در دسترس‌اند و بیشترشان از قبل نصب هستند.

رم لینوکس چطور تقسیم می‌شود
usedحافظهٔ واقعی برنامه‌ها، دیتابیس و وب‌سرور
buff/cacheکش فایل‌ها؛ در صورت نیاز آزاد می‌شود
freeکاملاً بیکار؛ کوچک بودنش طبیعی است
availablefree به‌علاوهٔ بخش قابل‌آزادسازی کش؛ عدد اصلی
شکل ۱ در خروجی free، ستون available نشان می‌دهد برنامه‌ها واقعاً چقدر رم در اختیار دارند.

رم: دستور free و معنای واقعی ستون‌ها

free -h

خروجی دو ردیف اصلی دارد: Mem برای رم و Swap برای فضای Swap. ستون‌ها:

ستون معنی
total کل رم قابل‌استفادهٔ سیستم
used رمی که برنامه‌ها واقعاً مصرف کرده‌اند
free رمی که هیچ استفاده‌ای ندارد، حتی برای کش
buff/cache رمی که برای کش فایل‌ها استفاده شده و در صورت نیاز آزاد می‌شود
available تخمین رمی که برنامه‌های جدید بدون استفاده از Swap می‌توانند بگیرند

مهم‌ترین عدد، available است. لینوکس عمداً رم بیکار را برای کش فایل‌های دیسک به کار می‌برد تا خواندن دوباره‌شان سریع‌تر شود؛ این حافظه هر وقت برنامه‌ای لازمش داشته باشد آزاد می‌شود. پس free کوچک نگران‌کننده نیست؛ available کوچک و Swap در حال پر شدن نگران‌کننده است.

CPU و بار سیستم: load average

دستور uptime یا سطر اول top سه عدد به نام load average نشان می‌دهد؛ میانگین بار سیستم در یک، پنج و پانزده دقیقهٔ گذشته:

uptime
nproc

load average تقریباً یعنی «چند فرایند به‌طور میانگین در حال اجرا یا در صف انتظار برای CPU یا دیسک بوده‌اند». این عدد را همیشه با تعداد هسته‌ها (خروجی nproc) مقایسه کنید:

  • روی سرور دوهسته‌ای، load حدود دو یعنی هسته‌ها کاملاً مشغول‌اند اما صفی تشکیل نشده است.
  • load بالاتر از تعداد هسته‌ها یعنی کارها در صف می‌مانند و پاسخ‌دهی کند می‌شود.
  • اگر عدد یک‌دقیقه‌ای بسیار بالاتر از پانزده‌دقیقه‌ای است، بار تازه شروع شده؛ اگر برعکس است، رو به کاهش است.

یک نکتهٔ مهم: در لینوکس، فرایندهایی که منتظر دیسک‌اند هم در load حساب می‌شوند. پس load بالا با CPU کم‌مصرف معمولاً نشانهٔ کندی دیسک یا شبکهٔ ذخیره‌سازی است، نه کمبود CPU.

دستور top: نمای زنده

top

بخش بالای top خلاصهٔ سیستم است. سطر %Cpu(s) چند مقدار دارد که هرکدام داستانی می‌گویند:

  • us: زمان صرف‌شده برای برنامه‌های کاربر (برنامه، دیتابیس، وب‌سرور).
  • sy: زمان صرف‌شده در هستهٔ سیستم‌عامل.
  • id: زمان بیکار.
  • wa: زمان انتظار برای ورودی‌وخروجی دیسک؛ اگر بالاست، دیسک گلوگاه است.
  • st: زمان «دزدیده‌شده» (Steal)؛ یعنی هستهٔ مجازی شما منتظر سخت‌افزار فیزیکی بوده است. مقدار بالا و مداوم آن روی سرور مجازی یعنی میزبان شلوغ است.

میان‌برهای مفید داخل top: P مرتب‌سازی بر اساس CPU، M مرتب‌سازی بر اساس رم، 1 نمایش جداگانهٔ هر هسته، k ارسال سیگنال به یک فرایند و q خروج. ستون RES حافظهٔ واقعی هر فرایند در رم است و VIRT حافظهٔ مجازی آن که معمولاً بزرگ و گمراه‌کننده است.

root@server: ~
$ free -h        total   used   free  shared  buff/cache  availableMem:     ...     ...    ...     ...         ...        ...Swap:    ...     ...    ...$ uptime ... up ... days,  load average: ..., ..., ...$ ps aux --sort=-%mem | head -n 3USER  PID %CPU %MEM    VSZ   RSS ... COMMAND$ 
شکل ۲ سه دستور برای نمای سریع: رم با free، بار سیستم با uptime و پرمصرف‌ترین فرایندها با ps.

htop: نسخهٔ خواناتر

htop همان اطلاعات را رنگی، با نوار مصرف هر هسته و امکان اسکرول و جست‌وجو نشان می‌دهد:

sudo apt install -y htop
htop

کلیدهای کاربردی: F6 انتخاب ستون مرتب‌سازی، F5 نمای درختی (می‌بینید هر فرایند فرزند کدام برنامه است)، F3 جست‌وجو، F4 فیلتر و F9 ارسال سیگنال. نمای درختی به‌خصوص برای PHP-FPM، Gunicorn یا Apache که چندین فرایند فرزند دارند مفید است؛ چون مصرف واقعی هر برنامه مجموع فرزندان آن است.

ps: فهرست مرتب پرمصرف‌ها

برای گزارش‌گیری یا اسکریپت، ps مناسب‌تر از ابزارهای تعاملی است:

# ده فرایند پرمصرف از نظر رم
ps aux --sort=-%mem | head -n 11
# ده فرایند پرمصرف از نظر CPU
ps aux --sort=-%cpu | head -n 11
# مجموع رم مصرفی یک برنامه با همهٔ فرایندهایش (مگابایت)
ps -C php-fpm8.3 -o rss= | awk '{s+=$1} END {print s/1024 " MB"}'

vmstat: روند در طول زمان

top یک لحظه را نشان می‌دهد؛ vmstat چند نمونه پشت سر هم می‌گیرد و روند را آشکار می‌کند:

vmstat 2 10

ستون‌های کلیدی: r تعداد فرایندهای منتظر CPU، b فرایندهای مسدود در انتظار دیسک، si و so جابه‌جایی با Swap و wa و st مثل top. اگر si و so مداوم غیرصفر باشند، سرور رم کم دارد و در حال جابه‌جایی پیوسته با Swap است.

برای دیسک هم ابزار iostat -x 2 از بستهٔ sysstat نشان می‌دهد دیسک چقدر مشغول است و درخواست‌ها چقدر منتظر می‌مانند.

تشخیص گلوگاه از روی اعداد
  1. us بالا

    یک برنامه یا کوئری CPU را مصرف می‌کند؛ فرایند صدر top را بررسی کنید.

  2. available پایین و si/so

    کمبود رم؛ مصرف برنامه‌ها را کم کنید یا رم را ارتقا دهید.

  3. wa بالا

    دیسک گلوگاه است؛ کوئری‌ها، لاگ‌ها و بکاپ‌ها را بررسی کنید.

  4. st بالا

    میزبان فیزیکی شلوغ است؛ با ارائه‌دهنده تماس بگیرید.

شکل ۳ هر ستون top و vmstat به یک نوع گلوگاه اشاره می‌کند.

ثبت تاریخچه: وقتی مشکل در غیاب شما رخ می‌دهد

ابزارهای بالا وضعیت همین لحظه را نشان می‌دهند. اما بسیاری از مشکلات، مثل کندی ساعت سه بامداد یا قطعی کوتاه در اوج بازدید، وقتی رخ می‌دهند که شما پای ترمینال نیستید. برای این موارد به ابزاری نیاز دارید که مصرف منابع را در طول زمان ثبت کند.

ساده‌ترین گزینه بستهٔ sysstat است. پس از نصب و فعال‌سازی، هر چند دقیقه یک‌بار آمار CPU، رم، دیسک و شبکه را ذخیره می‌کند و با دستور sar می‌توانید گذشته را مرور کنید؛ مثلاً sar -u برای CPU امروز و sar -r برای رم. برای دیدن روز قبل، فایل آمار همان روز را با گزینهٔ -f به sar بدهید.

اگر نمودار و داشبورد می‌خواهید، ابزارهایی مثل Netdata نمای زنده و تاریخچهٔ کوتاه‌مدت را در مرورگر نشان می‌دهند. برای چند سرور، ترکیب Prometheus و Grafana استاندارد رایج است. هر ابزاری انتخاب کنید، مهم این است که پیش از بروز مشکل نصب شده باشد؛ تاریخچه‌ای که ثبت نشده، بعداً قابل بازسازی نیست.

یک عادت ساده هم کمک زیادی می‌کند: هر بار که سرور در حالت عادی است، یک بار خروجی free، uptime و ps را ببینید و به خاطر بسپارید. وقتی بدانید حالت «سالم» سرورتان چه شکلی است، تشخیص حالت غیرعادی بسیار سریع‌تر می‌شود.

از اعداد تا تصمیم

با این ابزارها می‌توانید سناریوهای رایج را تشخیص دهید:

  • CPU بالا در us و یک فرایند مشخص در صدر top: برنامه یا کوئری خاصی پرمصرف است؛ بهینه‌سازی یا ارتقای CPU. روند کامل در مقالهٔ رفع مصرف بالای CPU آمده است.
  • available پایین، Swap در حال پر شدن، si/so غیرصفر: کمبود رم. مقالهٔ کمبود رم و خطای Out of Memory و آموزش افزایش Swap را ببینید.
  • wa بالا، load بالا، CPU کم‌مصرف: گلوگاه دیسک؛ کوئری‌های سنگین دیتابیس، لاگ‌نویسی زیاد یا بکاپ در حال اجرا.
  • st بالا و مداوم: منابع میزبان فیزیکی شلوغ است؛ با ارائه‌دهنده در میان بگذارید یا لوکیشن و پلن دیگری را امتحان کنید.

اگر می‌خواهید پیش از خرید بدانید هر پلن چه توانی دارد، ابزارهای بنچمارک سرور کمک می‌کنند و برای تخمین منابع لازم، راهنمای انتخاب رم و CPU را بخوانید. دستورهای این مقاله در کنار دستورات پرکاربرد لینوکس جعبه‌ابزار اصلی هر مدیر سرور است.

سؤالات متداول

چرا free نشان می‌دهد رم آزاد تقریباً صفر است؟

لینوکس رم بیکار را برای کش فایل‌ها استفاده می‌کند. این حافظه در ستون buff/cache است و هر وقت برنامه‌ای لازم داشته باشد آزاد می‌شود. ستون available را ملاک قرار دهید.

load average چند خطرناک است؟

باید آن را با تعداد هسته‌ها مقایسه کنید. اگر load به‌طور مداوم بیشتر از تعداد هسته‌ها باشد، کارها در صف می‌مانند و سرور کند می‌شود. load بالا با CPU کم‌مصرف معمولاً نشان‌دهندهٔ کندی دیسک است.

تفاوت top و htop چیست؟

هر دو فرایندها و مصرف منابع را زنده نشان می‌دهند. htop رنگی است، نوار مصرف هر هسته، نمای درختی و جست‌وجو دارد و با ماوس هم کار می‌کند؛ top همه‌جا از قبل نصب است.

مقدار st یا steal در top چیست؟

زمانی است که هستهٔ مجازی سرور شما آمادهٔ اجرا بوده اما سخت‌افزار فیزیکی در اختیار ماشین‌های دیگر بوده است. مقدار کم و گاه‌به‌گاه طبیعی است، اما مقدار بالا و مداوم یعنی میزبان شلوغ است.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.